🌸 前言
个人博客:小北北北北的秘密小窝
本文链接:https://www.seny.xyz/archives/gobang
Github:https://github.com/senyucci/Gobang
最近闲来无事优化了一下上学期的 C++ 课程设计,在原来的本地五子棋对战的基础上结合之前的网络编程扩展出联机对战,联机五子棋主要的难点在于对战双方的 数据通信
,这些在本文后面都会有所讲解。
该程序分为 服务端 与 客户端,客户端采用 QT 编写提供基本的图形化界面,服务端采用 C++ 编写同时架设在 Linux 服务器上。联机功能的实现依赖于一个外网服务器,市面上的头部服务器供应商像 阿里云 跟 腾讯云 都 OK,并且他们都有学生优惠一个月十块钱不到的样子。
详细源码提供于文末链接,有兴趣的小伙伴可以下载下来作为参考,写的不好有意见或者疑问可以在评论区提出!一起进步~
🌸 程序预览
QT 版本为 5.9.0 ,该程序运行结果预览如下:
本地对局
支持 AI 对战与本地双人对战,支持局时与悔棋功能。
联机对局
支持大部分功能如:悔棋、认输、求和等,支持实时信息交流。
服务端
服务端实时日志如下。
主菜单
(请忽视这丑陋的 UI,真尽力了😢)
🌸 程序框架
本地对局与联机对局均提供了 棋盘类
(ChessBoard) 与 对局控制类
(GameControl),其中本地对局额外提供一个 AI 类
供本地人机对战。
- 棋盘类 :负责落子、悔棋、胜负判定等主要游戏逻辑,是游戏的主体。
- 对局控制类 :负责对局的控制,包括游戏开始、游戏结束等对局信息控制。
- AI 类 :一个基于策略表的简单对局 AI,提供给本地人机对局使用。
理清程序框架对于程序编写会更加得心应手,以下是一个基本的 程序框图:
由上述框图可见,除了以上三个实现类以外,要想实现联机对局还需要定义一种客户端与服务端的 数据通信格式与协议 ,这部分在后续的联机对局中会详细地进行阐述。
接下来将从 客户端
与 服务端
的角度来实现一个联机五子棋
🌸 Gobang 客户端
客户端采用 QT 开发,提供了一些 UI 界面,编写该程序需要学习一定的 QT 知识,对于 QT 信号与槽 机制需要一定的了解。对于 棋盘类、对局控制类 与 AI 类 来说整体的逻辑在联机对局与本地对局中相差并不大。
二者的主要区别在于本地的数据通信是 实时 的,而联机的数据通信需要在服务器中进行 中转(为了简化工作量,所有联机对局的判定操作等仍在本地客户端中进行,服务端仅作为一个消息中转站,若有小伙伴想要更进一步优化的话,可以将判定等操作在服务端中进行)
除了主要逻辑之外还额外基于 QT 做了一些 UI 的美化(虽然也很丑),但不是本文的重点便不加以赘述。
#define BOARD_COL 15 // 棋盘列数
#define BOARD_ROW 15 // 棋盘行数
#define BLACK_PIECE 0 // 棋子标志:黑子
#define WHITE_PIECE 1 // 棋子标志&