C语言实现五子棋控制台对战系统:代码解析与逻辑详解

林见深
林见深
发布时间:2026-10-13| 5人浏览过
原创

介绍如何使用纯C语言和标准库函数构建一个支持双人交互、悔棋及彩色的五子棋控制台程序,重点解析核心算法与代码结构。

结果或目标

本示例旨在展示如何利用 stdio.h、windows.h 等标准库,在 Windows 环境下创建一个文字版五子棋游戏。系统具备以下特性:

  • 双人交替对战:玩家1(绿色'O')与玩家2(红色'*')轮流操作。
  • 控制台交互:使用 W/S/A/D 控制光标位置,J 确认落子,K 执行悔棋。
  • 实时反馈:利用 SetConsoleTextAttribute 实现不同状态的字体变色(绿、红、白)。
  • 智能判胜:每次落子后自动检测横、竖、斜四个方向的连珠情况。

准备条件

由于代码依赖 conio.h 和 windows.h,建议在 Windows 平台的编译器(如 Visual Studio, MinGW/GCC, Dev-C++)中运行。确保开发环境支持控制台窗口的光标控制和 ANSI/非标准扩展属性设置。

真实操作顺序与代码解析

第1步:初始化棋盘与数据结构

游戏开始需定义 15x15 大小的棋盘映射至字符数组。原代码采用 draw[32][60] 数组来模拟视觉效果,其中奇数行用于显示边框/空格,偶数行用于显示格子。

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

char draw[32][60] = {
    {" "},
    {"[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]"},
    // ... (省略中间重复行) ...
};

// 坐标结构体
typedef struct {
    int x;  // 逻辑X坐标,范围 -7 ~ 7
    int y;  // 逻辑Y坐标,范围 -7 ~ 7
} node;

// 栈结构体,用于存储历史步骤以支持悔棋
stack player1, player2;

注意:原代码中的 convX 和 convY 函数负责将逻辑坐标转换为数组索引,这是实现字符界面上精准定位的关键。

第2步:主菜单与入口控制

程序通过无限循环等待用户输入。输入 1 进入双人模式,2 询问退出。此阶段主要调用 printMenu() 打印欢迎界面,并使用 system("cls") 清屏以保持整洁。

第3步:玩家操作循环(移动与落子)

进入 playerVsPlayer() 后,游戏进入核心的操作循环。该函数按顺序处理两位玩家的回合:

  1. 移动光标:playerOperation 函数监听键盘输入。当检测到 'w', 's', 'a', 'd' 时,更新全局变量 pos.x 和 pos.y,并调用 refreshMap() 重绘画面以反映光标变化。
  2. 落子确认:当按下 'j' 键时,检查对应数组位置是否为空。若为空,则将 draw 数组对应位置修改为棋子字符('O' 或 '*'),记录当前坐标,并刷新地图。
  3. 触发判断:落子后调用 jundge(p, cheese) 检查是否获胜。

第4步:胜负判定算法

核心算法在 jundge 函数中实现。它以当前落子点为中心,向四个方向(水平、垂直、左上-右下、右上-左下)扫描,统计连续相同棋子数量。若任一方向累计数量 >= 5,则标记胜利标志 win[p] = 1。

// 简化的判定逻辑示意
void jundge(int p, char cheese) {
    int sum = 0;
    // 横向检测...
    // 纵向检测...
    // 对角线检测...
    if(sum >= 5) {
        win[p] = 1;
        return;
    }
}

第5步:悔棋功能实现

原代码引入了栈结构(stack)来保存每位玩家的历史坐标。当玩家按下 'k' 键时:

  1. 从对应玩家的栈中弹出最近一步的坐标。
  2. 将棋盘数组 draw 中对应位置重置为空格 ' '。
  3. 减少步数计数器。

这允许玩家在失误时恢复局面,增加了游戏的容错性。

第6步:彩色终端美化

为了提升体验,代码封装了颜色切换函数:

  • GREEN(): 设置前景色为绿色,常用于玩家1。
  • RED(): 设置前景色为红色,常用于玩家2或警告信息。
  • WHITE(): 重置为默认白色。

这些函数调用 SetConsoleTextAttribute,直接修改标准输出句柄的属性。

完成判断

当 win[1] 或 win[2] 变为 1 时,循环终止。屏幕提示获胜者,随后调用 printRoad() 打印双方所有落子的坐标记录,方便复盘。最后按任意键返回主菜单或退出。

原文有依据的排错

  • 编译错误风险:原代码使用了 gets(num)。在现代 C 标准中,gets 因不安全已被弃用或移除,可能导致编译报错。建议在实际使用时替换为 fgets 或自定义安全读取函数,并手动去除末尾换行符。
  • 平台依赖性:conio.h 和 SetConsoleTextAttribute 是 Windows 特有扩展。若在 Linux/macOS 下编译,需使用 ncurses 库或 ANSI 转义序列替换相关逻辑。
  • 数组越界检查:原代码中部分边界检查依赖于坐标初始值和限制条件,但在实际工程中建议增加更严格的数组索引越界保护,防止意外写入。

简要总结

这段 C 语言代码提供了一个经典的控制台五子棋实现案例。它清晰地展示了如何处理二维数组的游戏地图、如何响应键盘中断事件以及如何设计简单的 AI 或对战逻辑。对于初学者而言,理解其中的坐标映射和栈回溯机制,对掌握基础数据结构在游戏开发中的应用非常有价值。 以上就是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 算法库。