如何缩短3D井字棋C++代码中冗长的switch语句
代码优化方案
优化思路
- 第一步:替换零散的square成员变量为数组
你当前把27个棋盘格子分别定义成了独立的成员变量(square1square9、squareA1A9、squareB1~B9),这是导致switch语句冗长的核心原因。你可以把这些格子统一存为一个数组成员,比如在D3Board类的定义里把原来的27个独立变量替换成:
// 假设你的格子类是Square,这里定义长度为28的数组,下标1~27对应你的selection取值,不用做偏移换算 Square squares[28];
初始化的时候原来给square1赋值的逻辑改成给squares[1]赋值,squareA1对应squares[10],squareB1对应squares[19]即可,原有逻辑不需要额外调整。
- 第二步:重构square_choose方法,删除冗余switch
替换成数组之后,你只需要先做参数合法性校验,再根据player_Choice调用对应方法即可,整段代码可以压缩到10行以内:
bool D3Board::square_choose(bool player_Choice, int selection){ // 先校验selection取值合法性 if (selection < 1 || selection > 27) { return false; } // 直接取对应下标格子,判断调用玩家还是电脑落子方法 if (player_Choice) { return squares[selection].player_Choice(); } else { return squares[selection].comp_Choice(); } }
可选进阶优化
如果你想进一步消除if分支判断,也可以用C++成员函数指针实现:
bool D3Board::square_choose(bool player_Choice, int selection){ if (selection < 1 || selection > 27) return false; // 定义成员函数指针类型 using ChooseFunc = bool (Square::*)(); ChooseFunc func = player_Choice ? &Square::player_Choice : &Square::comp_Choice; return (squares[selection].*func)(); }
这种优化方案不仅代码量压缩了90%以上,后续如果要调整格子逻辑也只需要修改数组相关逻辑,不用逐个修改case分支,可维护性提升非常明显。
内容的提问来源于stack exchange,提问作者galapagos
相关产品推荐
相关产品推荐

