C语言实战:使用二维数组实现三子棋游戏

顾言
顾言
发布时间:2026-10-16| 6人浏览过
原创

三子棋(井字棋)是C语言学习中锻炼逻辑与数组操作的经典案例。本文通过二维数组构建3x3棋盘,详解初始化、人机交互、随机落子及全盘胜负判定逻辑,并提供包含完整控制流的C语言源码。

三子棋核心设计思路

三子棋的核心在于数据结构的存储与状态检测。整个游戏基于一个 3x3 的二维字符数组进行状态管理:空格代表空位,* 代表玩家棋子,# 代表电脑棋子。游戏流程主要包含三个关键模块:

第1步:棋盘初始化与显示

目的:建立游戏界面并清空数据。
原理:调用 InitBoard 函数将二维数组所有元素填充为空格。打印时利用循环遍历数组,在行与列之间插入分隔符以模拟网格效果。

第2步:玩家输入处理

入口:控制台输入。
动作:读取玩家输入的坐标 (x, y)。校验逻辑包括:
1. 坐标是否在有效范围 (1-3) 内;
2. 目标位置是否已被占用。验证通过后,将数组对应索引赋值为 *。

第3步:电脑随机落子与胜负判定

动作:电脑通过随机数生成器获取坐标,若该位置为空则落子 #。
胜负逻辑:编写专用检查函数 CheckBoard,按以下顺序穷举检查结果:
1. **赢**:检测所有行、列及对角线是否存在三连珠,返回对应的标记值。
2. **平局**:无赢家且棋盘已满。
3. **继续**:棋盘未满且无赢家,返回特定代码让主循环继续执行。

以下是游戏界面的逻辑展示:

C语言完整实现源码

以下为整合了菜单、初始化、人机交互及胜负判定的完整单文件代码。直接复制到编译器即可运行测试。

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

// 定义棋盘大小
#define ROW 3
#define COL 3

// 全局函数声明
void InitBoard(char board[ROW][COL], int row, int col);
void PrintBoard(char board[ROW][COL], int row, int col);
void PlayerMove(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
int CheckBoard(char board[ROW][COL], int row, int col);
void menu();

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

// 打印棋盘
void PrintBoard(char board[ROW][COL], int row, int col)
{
    int i = 0;
    for (i = 0; i < row; i++)
    {
        // 打印数据行
        int j = 0;
        for (j = 0; j < col; j++)
        {
            if (j == col - 1)
            {
                printf(" %c ", board[i][j]);
            }
            else
            {
                printf(" %c |", board[i][j]);
            }
        }
        printf("\n");
        // 打印分割行
        if (i < row - 1)
        {
            for (j = 0; j < col; j++)
            {
                if (j == col - 1)
                {
                    printf("---");
                }
                else
                {
                    printf("---|");
                }
            }
            printf("\n");
        }
    }
}

// 玩家走棋
void PlayerMove(char board[ROW][COL], int row, int col)
{
    int x = 0, y = 0;
    while (1)
    {
        printf("请输入坐标(如 1 1): ");
        scanf("%d %d", &x, &y);
        // 坐标范围检测
        if (x >= 1 && x <= row && y >= 1 && y <= col)
        {
            // 内存检测
            if (board[x - 1][y - 1] == ' ')
            {
                board[x - 1][y - 1] = '*';
                return;
            }
            else
            {
                printf("该位置已有棋子,请重新输入!\n");
            }
        }
        else
        {
            printf("坐标越界,请重新输入!\n");
        }
    }
}

// 电脑走棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
    int x = 0, y = 0;
    printf("电脑思考中...\n");
    while (1)
    {
        x = rand() % row;
        y = rand() % col;
        if (board[x][y] == ' ')
        {
            board[x][y] = '#';
            break;
        }
    }
}

// 检查棋盘状态
// 1:玩家赢 *  2:电脑赢 #  3:继续  0:平局
int CheckBoard(char board[ROW][COL], int row, int col)
{
    int i = 0;
    // 判断行和列
    for (i = 0; i < row; i++)
    {
        // 行判断
        if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
        {
            return (board[i][0] == '*') ? 1 : 2;
        }
        // 列判断
        if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
        {
            return (board[0][i] == '*') ? 1 : 2;
        }
    }
    // 对角线判断
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
    {
        return (board[0][0] == '*') ? 1 : 2;
    }
    if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
    {
        return (board[0][2] == '*') ? 1 : 2;
    }
    // 判断平局
    for (i = 0; i < row; i++)
    {
        int j = 0;
        for (j = 0; j < col; j++)
        {
            if (board[i][j] == ' ')
            {
                return 3; // 还有空位,继续
            }
        }
    }
    return 0; // 平局
}

// 游戏主逻辑
void game()
{
    char board[ROW][COL];
    int ret = 0;
    
    // 1. 初始化
    InitBoard(board, ROW, COL);
    // 2. 打印初始界面
    PrintBoard(board, ROW, COL);
    
    // 3. 循环下棋
    while (1)
    {
        // 玩家回合
        PlayerMove(board, ROW, COL);
        PrintBoard(board, ROW, COL);
        ret = CheckBoard(board, ROW, COL);
        if (ret != 3) break;
        
        // 电脑回合
        system("cls");
        ComputerMove(board, ROW, COL);
        PrintBoard(board, ROW, COL);
        ret = CheckBoard(board, ROW, COL);
        if (ret != 3) break;
    }
    
    // 4. 输出结果
    if (ret == 1)
    {
        printf("*** 玩家赢了 ***\n");
    }
    else if (ret == 2)
    {
        printf("*** 电脑赢了 ***\n");
    }
    else if (ret == 0)
    {
        printf("*** 平局 ***\n");
    }
}

// 菜单显示
void menu()
{
    printf("=================================\n");
    printf("=======  1. Play Game  ========\n");
    printf("=======  0. Exit Game   ========\n");
    printf("=================================\n");
}

// 主程序
int main()
{
    srand((unsigned)time(NULL));
    int input = 1;
    while(input)
    {
        menu();
        printf("请选择: ");
        scanf("%d", &input);
        switch(input)
        {
            case 1:
                game();
                break;
            case 0:
                printf("退出游戏\n");
                break;
            default:
                printf("选择错误,请重新输入\n");
                break;
        }
    }
    return 0;
}

以上就是C语言实现三子棋游戏的详细内容,更多关于C语言基础教程的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。