You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:54:03