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

C++井字棋游戏switch语句未执行,二维数组值无法修改求助

问题分析与修复方案

核心错误点

  • moveChoice函数未正确传递值:函数返回了玩家选择的数字,但main函数没有接收这个返回值,导致Choice变量始终是未初始化的垃圾值,switch自然无法正确匹配。
  • 玩家切换逻辑用了赋值而非比较:if (n=0)是赋值操作,会强制把n设为0,导致玩家永远在1和0之间错误切换,逻辑完全混乱。
  • switch语句不完整:只处理了case 1和case 2,输入其他数字时没有任何处理,自然看不到反应。
  • 移动验证后未处理无效情况:当位置已被占据时,仅输出提示,但程序仍会执行后续的grid赋值操作,导致错误覆盖或无效赋值。
  • grid赋值时机错误:无论移动是否有效,都会执行grid[n1][n2] = Player[n];,应该仅在移动有效时才更新棋盘。

修复后的完整代码

#include <iostream>

using namespace std;

int n = 0;
int Player[2] {1, 2};
int n1 = 0, n2 = 0;

void Display(int grid[][3], int row, int column)
{
    cout<<"Coordinates: \n";
    cout<<"1"<<" | "<< "2" <<" | "<< "3" <<"\n";
    cout<<"--|---|--\n";
    cout<<"4"<<" | "<< "5" <<" | "<< "6" <<"\n";
    cout<<"--|---|--\n";
    cout<<"7"<<" | "<< "8" <<" | "<< "9" <<"\n";
    
    cout<<"Current Moves: \n";
    cout<<grid[0][0]<<" | "<<grid[0][1]<<" | "<<grid[0][2]<<"\n";
    cout<<"--|---|--\n";
    cout<<grid[1][0]<<" | "<<grid[1][1]<<" | "<<grid[1][2]<<"\n";
    cout<<"--|---|--\n";
    cout<<grid[2][0]<<" | "<<grid[2][1]<<" | "<<grid[2][2]<<"\n";
}

int moveChoice()
{
    int Choice;
    cout<<"Player "<<Player[n]<<" please pick where to move. ";
    cin>>Choice;
    
    if (Choice < 1 || Choice > 9)
    {
        while (Choice < 1 || Choice > 9)
        {
            cout << "Invalid choice, please enter a new number: ";
            cin >> Choice;
        }
    }
    
    return Choice;
}

// 返回true表示移动有效,false无效
bool CheckMoveValid(int grid[][3], int Choice)
{
    switch (Choice)
    {
        case 1:
            if(grid[0][0] != 0)
            {
                cout<<"Invalid move, space already filled. Please try again.\n";
                return false;
            }
            else
            {
                n1 = 0;
                n2 = 0;
                return true;
            }
        case 2:
            if(grid[0][1] != 0)
            {
                cout<<"Invalid move, space already filled. Please try again.\n";
                return false;
            }
            else
            {
                n1 = 0;
                n2 = 1;
                return true;
            }
        case 3:
            if(grid[0][2] != 0)
            {
                cout<<"Invalid move, space already filled. Please try again.\n";
                return false;
            }
            else
            {
                n1 = 0;
                n2 = 2;
                return true;
            }
        case 4:
            if(grid[1][0] != 0)
            {
                cout<<"Invalid move, space already filled. Please try again.\n";
                return false;
            }
            else
            {
                n1 = 1;
                n2 = 0;
                return true;
            }
        case 5:
            if(grid[1][1] != 0)
            {
                cout<<"Invalid move, space already filled. Please try again.\n";
                return false;
            }
            else
            {
                n1 = 1;
                n2 = 1;
                return true;
            }
        case 6:
            if(grid[1][2] != 0)
            {
                cout<<"Invalid move, space already filled. Please try again.\n";
                return false;
            }
            else
            {
                n1 = 1;
                n2 = 2;
                return true;
            }
        case 7:
            if(grid[2][0] != 0)
            {
                cout<<"Invalid move, space already filled. Please try again.\n";
                return false;
            }
            else
            {
                n1 = 2;
                n2 = 0;
                return true;
            }
        case 8:
            if(grid[2][1] != 0)
            {
                cout<<"Invalid move, space already filled. Please try again.\n";
                return false;
            }
            else
            {
                n1 = 2;
                n2 = 1;
                return true;
            }
        case 9:
            if(grid[2][2] != 0)
            {
                cout<<"Invalid move, space already filled. Please try again.\n";
                return false;
            }
            else
            {
                n1 = 2;
                n2 = 2;
                return true;
            }
        default:
            return false;
    }
}

int main()
{
    int grid[3][3]={{0, 0, 0}, {0, 0, 0}, {0, 0, 0}};
    int Choice, CheckWin = 0;

    while (CheckWin < 1)
    {
        Display(grid, 3, 3);
        
        Choice = moveChoice();
        
        // 只有移动有效时才更新棋盘和切换玩家
        if(CheckMoveValid(grid, Choice))
        {
            grid[n1][n2] = Player[n];
            // 切换玩家
            n = (n == 0) ? 1 : 0;
        }
        
        // 后续需补充胜负判断逻辑,设置CheckWin为1结束循环
    }
    return 0;
}

额外说明

  • 重构了moveChoice函数,直接在函数内定义局部变量并返回,避免值传递的问题。
  • CheckMoveValid改为返回布尔值,标记移动是否有效,只有有效时才执行棋盘更新和玩家切换。
  • 补全了switch的所有case(1-9),确保所有输入都能被处理。
  • 玩家切换逻辑改用三元运算符,更简洁且避免赋值错误。

内容的提问来源于stack exchange,提问作者PenguinEntity

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:00:16