使用C语言从零实现简易三子棋游戏

周予安
周予安
发布时间:2026-10-16 | 4人浏览过
原创

本文介绍如何在本地环境利用C语言标准库编写一个三子棋游戏,涵盖核心数据结构定义、用户输入校验、随机落子逻辑及完整的胜负判定规则。

项目开发目标与原理

三子棋(Tic-Tac-Toe)是一种经典的纸笔游戏。在计算机程序中,我们主要需要解决以下几个问题:

  • 状态管理:使用二维字符数组存储棋盘状态。
  • 交互逻辑:处理玩家输入的坐标有效性,并进行简单的随机数生成让“电脑”进行下棋操作。
  • 规则判定:逐行、逐列、对角线检查是否有连续三个相同符号,以及判断棋盘是否已满导致平局。

准备条件

开发该程序需要一个支持标准C语言的编译器(如GCC或Visual Studio)。代码将包含两个主要模块:

  1. game.h:声明函数接口及棋盘大小常量。
  2. test.c 和 game.c:分别负责主菜单流程控制以及具体的游戏逻辑实现。

第1步:构建头文件与常量定义

首先创建头文件,用于统一变量命名和函数原型。这里定义行列均为3的网格。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

// 棋盘规格
#define ROW 3
#define COL 3

// 函数原型声明
void init_board(char board[ROW][COL], int row, int col);
void display_board(char board[ROW][COL], int row, int col);
void player_game(char board[ROW][COL], int row, int col);
void computer_game(char board[ROW][COL], int row, int col);
char is_win(char board[ROW][COL], int row, int col);

第2步:初始化与渲染棋盘界面

为了让程序运行前呈现整洁的状态,需要将二维数组全部初始化为空格字符 ' '。打印时通过循环配合分隔符,模拟出表格效果。

// 初始化棋盘
void init_board(char board[ROW][COL], int row, int col) {
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            board[i][j] = ' ';
        }
    }
}

// 打印当前棋盘状态
void display_board(char board[ROW][COL], int row, int col) {
    for (int i = 0; i < row; i++) {
        // 打印棋子行
        for (int j = 0; j < col; j++) {
            printf(" %c ", board[i][j]);
            if (j < col - 1) printf("|");
        }
        printf("\n");
        // 打印分割线
        if (i < row - 1) {
            for (int k = 0; k < col; k++) {
                printf("---");
                if (k < col - 1) printf("|");
            }
        }
        printf("\n");
    }
}

第3步:玩家与电脑的下棋逻辑

玩家端需要接收输入并判断位置是否已被占用;电脑端则需要不断生成随机坐标直到找到空位。

// 玩家输入坐标
void player_game(char board[ROW][COL], int row, int col) {
    int x, y;
    while (1) {
        printf("请输入你要落子的坐标(>:): ");
        scanf("%d %d", &x, &y);
        // 坐标范围校验 (1-3)
        if (x >= 1 && x <= row && y >= 1 && y <= col) {
            // 转换为数组下标 (0-2) 并判空
            if (board[x - 1][y - 1] == ' ') {
                board[x - 1][y - 1] = '*';
                break; // 成功落子退出循环
            } else {
                printf("坐标已被占用!\n");
            }
        } else {
            printf("非法坐标,请重新输入!\n");
        }
    }
}

// 电脑随机落子
void computer_game(char board[ROW][COL], int row, int col) {
    printf("电脑正在思考...\n");
    while (1) {
        int x = rand() % row;
        int y = rand() % col;
        if (board[x][y] == ' ') {
            board[x][y] = '#';
            break;
        }
    }
}

第4步:执行游戏主循环与控制流

在 game() 函数中,按照“玩家 -> 检测 -> 电脑 -> 检测”的顺序交替进行。检测到胜负后跳出循环。随后在主函数中提供重启选项。”

void game() {
    char ret = 0;
    char board[ROW][COL];
    init_board(board, ROW, COL);
    display_board(board, ROW, COL);

    while (1) {
        // 玩家回合
        player_game(board, ROW, COL);
        display_board(board, ROW, COL);
        ret = is_win(board, ROW, COL);
        if (ret != ' ') break;

        // 电脑回合
        computer_game(board, ROW, COL);
        display_board(board, ROW, COL);
        ret = is_win(board, ROW, COL);
        if (ret != ' ') break;
    }

    if (ret == '*') printf("恭喜玩家胜利!\n");
    else if (ret == '#') printf("电脑胜利!\n");
    else printf("平局\n");
}

效果展示

编译并运行程序后,可以看到文本界面的交互过程。以下是游戏运行时的截图示例:

完成验证

你可以尝试以下场景来验证代码的正确性:

  1. 边界测试:输入超出范围的数字(如4),观察系统是否提示重新输入。
  2. 冲突测试:在同一格连续点击两次,观察第二次是否会报错。
  3. 胜负判定:故意填满一行,确认是否能迅速结束游戏并弹出赢家消息。

简要总结

通过这个项目,你不仅实现了基础的二维数组操作,还掌握了如何拆分模块化函数以及处理复杂的分支判断逻辑。以上就是基于C语言实现简易三子棋游戏的详细内容,更多关于C语言入门实践的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表