前言:中国象棋的规则很多人都懂,用C语言做一个中国象棋游戏,其要点是怎么把抽象的规则变成形象、具体的代码。本项目提供详细的实现思路,源码附带大量的注释说明,源码逐步地实现了每一种棋类的走棋规则、吃棋规则,将每一条细化的规则整合起来也就实现了一个完整的游戏规则。
本项目提供两种调试方式,一种是带界面操控(QT实现),一种是终端输入操控。本项目非常适合初学者用以参考学习。
Qt 5.14完整源码下载,点击链接。效果预览:
下载源码:
源码下载解压后有两个文件夹,分别是QT工程和Dev-C++工程,前者带界面后者是终端输入方式调试。
代码设计:
两个工程的源码都包含了chess.cpp和chess.h两个文件,这两个文件实现了象棋的游戏规则,将一盘象棋游戏的所有操作通过接口来实现,非常方便移植到其他的嵌入式平台。下面先对这两个源码文件的部分内容作说明。
typedef struct{
eChessColour Colour:4;
eChessClass Class:4;
}ChessPiecesStr;//装载棋子的容器,携带棋子颜色、棋子种类信息
/*由多个棋子容器组成的虚拟棋盘 10(row)*9(col)*/
static ChessPiecesStr CheckerBoard[10][9];
用ChessPiecesStr结构体表示一个象棋包含的信息(颜色、棋类),那么可以定义这样一个数组ChessPiecesStr CheckerBoard[10][9],它代表整个棋盘,10行,9列,每个数组元素代表棋盘的每一个位置上的棋子,如果某个元素的信息是NULL,则代表该位置上没有棋子。我们在游戏过程的走棋、吃棋、悔棋等操作,其实是对数组CheckerBoard里的数据进行操作,然后将操作完的棋盘更新显示出来。
typedef struct{
ChessPiecesStr ChPs;
uchar col,row;//位置:列、行
}PickUpChessStruct;//被选中的棋子,携带棋子所在的位置、棋子容器里的信息
用PickUpChessStruct结构体表示游戏者当前要操作的棋子,它包含了该棋子的坐标信息、棋色、棋类,这么封装是为了方便实现每一种棋类的走棋规则、吃起规则,下面以炮的走棋规则为例:
bool MovemenRules_PAO(PickUpChessStruct* pActiveChess,uchar row,uchar col)//【炮】走棋规则
{
int i,col_min,col_max,row_min,row_max;
//【炮】走棋规则:走直线,不能跨越棋子
//穷举法+假设法 要么横着走,要么竖着走,其他都是违规;假设成功了,那么起点到终点之间不能有其他棋子
if(pActiveChess->row == row){//横着走
if(pActiveChess->col > col){
col_min = col