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

C语言井字棋输入改造:将行列输入改为1-9数字输入

解决方案:将井字棋输入改为1-9数字对应位置

核心修改点

  • 数字转行列逻辑:无需复杂的switch case,用简单数学计算即可完成转换:
    对于输入的数字num(1-9),先减1得到0-8的索引,然后:
    int index = num - 1;
    int row = index / 3;
    int col = index % 3;
    
  • 输入流程调整:替换原来的行列输入,改为读取单个数字,并验证其范围是否在1-9内
  • 用户提示优化:增加位置对应说明,让玩家清晰了解数字对应的棋盘位置

修改后的完整代码

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

// 初始化空棋盘
void initializeBoard(char board[3][3]) {
    for(int i=0; i<3;i++){
        for(int j=0; j < 3;j++){
            board[i][j]= ' ';
        }
    }
}

// 打印棋盘
void printBoard(char board[3][3]){
    printf("\n");
    printf(" %c | %c | %c \n",board[0][0],board[0][1],board[0][2]);
    printf("---|---|---\n");
    printf(" %c | %c | %c \n",board[1][0],board[1][1],board[1][2]);
    printf("---|---|---\n");
    printf(" %c | %c | %c \n",board[2][0],board[2][1],board[2][2]);
    printf("\n");
}

// 检查玩家是否获胜
int checkWin(char board[3][3], char player) {
    // 检查行、列、对角线
    for(int i = 0; i<3;i++){
        if(board[i][0]==player && board[i][1]==player && board[i][2]==player) {
            return 1; // 玩家获胜
        }
        if (board[0][i]==player && board[1][i] == player && board[2][i] == player) {
            return 1; // 玩家获胜
        }
    }
    if (board[0][0]==player && board[1][1] == player && board[2][2] == player) {
        return 1; // 玩家获胜
    }
    if (board[0][2]==player && board[1][1] == player && board[2][0] == player) {
        return 1; // 玩家获胜
    }
    return 0; // 无胜者
}

// 检查棋盘是否已满(平局)
int isBoardFull(char board[3][3]) {
    for (int i=0; i<3;i++) {
        for (int j= 0; j<3;j++) {
            if (board[i][j] == ' ') {
                return 0; // 棋盘未满
            }
        }
    }
    return 1; // 棋盘已满
}

// 电脑随机落子
void computerMove(char board[3][3],char computer) {
    int row, col;
    do{
        row =rand() % 3; // 生成0-2的随机行
        col =rand() % 3; // 生成0-2的随机列
    } while (board[row][col] !=' ');// 直到找到空位置
    board[row][col]=computer;
    printf("电脑的落子:\n");
    printBoard(board);
}

int main() {
    char board[3][3];
    char playerName[10];
    char player = 'X';
    char computer = 'O';

    // 初始化随机数生成器
    srand(time(NULL));

    // 初始化棋盘
    initializeBoard(board);

    // 获取玩家姓名
    printf("请输入你的名字: ");
    fflush(stdout);
    scanf("%s", playerName);
    printf(" %s,你将和电脑对战井字棋,祝你好运!\n", playerName);
    // 打印位置对应说明
    printf("位置对应关系:\n 1 | 2 | 3 \n---|---|---\n 4 | 5 | 6 \n---|---|---\n 7 | 8 | 9 \n");

    // 游戏主循环
    while (1) {
        int num, row, col;

        // 打印当前棋盘
        printf("%s的回合:\n", playerName);
        printBoard(board);

        // 获取玩家输入的数字
        printf("请输入1-9之间的数字选择落子位置: ");
        scanf("%d", &num);

        // 验证输入范围并转换为行列
        if (num >=1 && num <=9) {
            int index = num -1;
            row = index /3;
            col = index %3;

            // 检查位置是否为空
            if (board[row][col] == ' ') {
                board[row][col] = player;

                // 检查玩家是否获胜
                if (checkWin(board, player)) {
                    printf("恭喜你,%s!你赢了!\n", playerName);
                    break;
                }

                // 检查是否平局
                if (isBoardFull(board)) {
                    printf("平局!\n");
                    break;
                }

                // 电脑落子
                computerMove(board, computer);

                // 检查电脑是否获胜
                if (checkWin(board, computer)) {
                    printf("电脑赢了!%s,下次加油!\n", playerName);
                    break;
                }

                // 检查是否平局
                if (isBoardFull(board)) {
                    printf("平局!\n");
                    break;
                }
            } else {
                printf("该位置已被占用,请重新选择!\n");
            }
        } else {
            printf("输入无效,请输入1-9之间的数字!\n");
        }
    }

    return 0;
}

说明

  • 用数学计算替代switch case,代码更简洁且易于维护
  • 增加了位置对应提示,玩家能直观理解每个数字对应的棋盘位置
  • 保留了原代码的所有核心功能(胜负判断、电脑随机落子、平局检测),仅修改了输入逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:11:04