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

如何解决C语言井字棋游戏中数组无法重置的问题?

井字棋游戏数组重置失败问题解决

你的核心问题在于reset函数的逻辑错误——你把数组元素设为了ASCII值为0的空字符,而不是恢复成初始的'1'到'9'字符,导致重新游戏时棋盘显示异常,看起来像是没重置。另外你的checkWin函数里的平局判断条件完全无效,这也会影响游戏流程。

问题1:reset函数错误

原reset函数把space[i][j]设为0,对应不可见的空字符,而初始棋盘是数字字符'1'-'9',正确的重置应该恢复这些字符。修正后的reset函数:

void reset(){
    int num = 1;
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            space[i][j] = '0' + num; // 把数字转换成对应ASCII字符
            num++;
        }
    }
}

问题2:checkWin函数平局判断完全无效

原代码里的平局判断条件space[0][0] != space[0][0] && ...永远为假,因为一个值不可能不等于自身。正确的平局判断应该检查所有格子都已被占据(即不是初始的数字字符):

int checkWin(){
    // 保留原有胜负判断逻辑
    if (space[0][0] == space[0][1] && space[0][1] == space[0][2])
        return 1;
    else if (space[1][0] == space[1][1] && space[1][1] == space[1][2])
        return 1;
    else if (space[2][0] == space[2][1] && space[2][1] == space[2][2])
        return 1;
    else if (space[0][0] == space[1][0] && space[1][0] == space[2][0])
        return 1;
    else if (space[0][1] == space[1][1] && space[1][1] == space[2][1])
        return 1;
    else if (space[0][2] == space[1][2] && space[1][2] == space[2][2])
        return 1;
    else if (space[0][0] == space[1][1] && space[1][1] == space[2][2])
        return 1;
    else if (space[0][2] == space[1][1] && space[1][1] == space[2][0])
        return 1;
    // 修正平局判断:检查所有格子都不是数字字符
    else if ( (space[0][0] < '1' || space[0][0] > '9') &&
              (space[0][1] < '1' || space[0][1] > '9') &&
              (space[0][2] < '1' || space[0][2] > '9') &&
              (space[1][0] < '1' || space[1][0] > '9') &&
              (space[1][1] < '1' || space[1][1] > '9') &&
              (space[1][2] < '1' || space[1][2] > '9') &&
              (space[2][0] < '1' || space[2][0] > '9') &&
              (space[2][1] < '1' || space[2][1] > '9') &&
              (space[2][2] < '1' || space[2][2] > '9') )
        return 0;
    else
        return -1;
}

额外小问题:main函数循环条件

原main函数的while(choice != 0)逻辑不合理,因为菜单里没有0选项,改成while(1)让菜单循环一直运行,直到用户选择退出:

int main(){
    int choice = -1;
    do{
        printf("\n\n\n\n\n\n\n\t\t\t  ================\n");
        printf("\t\t\t     Tic Tac Toe\n");
        printf("\t\t\t  ================\n");
        printf("\t\t     -----------Menu-----------\n\n");
        printf("\t\t     1. Play\n");
        printf("\t\t     2. Exit\n");
        scanf("%d", &choice);
        switch(choice){
            case 1: game();
                break;
            case 2: printf("Goodbye!!");
                exit(0);
                break;
            default: printf(".......Wrong Key !.......Try Again!......");
                break;
        }
    }while(1); // 无限循环,直到用户选择退出
}

完整修正后代码

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

char space[3][3] = {
    {'1','2','3'},
    {'4','5','6'},
    {'7','8','9'}
};

void board();
int checkWin();
int game();
void reset();

int main(){
    int choice = -1;
    do{
        printf("\n\n\n\n\n\n\n\t\t\t  ================\n");
        printf("\t\t\t     Tic Tac Toe\n");
        printf("\t\t\t  ================\n");
        printf("\t\t     -----------Menu-----------\n\n");
        printf("\t\t     1. Play\n");
        printf("\t\t     2. Exit\n");
        scanf("%d", &choice);
        switch(choice){
            case 1: game();
                break;
            case 2: printf("Goodbye!!");
                exit(0);
                break;
            default: printf(".......Wrong Key !.......Try Again!......");
                break;
        }
    }while(1);
}

int game(){
    int player = 1, i, choice;
    char mark;
    
    do
    {
        system("cls");
        board();
        player = (player % 2) ? 1 : 2;

        printf("Player %d, enter a number:  ", player);
        scanf("%d", &choice);

        mark = (player == 1) ? 'X' : 'O';

        if (choice == 1)
            space[0][0] = mark;
        else if (choice == 2)
            space[0][1] = mark;
        else if (choice == 3)
            space[0][2] = mark;
        else if (choice == 4)
            space[1][0] = mark;
        else if (choice == 5)
            space[1][1] = mark;
        else if (choice == 6)
            space[1][2] = mark;
        else if (choice == 7)
            space[2][0] = mark;
        else if (choice == 8)
            space[2][1] = mark;
        else if (choice == 9)
            space[2][2] = mark;
        else
        {
            printf("Invalid move ");
            player--;
            getch();
        }
        i = checkWin();
        player++;
    }while (i == -1);
    
    board();
    reset();
    
    if (i == 1)
        printf("==>\aPlayer %d win \n\n", --player);
    else
        printf("==>\aGame draw\n\n");
    
    getch();
    return 0;
}

int checkWin(){
    if (space[0][0] == space[0][1] && space[0][1] == space[0][2])
        return 1;
    else if (space[1][0] == space[1][1] && space[1][1] == space[1][2])
        return 1;
    else if (space[2][0] == space[2][1] && space[2][1] == space[2][2])
        return 1;
    else if (space[0][0] == space[1][0] && space[1][0] == space[2][0])
        return 1;
    else if (space[0][1] == space[1][1] && space[1][1] == space[2][1])
        return 1;
    else if (space[0][2] == space[1][2] && space[1][2] == space[2][2])
        return 1;
    else if (space[0][0] == space[1][1] && space[1][1] == space[2][2])
        return 1;
    else if (space[0][2] == space[1][1] && space[1][1] == space[2][0])
        return 1;
    // 修正平局判断
    else if ( (space[0][0] < '1' || space[0][0] > '9') &&
              (space[0][1] < '1' || space[0][1] > '9') &&
              (space[0][2] < '1' || space[0][2] > '9') &&
              (space[1][0] < '1' || space[1][0] > '9') &&
              (space[1][1] < '1' || space[1][1] > '9') &&
              (space[1][2] < '1' || space[1][2] > '9') &&
              (space[2][0] < '1' || space[2][0] > '9') &&
              (space[2][1] < '1' || space[2][1] > '9') &&
              (space[2][2] < '1' || space[2][2] > '9') )
        return 0;
    else
        return -1;
}

void reset(){
    int num = 1;
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            space[i][j] = '0' + num;
            num++;
        }
    }
}

void board(){
    system("cls");
    printf("\n\n\tTic Tac Toe\n\n");
    printf("Player 1 (X)  -  Player 2 (O)\n\n\n");

    printf("     |     |     \n");
    printf("  %c  |  %c  |  %c \n", space[0][0], space[0][1], space[0][2]);
    printf("_____|_____|_____\n");
    printf("     |     |     \n");
    printf("  %c  |  %c  |  %c \n", space[1][0], space[1][1], space[1][2]);
    printf("_____|_____|_____\n");
    printf("     |     |     \n");
    printf("  %c  |  %c  |  %c \n", space[2][0], space[2][1], space[2][2]);
    printf("     |     |     \n\n");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:10:37