C++井字棋游戏checkWinner函数无法正常判定胜者问题求助
C++井字棋胜负判定失效问题修复
问题根源
- 主函数中未实际调用
checkwinner函数,胜负判定逻辑完全没有执行 checkwinner的gwinner参数为值传递,函数内部修改无法同步到主函数的变量- 胜负判定逻辑未排除初始占位符
*,空行/空列会被误判,同时判定获胜后未给gwinner赋值对应玩家标识 - 主循环固定执行4轮,中途有玩家获胜也不会终止
playerChoice函数遇到玩家选择已占用格子时仅提示错误,未要求重选,该轮操作直接作废
修复后完整代码
#include <iostream> #include <string> using namespace std; const int ROWS = 3; const int COLS = 3; void showBoard(const char[][COLS], int); void playerChoice(char[][COLS], char); // 修改gwinner为引用传递 bool checkwinner(const char[][COLS], string&); int main() { char board[ROWS][COLS] = { { '*', '*', '*' }, { '*', '*', '*' }, { '*', '*', '*' } }; string gwinner = " "; showBoard(board, 3); bool gameOver = false; // 改固定循环为胜负判定终止的循环 for (int i = 0; i < 5 && !gameOver; i++) { playerChoice(board, 'X'); showBoard(board, 3); // 下完X就判定胜负 if (checkwinner(board, gwinner)) { gameOver = true; break; } if(i ==4) break; // 9个格子下满直接结束,X下第五次就满了 playerChoice(board, 'O'); showBoard(board, 3); // 下完O判定胜负 if (checkwinner(board, gwinner)) { gameOver = true; break; } } cout << "The winner is: " << gwinner; return 0; } void showBoard(const char arr[][COLS], int SIZE) { for (int row = 0; row < SIZE; row++) { for (int col = 0; col < SIZE; col++) cout << '|' << arr[row][col]; cout << '|' << endl; } } void playerChoice(char arr[][COLS], char name) { int row, columns; // 删掉没用的局部board变量 while(true) { cout << "What row would you like?\n"; cout << "Row: "; cin >> row; while (row < 1 || row > 3) { cout << "Error please pick a row between 1 and 3.\n"; cout << "Row: "; cin >> row; cout << endl; } cout << "What column would you like?\n"; cout << "Column: "; cin >> columns; while (columns < 1 || columns > 3) { cout << "Error,please pick a column between 1 and 3.\n"; cout << "Column: "; cin >> columns; cout << endl; } if (arr[row - 1][columns - 1] == '*') { arr[row - 1][columns - 1] = name; break; } else { cout << "This space is occupied.\n"; cout << "Please select again\n"; } } } bool checkwinner(const char arr[][COLS], string& gwinner) { bool winner = false; char winSign = '*'; // 检查行 for(int i=0;i<3;i++){ if(arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != '*'){ winner = true; winSign = arr[i][0]; break; } } // 检查列 if(!winner){ for(int i=0;i<3;i++){ if(arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != '*'){ winner = true; winSign = arr[0][i]; break; } } } // 检查对角线 if(!winner){ if(arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != '*'){ winner = true; winSign = arr[0][0]; } else if(arr[2][0] == arr[1][1] && arr[1][1] == arr[0][2] && arr[2][0] != '*'){ winner = true; winSign = arr[2][0]; } } if(winner){ gwinner = string(1, winSign); } else { // 判断是否平局 bool isFull = true; for(int i=0;i<3;i++){ for(int j=0;j<3;j++){ if(arr[i][j] == '*'){ isFull = false; break; } } if(!isFull) break; } if(isFull){ gwinner = "It's a tie! "; } } return winner; }
内容的提问来源于stack exchange,提问作者MARRSVISTER
相关产品推荐
相关产品推荐

