C语言Chomp游戏CheckMove函数分支异常问题求助
问题原因及解决方案
核心问题
你遇到的问题根源有两个:
CheckMove函数直接修改了传入的move数组:函数里执行move[0] -= 1和move[1] -= 1时,直接把输入的1-based坐标改成了0-based,破坏了原数组的值。主循环里多次调用CheckMove(move),第一次调用后move已经变成0-based,后续调用时move[0]和move[1]不再满足>=1的条件,直接进入else分支返回3。- 主循环重复调用
CheckMove:每次判断分支都重新调用函数,而不是复用第一次的返回结果,进一步放大了第一个问题的影响。
修复步骤
1. 修改CheckMove函数,避免破坏原move数组
创建临时变量存储转换后的索引,不直接修改传入的move参数:
int CheckMove(int move[2]) { int check = 99; // 验证输入的1-based坐标合法性 if ((move[0] >= 1 && move[0] < 5) && (move[1] >= 1 && move[1] <= 10)) { // 用临时变量转换为0-based索引,保留原move数组的值 int row = move[0] - 1; int col = move[1] - 1; // 检查棋盘状态 if (board[row][col] == 'Z') { check = 1; } else if(board[row][col] == 'X') { check = 2; } else { check = 0; } } else { check = 3; } return check; }
2. 主循环中复用CheckMove的返回结果
只调用一次CheckMove并保存结果,后续分支判断都使用这个变量,避免重复调用导致的参数异常:
while(1) { PrintBoard(); player = (player == 2)? 1 : 2; while(1) { GetMove(player, move); // 仅调用一次CheckMove,保存结果用于后续判断 int moveResult = CheckMove(move); if (moveResult == 0) { // 如果UpdateBoard需要0-based坐标,这里要转换后传入 int updateRow = move[0]-1; int updateCol = move[1]-1; UpdateBoard(updateRow, updateCol); break; } else if (moveResult == 1) { printf("\nAlready taken. Please try again! (row col): "); continue; } else if (moveResult == 2) { printf("\nYou lost!\n"); return 0; } else if (moveResult == 3) { printf("\nIllegal move. Try again! (row col): "); continue; } } }
额外提示
如果UpdateBoard原本依赖CheckMove修改后的move数组,现在需要手动转换坐标后传入,确保逻辑一致。
内容的提问来源于stack exchange,提问作者Dimitri Mikhalev
相关产品推荐
相关产品推荐

