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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:45:03