一、项目概述

1.1 项目背景与目标

五子棋是规则简洁、普适性强的经典双人策略棋类游戏。本次项目以 C 语言为开发基础,在 Ubuntu Linux 系统环境下完成可视化五子棋游戏的全流程开发,目标是实现棋盘渲染、双人交替落子、合法性校验、自动胜负判定、结果弹窗反馈等完整游戏功能。

项目以实战为导向,一方面巩固 C 语言二维数组、函数封装、逻辑控制等核心语法知识,另一方面熟悉 Linux 操作系统的基础操作、程序编译与调试方法、图形化库的环境配置与调用,完成从语法学习到完整项目落地的能力跨越。

1.2 开发环境与工具

  • 系统平台:Ubuntu 64 位,运行于 VMware Workstation 虚拟机

  • 开发语言:标准 C 语言

  • 编译工具:GCC 编译器,配合图形库链接参数完成程序构建

  • 图形支持:轻量图形化编程库,实现窗口绘制、鼠标交互、位图资源加载

  • 代码编辑:Linux 终端编辑器 + 本地文件管理

二、项目核心功能与实现思路

2.1 整体执行流程

程序整体采用「初始化 - 交互循环 - 判定终止」的经典游戏架构,执行流程如下:

  1. 程序启动,初始化二维棋盘数组,清空所有位置状态

  2. 调用渲染函数,绘制棋盘网格、初始界面

  3. 监听键盘点击事件,将屏幕像素坐标转换为棋盘数组下标

  4. 校验落子位置合法性:位置越界或已有棋子则忽略本次操作,返回监听状态

  5. 合法落子则更新数组数据,刷新棋盘界面

  6. 调用胜负判定函数,以最新落子点为中心检测是否达成五连珠

  7. 判定胜利则加载胜利弹窗位图,锁定对局,结束游戏循环;未分出胜负则切换玩家,回到交互监听环节

2.2 核心数据模型

项目采用二维数组作为棋盘数据载体,实现「数据层与显示层分离」的设计:

  • 定义二维数组chess_g[][]映射棋盘每个交叉点的状态

  • 约定数值规则:0代表空位、1代表黑棋、-1代表白棋

  • 所有游戏逻辑仅操作数组数据,界面渲染完全依据数组状态重绘

  • 光标位置通过pos_xpos_y两个整型变量记录,实现坐标与数组下标的一一映射

该设计让逻辑与界面解耦,既降低了代码调试难度,也为后续功能扩展(如悔棋、棋谱保存)提供了数据基础。

2.3 关键功能模块实现

项目采用模块化函数封装,每个功能对应独立函数,职责清晰:

  1. 棋盘渲染模块show_chess_broad()函数负责绘制棋盘网格线、根据数组状态绘制黑白棋子,每次数据更新后调用该函数刷新界面。

  2. 落子交互模块:捕获键盘点击坐标,通过像素换算公式转换为数组行列下标,完成位置合法性校验后写入数组。

  3. 胜负判定模块is_win()函数接收落子坐标,向横向、纵向、左斜向、右斜向四个方向分别统计连续同色棋子数量,任意方向达到 5 颗即返回胜利标识。

  4. 结果反馈模块:判定胜利后调用draw_bmp()函数加载对应胜利位图,在棋盘中央弹出结果提示,同时终止落子逻辑。

三、开发难点与解决过程

3.1 Linux 环境配置类问题

  1. 图形库依赖安装与编译报错

    1. 问题:初次编译时出现大量未定义引用错误,程序无法生成可执行文件

    2. 解决:在 Ubuntu 终端通过包管理器安装图形库对应的开发依赖包;修正 GCC 编译命令,补充图形库的链接参数,确保编译时正确链接动态库,最终程序成功编译运行。

  2. 位图资源路径读取失败

    1. 问题:胜利弹窗图片无法加载,界面显示空白

    2. 解决:排查 Linux 文件路径规则,确认程序工作目录与图片文件位置一致,将相对路径修正为正确的目录结构,同时验证图片格式与位深符合库函数要求,最终图片正常显示。

