许久没有做一个完整的项目了,这次就让我们来做一个经典游戏吧。
本文仅供个人记录和复习,不用于其他用途
前言
源代码我已开源至GitHub,这个是最基础的版本,AI对战和网络对战的版本会后续补充。
设计思路
- 生成棋盘
- 移动棋子
- 走棋规则
- 游戏结束
有了这些,那么就让我们一个个来解决。
生成棋盘
观察棋盘你会发现,棋子以将为分界线,左右对称;以楚河汉界为分界线,上下对称。这样,我们就不需要生成所有的棋子,我们只需要生成左下角的棋子,然后按照左右对称、上下对称的顺序进行复制即可。
由于棋盘图片制作的比较好,行列的距离基本相等,所以我们不必弄清所有位置的坐标,只要按照下面的公式进行计算即可:
棋子在X轴的位置 = 原点偏移位置 + 列数 × 列宽
棋子在Y轴的位置 = 原点偏移位置 + 行数 × 行宽
具体的实行方法为:找到棋盘左下角的位置坐标、测试出行宽列宽、代入计算公式。先来看看下面的代码:
|
|
这段代码主要用于初始化棋子,同时导入棋盘图片。这里要注意一点,游戏窗口的大小为960X640,而棋盘的高度已经超出了这个值,所以必须要进行缩放操作(以高度为准进行等比例缩小)。缩放后的画面可以参考第一张图,左边是棋盘,右边是预留的控制面板。
导入完棋盘后,再来看看如何初始化棋子:
|
|
代码有点长,不过很好理解。proper
是一个结构体数组,结构体的成员为type
、row
、col
,也就是象棋类型、所位于的行、所位于的列。另外,花括号中的内容则是卒、马、炮等棋子应该处在的位置(只记录了从左下角开始的四分之一的棋子位置,其他的通过对称即可生成)。_id
表示棋子的编号(具体可参考第一张图上的数字),_red
表示红黑两色,真为红,假为黑。
再往下看,这段代码是通过左右对称、上下对称,简练的生成了整个棋盘。当然,事情到这里还没完,我们还得根据各个棋子的类型来为之添加纹理图片,添加完毕之后才会得到完整的棋盘。