C语言中替代break语句的方案?跳棋游戏代码修改求助
跳棋游戏validateMove函数修改需求
我是编程新手,正在开发一款跳棋游戏。规则规定除非在switch-case语句中,否则不得使用break语句。我尝试用while循环改写了代码,但还需要修改validateMove函数的现有实现,求可行的替代方案。
原代码如下:
int validateMove(int x1 , int y1) { int a , b; printf( "Available coordinates to send the piece are: \n" ) ; a=1, b=1; while(board[x1-a][y1+b] == ' ') { if((x1-a)==-1 || (y1+b)==8) break; printf("%d%d , ", x1-a , y1+b); a++; b++; } a=1 , b=1; while(board[x1+a][y1-b] == ' ') { if((x1+a)==8 || (y1-b)==-1) break; printf("%d%d , ", x1+a, y1-b); a++; b++; } a=1 , b=1; while(board[x1+a][y1+b] == ' ') { if((x1+a)==8 || (y1+b)==8) break; printf("%d%d , ",x1+a, y1+b); a++; b++; } a=1; b=1; while(board[x1-a][y1-b] == ' ') { if((x1-a)==-1 || (y1-b)==-1) break; printf("%d%d , ", x1-a, y1-b); a++; b++; } }
替代方案:整合循环条件,移除break
核心思路是把原本放在if里的终止条件合并到while循环的判断表达式中,这样就能完全去掉break语句。另外,你这段代码四个方向的逻辑高度重复,可以提取成通用函数减少冗余,先看修改后的单方向逻辑,再看优化后的完整代码。
单方向修改示例(以第一个循环为例)
原本的循环把边界判断放在循环体内用break终止,现在把边界条件和棋盘空格判断合并:
a=1, b=1; while ((x1-a) != -1 && (y1+b) != 8 && board[x1-a][y1+b] == ' ') { printf("%d%d , ", x1-a , y1+b); a++; b++; }
这样循环会在越界或者遇到非空格时自动终止,不需要break。
完整优化后的validateMove函数
考虑到四个方向逻辑重复,我们可以写一个辅助函数来处理每个方向的遍历:
// 辅助函数:遍历指定方向的合法坐标并打印 void printValidMoves(int x1, int y1, int dx, int dy) { int x = x1 + dx; int y = y1 + dy; while (x >= 0 && x < 8 && y >=0 && y <8 && board[x][y] == ' ') { printf("%d%d , ", x, y); x += dx; y += dy; } } int validateMove(int x1 , int y1) { printf( "Available coordinates to send the piece are: \n" ) ; // 对应原代码的四个遍历方向 printValidMoves(x1, y1, -1, 1); // x减1,y加1 printValidMoves(x1, y1, 1, -1); // x加1,y减1 printValidMoves(x1, y1, 1, 1); // x加1,y加1 printValidMoves(x1, y1, -1, -1); // x减1,y减1 return 0; // 原函数声明返回int但无返回值,补充合理返回值避免编译警告 }
说明
- 辅助函数
printValidMoves通过参数dx和dy控制遍历方向,避免重复代码,后续维护更方便。 - 所有终止条件都整合到while的判断中,完全移除了break语句,符合规则要求。
- 补充了函数的返回值,解决原代码的编译隐患。
内容的提问来源于stack exchange,提问作者loochieeee
相关产品推荐
相关产品推荐

