最近看了一些关于中国象棋的实现书籍,里面讲述了如何开发一个完整的中国象棋游戏,看了里面的内容,感觉里面的内容特别巧妙的,比如书中提到了用位棋盘来表示中国象棋的棋盘以及一些精妙的走棋算法。基于这些,自己也尝试的开发了一个中国象棋。
我是在Linux Mint 17.1 32位操作系统下面开发的,用的是Qt Creator 3.3.1,Qt的版本是5.4.1。由于要实现的功能比较多,加上每天能抽出来的时间最多也就两三个小时,平时都忙着工作,开发也是断断续续。整个过程大概花了我三四个月时间。感觉还是比较痛苦的,当然也有一些小小的成就感。源代码的下载链接:http://down.51cto.com/data/2116205。要是在读大学的时候能做出这个东西出来,那别提多高兴了。好了,废话少说,下面介绍一下实现了哪些功能:
整个游戏游戏有三种模式:自己和自己下棋,人机对战,网络对战。从功能上讲,主要有这些功能:歩时限制,走棋,悔棋,死棋判断,重复局面检测(长将判负),保存棋局到文件,从文件中加载棋局,着法显示。
对于Qt来说,最显著的特点就是其信号-槽的机制,是一种观察者模式。在代码中我们也经常用到。整个设计如下:
1.MainWindow类:游戏的主界面,包括菜单,工具栏。
2.ChessBoard类:显示棋盘和棋子。
3.StepList类:显示中文着法列表。
4.ChessHandler类:游戏的逻辑层。
5.MoveGenerator类:判断走棋的走法是否合理,着法生成。
6.ServerNetwork/ClientNetwork类:网络对战时,用于发送走棋消息和其他消息。
7.GameSettings类:保存和加载游戏的设置。
MainWindow中封装一个ChessBoard对象,两个StepList对象,一个ChessHandler对象。其中MainWindow类相当于观察者,ChessBoard和ChessHandler相当于被观察者。因为ChessBoard和ChessHandler类中都有指定的信号连接到MainWindow中的槽。比如说走棋的时候,ChessBoard响应鼠标事件,然后emit指定的signal,MainWindow调用slot,在slot中调用chessHandler的走棋逻辑,chessHandler中走棋完了后,又emit指定的signal,MainWindow调用slot更新StepList和ChessBoard,最终完成一个完整的走棋逻辑。在信号-槽这方面,只有从ChessBoard到MainWindow和ChessHandler到MainWindow,没有反过来的,否则会显得混乱,再说也犯不着,毕竟都是MainWindow的成员,直接调用就是。ChessHandler和ChessBoard中没有保存MainWindow的指针,不能直接调用MainWindow中的方法,只能通过信号-槽机制来实现。
下面是游戏的截图:
一些图标是随便找的,界面比较丑陋,希望大家不要介意。
读大学的时候,学长用Java开发了一个中国象棋的游戏,那个时候,都觉得是多么多么牛,现在想来,自己当时想法太稚嫩。可以这么说,只要肯花200个小时,或者不用这么长时间,就可以把这个东西做出来了。不信的话,大家可以试试。后面的文章中将有更多的介绍。