3.2 代码逻辑与功能 Bug

  1. 鼠标落子位置偏移

    1. 问题:键盘点击位置与实际落子的棋盘格子不匹配,存在固定偏差

    2. 解决:行和列搞反了,推导像素坐标到数组下标的换算公式,加入棋盘边距偏移量修正,同时增加坐标边界判断,防止点击棋盘外区域造成数组越界访问。

  2. 胜负判定漏判与边界误判

    1. 问题:棋盘边缘位置的五连珠无法被识别,偶发误判情况

    2. 解决:重构胜负判定算法,放弃全棋盘遍历方案,改为以当前落子点为中心向四个方向辐射统计;同时加入数组边界判断,避免下标越界,修复计数逻辑漏洞后判定准确率达到 100%。

  3. 胜利后游戏未终止

    1. 问题:弹出胜利提示后,玩家仍可继续点击落子,对局状态异常

    2. 解决:在胜负判定的胜利分支中添加流程终止逻辑,直接退出落子处理函数,锁定棋盘交互,保证对局结果唯一。

  4. 界面不刷新问题

    1. 问题:落子后棋盘无视觉变化,数据已更新但界面未同步

    2. 解决:排查发现函数调用遗漏括号,仅书写函数名并未实际执行函数;修正为标准函数调用格式后,界面渲染正常触发。

四、学习收获与成长

4.1 C 语言编程能力巩固

通过本次项目,我对 C 语言核心知识点的理解从纸面落地到了实战:

  • 深入掌握了二维数组的定义、遍历与下标操作,理解了用数组映射实体数据的编程思想

  • 熟练运用函数封装实现模块化开发,学会拆分复杂功能、设计函数入参与返回值,提升了代码的可读性与可维护性

  • 强化了分支、循环等流程控制的使用逻辑,能够独立设计胜负判定这类多层嵌套的复杂逻辑

  • 建立了「数据驱动界面」的程序设计意识,理解了数据层与显示层分离的优势。

4.2 Linux 系统实操能力提升

本次项目全程在 Linux 环境下开发,填补了 Linux 实操的经验空白:

  • 掌握了 Ubuntu 系统的基础终端命令,能够独立完成目录管理、文件操作、程序编译运行

  • 理解了 Linux 下 C 程序的编译链接过程,学会排查依赖缺失、链接错误等常见编译问题

  • 熟悉了 Linux 环境下图形化程序的开发流程,掌握了资源文件路径、库环境配置等实操细节

  • 积累了虚拟机环境下的开发调试经验,能够独立解决环境适配类问题。

4.3 程序设计与调试思维养成

  1. 建立了模块化拆解问题的能力:面对完整游戏项目,能够按功能拆分模块,逐个实现、逐个测试,降低开发难度。

  2. 形成了系统化的排错思路:遇到 Bug 时,从环境配置、语法错误、逻辑漏洞、边界条件等多个维度逐步排查,而非盲目修改代码。

  3. 提升了细节把控能力:函数调用语法、数组边界、路径格式等细节都会直接影响程序运行,开发过程中养成了严谨的编码习惯。

五、项目不足与优化方向

5.1 当前项目的不足

  1. 仅支持双人本地对战,缺少人机对战模式,单人场景下可玩性不足

  2. 未实现平局判定,棋盘全部填满无胜负时程序无对应处理逻辑

  3. 缺少悔棋、重新开局等辅助功能,交互完善度有待提升

  4. 界面视觉效果较为基础,缺少功能按钮、计时、音效等配套元素

  5. 胜负判定算法仍有优化空间,存在少量冗余计算

5.2 后续优化计划

  1. 新增 AI 对战功能:设计基础落子评分算法,实现简单难度的人机对战,后续可逐步迭代更高难度的 AI 策略

  2. 补全游戏规则:增加平局判定、悔棋、重新开局功能,完善游戏闭环

  3. 优化界面交互:新增功能按钮、对局计时、落子提示,美化棋盘与棋子视觉效果

  4. 扩展功能:增加棋谱保存与回放、落子音效等功能,提升游戏完整度

  5. 适配优化:精简代码逻辑,降低程序资源占用,验证在更多 Linux 发行版下的运行兼容性

本次 Linux 环境下的 C 语言五子棋项目,是一次完整的编程实战训练。从环境搭建、需求拆解、代码编写到调试排错,全流程独立完成的过程,不仅让我巩固了 C 语言编程基础,更掌握了 Linux 系统下的程序开发方法,培养了工程化的编程思维与问题解决能力。

项目虽已实现基础功能,但仍有很多可扩展、可优化的空间。后续我会继续完善功能、优化代码,将本次项目的收获延续到后续的编程学习中,进一步提升自己的开发能力。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