基于Win32 API实现的中国象棋游戏

Camouflage

发布日期: 2019-02-24 16:08:51 浏览量: 365
评分:
star star star star star star star star star star
*转载请注明来自write-bug.com

一、选题

在《实践:程序设计实践》中选中了“中国象棋”为最后作业的题目。

中国象棋是一种交互性的、在固定大小的棋盘上进行的游戏,具有一定的规则来约束棋子的行走规律,同时行走的规律会随着时间和位置的不同而进行变化。

该题目的难点并不在图像界面的绘制,最难的地方在于对棋子行走规律的判断和棋子规则的约束条件。设计的功能特性就是利用每次对鼠标和键盘的判断来进行相关的操作,并且在违背规则的前提下进行游戏,并实现了一些额外的功能,比如判定是够将军、悔棋、加入背景BGM和音效等等。

二、方案

为完成所选的程序设计题目,采用了结构体的结构来进行存储,之所以采用这样的结构,是为了方便在程序中的操作能准确、快速的找到对应的结构体的编号,而避免每次获取数据时不得不去进行全体的遍历,所用相应会占有相当大的内存,但对应执行程序时会让时间变快。为了使界面尽可能美化和考虑尽量节省内存的考虑,使用了位图去充当背景图片,而棋子则利用GDI相关函数去进行了绘制。

存储棋子内容的结构体包含以下几种数据:左上角横坐标、左上角纵坐标、右下角横坐标、右下角纵坐标、棋子颜色、棋子种类。程序实现依靠了在ChinsesChess.h中定义的棋子的全局变量和其他几个做中间存储的全局变量,ui.c、ChessMove.c、chessRuler.c中均以这几个全局变量为基础为操作,ui.c为主程序执行的程序,在执行windowproc中来调用ChessMove.c中的函数,然后在ChessMove.c中再来调用chessRuler.c中的函数。

再进行棋子绘制时,也就是采用了一个FOR循环进行了棋子的绘制,并判定了棋子的不同的属性来进行了不同颜色、种类的棋子的绘制。

流程是在windowproc函数中每次都根据鼠标点击返回的结果来进行判断,由于定义了全局变量order来进行交替下棋的判断,所以可以黑、红两方实现交替下棋而不能去干扰对方的操作。

鼠标点击的结构有两种:

  • (1)还没有选中要进行操作的棋子,则进行选中棋子的操作

  • (2)已经选中了要进行操作的棋子,则对棋子的移动、移动是否符合规则、重画棋盘来进行逐次操作

然后获取想要移动去的那个地方的坐标,通过BOOL GetMoveChessPlace(LONG x, LONG y) 函数让点击的坐标转化为方格的坐标,之后再进行(2)操作时又会根据三种情况来执行不同的操作:

  • 想要移动移动去的地方没有棋子存在,则直接移动

  • 想要移动去的地方有敌方棋子存在,在不违反象棋规则的前提下,进行吃棋操作

  • 想要移动去的地方有友军存在,不进行操作。在每次移动操作后,进行BOOL GameOver()的判定,某一王消失后,游戏结束

而chessRuler.c函数中则存储了象棋移动规则的相关函数,除了马、车、炮不会因过不过河的问题而发生规则变化所以只写了一个函数,其他等级的棋子则都分两种颜色来进行不同的描写。

在完成基础的操作上,追加了悔棋、判定是否将军、重新开始游戏、多进程音效的函数描写。使用了两个全局变量来存储每次操作的前两步棋子完成了哪些操作,在按下R键悔棋士,仅仅需要根据这两个全局变量就可以让棋盘恢复到前两步的状态。判断将军则是判断敌方的兵、炮、马、车能否在下一步将自己的王杀死。重新开始游戏仅仅需要重新调用void CreateChess()来使棋盘初始化就行。而多进程音效函数则使游戏进行过程中追加了背景音乐、选子、落子、悔棋、将军的音效,使用多进程可以在播放后四种音效时不会使背景BGM中断。

三、关键技术

关键技术我认为主要分为以下几点:

3.1 对棋子的移动的判断

每方的操作都分为两步进行,而且可能会因为无效操作而导致执行两步以上的操作。

鼠标点击,获得选中棋子的信息,如果没有选中一枚棋子再重复操作直到选中棋子,若选中对方的棋子再重复操作直到选中一枚本方的棋子,并加上选中时的特效。

在上述操作成功的结果下,鼠标再次点击。获得点击的位置的坐标,并将该坐标转化为棋盘上某个棋格的坐标(这是为了方便后面判断该格的坐标有没有和棋子的坐标重合,也就是该格有么棋子)。利用函数判断该格有没有棋子,然后分为以下几个步骤进行:

  • 要移动去的地方没有棋子存在,则在不违背象棋规则的前提下,可将该棋移动到那。若违反了规则,则重新选择要移动的地方。

  • 要移动的地方有棋子存在且为敌军,则在不违背象棋规则的前提下,执行吃棋操作,然后移动棋子到那。若违反了规则,则重新选中要移动的地方。

  • 要移动的地方有棋子存在且为友军,则重新选中要移动的地方。

对是否将军进行判断。

对游戏是否结束了进行判断。

3.2 对象棋规则的编写

因为象棋游戏进行中,每种棋子根据它所在的位置、它的等级、其他棋子对它的影响所以存在着许多的可能,并且要进行许多次的判断。

而且画棋子涉及到了一枚棋子的左上角横纵坐标、右下角的横纵坐标,所以再加上棋子规则的多样化,进行棋子判定的步骤是很繁琐的。

要使游戏能正常的进行,一套完整的象棋判定规律也是需要很多时间去完成的。

四、结果和效果

五、总结和不足

通过本次程序设计实践课程,基本掌握了API和GDI的一些基础函数的调用方式和使用方法。并且有系统的设计完成了一种游戏,掌握了设计一个比较完整的小程序所需要进行的步骤和需要注意的注意事项。在下次设计的时候能够很好的掌握进行的步骤和实现步骤所需要的时间,可以更好地完成一个小型图形界面程序的设计。

界面美化感觉并不是很好,而且在选题中选择了中国象棋这个课题,对计时器的使用并不是特别的熟练,而且在设计程序时浪费了很多无用的时间,如果一开始能设计好完整的设计流程的话,本来可以在设计程序环节节省更多的时间,让整个设计时间得到很多时间的节省。

在下次实现一个游戏之前,应该首先对这个课题进行完整的分析,然后写程序的设计计划,针对关键的点进行分析,然后才开始写代码,这样可以节省更多的时间来完善程序的不足。同时在这次设计知道的地方还有,在程序设计环节进行有必要的注释可以使你在后面程序趋于完成时出现BUG的话可以更好的调试和修改代码。

上传的附件 cloud_download 基于Win32 API实现的中国象棋游戏.7z ( 9.28mb, 1次下载 )
error_outline 下载需要13点积分

发送私信

你有那么好的年纪,为什么不笑得更好看些

7
文章数
13
评论数
最近文章
eject