C++实现井字棋棋盘填满无胜负仍不停止运行该如何解决?
C++井字棋平局无法终止问题修复方案
问题根因
- 当前
checkWinner函数平局逻辑错误:仅判断无玩家获胜就赋值平局提示,未校验棋盘是否填满,且平局场景返回false,无法触发主循环跳出 - 主函数无有效循环终止条件:
counter变量初始化后从未更新,循环永远成立,棋盘填满后仍会要求用户输入 - 冗余代码:全局声明的
board数组和main函数内的局部board数组重名,属于无用代码可直接删除
修复步骤
1. 修改checkWinner函数,增加平局校验逻辑
在函数开头新增棋盘填满判断,仅当无玩家获胜且棋盘全满时判定为平局,平局场景返回true触发循环跳出,同时把原函数内的获胜提示输出改为给gwinner赋值,避免重复打印内容:
bool checkWinner(char arr[][COLS], string& gwinner) { bool winner = false; // 判断行获胜 if ((arr[0][0] == arr[0][1]) && (arr[0][1] == arr[0][2]) && (arr[0][1] != '*')) { winner = true; gwinner = "The winner is: " + string(1, arr[0][0]); } else if ((arr[1][0] == arr[1][1]) && (arr[1][1] == arr[1][2]) && (arr[1][1] != '*')) { winner = true; gwinner = "The winner is: " + string(1, arr[1][0]); } else if ((arr[2][0] == arr[2][1]) && (arr[2][1] == arr[2][2]) && (arr[2][1] != '*')) { winner = true; gwinner = "The winner is: " + string(1, arr[2][0]); } // 判断列获胜 else if ((arr[0][0] == arr[1][0]) && (arr[1][0] == arr[2][0]) && (arr[1][0] != '*')) { winner = true; gwinner = "The winner is: " + string(1, arr[0][0]); } else if ((arr[0][1] == arr[1][1]) && (arr[1][1] == arr[2][1]) && (arr[1][1] != '*')) { winner = true; gwinner = "The winner is: " + string(1, arr[0][1]); } else if ((arr[0][2] == arr[1][2]) && (arr[1][2] == arr[2][2]) && (arr[1][2] != '*')) { winner = true; gwinner = "The winner is: " + string(1, arr[0][2]); } // 判断对角线获胜 else if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[1][1] != '*')) { winner = true; gwinner = "The winner is: " + string(1, arr[0][0]); } else if ((arr[2][0] == arr[1][1]) && (arr[1][1] == arr[0][2]) && (arr[1][1] != '*')) { winner = true; gwinner = "The winner is: " + string(1, arr[2][0]); } // 无玩家获胜时判断是否平局 else { bool isFull = true; for(int i=0; i<ROWS; i++){ for(int j=0; j<COLS; j++){ if(arr[i][j] == '*'){ isFull = false; break; } } if(!isFull) break; } if(isFull){ gwinner = "It's a Tie."; winner = true; }else{ winner = false; } } return winner; }
2. 调整main函数逻辑
删除全局的char board[ROWS][COLS]冗余定义,补充首次落子后的获胜校验,避免边界异常:
int main() { char board[ROWS][COLS] = { { '*', '*', '*' }, { '*', '*', '*' }, { '*', '*', '*' } }; string gwinner = " "; bool winner; showBoard(board, 3); playerChoice(board, 'X'); showBoard(board, 3); // 首次落子后校验(覆盖极端边界场景) if (checkWinner(board, gwinner)){ cout << gwinner; return 0; } while (true) { playerChoice(board, 'O'); showBoard(board, 3); if (checkWinner(board, gwinner)) break; playerChoice(board, 'X'); showBoard(board, 3); if (checkWinner(board, gwinner)) break; } cout << gwinner; return 0; }
验证说明
修改后棋盘填满无玩家获胜时,checkWinner会返回true跳出循环,同时输出平局提示,不会再要求用户继续输入。
内容的提问来源于stack exchange,提问作者MARRSVISTER
相关产品推荐
相关产品推荐

