EGE 五子棋游戏 (支持双人、人机)

本案例为一个基于 EGE 编写的 五子棋游戏, 游戏支持简单的人机对战, 支持双人对战。 使用 MIDI 琴键作为落子音乐。 游戏界面:
游戏完整源码就在本文章末尾。 Github 页面: https://github.com/wysaid/xege/pull/276  (源码就在本文章末尾, 此链接仅展示 PR)

游戏简介

五子棋是一种起源于中国的传统棋类游戏,规则简单却变化丰富。游戏使用15×15的棋盘,两名玩家分别执黑子和白子,黑方先行。玩家轮流在棋盘交叉点落子,率先在横、竖、斜任意方向形成连续五子者获胜。

本游戏采用无禁手规则,即不对黑方施加”三三禁手”、”四四禁手”等限制,适合初学者快速上手,也便于程序实现和 AI 对战。

游戏特性

  • 双人对战模式:支持两名玩家在同一设备上对弈
  • 人机对战模式:内置简单 AI,可与电脑对弈
  • 先后手切换:在 AI 模式下可通过 R 键切换先手
  • 音效反馈:黑白棋子落子时有不同音高的音效提示
  • 视觉反馈:最后落子位置会有高亮标记,便于追踪对局进展

EGE 图形库能力应用

本游戏是 EGE 图形库功能的综合展示,主要使用了以下特性:

1. 基础图形绘制

使用 line() 函数绘制棋盘网格,setcolor() 和 setlinestyle() 控制线条样式。

2. 抗锯齿圆形绘制

启用抗锯齿后,使用 ege_fillcircle() 和 ege_circle() 绘制平滑的棋子,视觉效果更加美观。

3. 鼠标交互

通过 mousemsg() 和 getmouse() 捕获鼠标事件,将屏幕坐标转换为棋盘坐标: 这段代码通过距离公式确保只有点击交叉点附近才有效。

4. 键盘输入

使用 kbhit() 和 getch() 实现键盘控制。

5. 图像缓存与半透明效果

将游戏结束画面预先绘制到图像对象,设置半透明效果,提升性能和视觉体验。

双人对战实现

双人对战模式的实现相对简单,核心是玩家轮流落子:   每次落子后检查胜负,如果游戏继续则切换当前玩家。胜负判定使用方向搜索算法:   这个算法对每个落子位置检查四个方向,统计连续同色棋子数量。

人机对战 AI 算法

本游戏采用了基于位置评估的启发式算法,虽然不如 Alpha-Beta 剪枝等高级算法强大,但足以提供有趣的对战体验。

AI 决策流程

AI 遍历棋盘所有空位,选择评分最高的位置落子。

位置评估算法

评估函数综合考虑三个因素:
  1. 位置价值:靠近中心的位置得分更高
  2. 进攻价值:评估该位置能形成的己方连珠
  3. 防守价值:评估该位置能阻止的对手连珠

方向评估算法

  该算法对每个方向统计能形成的连珠数量,连子越多得分越高,活棋(未被封堵)价值更高。

音效系统实现

游戏使用 Windows MIDI API 实现音效,为黑白棋子设计了不同音高的落子音效:   黑子使用 G4 音符,白子使用 C5 音符,两者形成完美四度音程,听感舒适且易于区分。音效播放后会在约20帧后自动停止,避免声音延续过长。

游戏操作指南

  • 鼠标左键:点击棋盘交叉点落子
  • ESC 键:退出游戏
  • R 键:重新开始游戏(AI模式下会切换先后手)
  • M 键:切换双人/人机对战模式
在人机对战模式下,玩家可以通过按 R 键来切换先后手,体验执黑或执白的不同策略。

技术亮点总结

  1. 坐标转换公式:屏幕坐标到棋盘逻辑坐标的精确转换,使用距离公式确保点击精度
  2. 胜负判定算法:四方向扫描,时间复杂度 O(1),每次只检查落子点周围
  3. AI评估函数:平衡攻守的启发式算法,权重系数经过调优(进攻×10,防守×8)
  4. 视觉优化:使用抗锯齿、图像缓存、半透明效果提升渲染质量
  5. 跨平台兼容:通过宏定义实现 MSVC 和非 MSVC 编译器的兼容性
这个五子棋游戏虽然规模不大,但麻雀虽小五脏俱全,展示了 EGE 图形库在游戏开发中的实用性和便捷性,是学习图形编程和游戏开发的优秀范例。

完整代码

下面是游戏完整源码, 配置好 ege 之后, 可以直接玩哦~~  
文章分类 范例 标签: , ,