最近看了一些关于中国象棋的实现书籍,里面讲述了如何开发一个完整的中国象棋游戏,看了里面的内容,感觉里面的内容特别巧妙的,比如书中提到了用位棋盘来表示中国象棋的棋盘以及一些精妙的走棋算法。基于这些,自己也尝试的开发了一个中国象棋。
       我是在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个小时,或者不用这么长时间,就可以把这个东西做出来了。不信的话,大家可以试试。后面的文章中将有更多的介绍。

转载于:https://www.cnblogs.com/zxywd/p/4949555.html

使用Qt开发中国象棋(一):概述相关推荐

  1. 使用Qt开发中国象棋(三):走棋着法列表

    在一个完整的中国象棋游戏中,一般界面上都显示了中文着法,为了简单起见,我开发的这个用了两个着法列表,红方一个,黑方一个,其实用一个就够了,只是感觉那样稍微会麻烦些.着法列表显示了每一步的走棋.下图是着 ...

  2. 使用Qt开发中国象棋(六):将军和死棋检测

    下棋的过程中,某一方主帅被对方攻击就是将军,如果不能解除危险,就是死棋.在这个游戏中实现了将军的判断和死棋的检测.具体如下: (1)每走一步棋时,先要判断自己能不能这样走,当然除了走法是否合乎规则,比 ...

  3. C++与Qt开发人机象棋(第二部分)

    C++与Qt开发人机象棋(第二部分) 项目目录 文件名->(包含)类名1->(包含)类名2 ChessBy ChessBy.pro Headers Board.h – – – Source ...

  4. Qt实现中国象棋:(三)棋盘绘制的详细分析及实现

    一.图片及棋盘分析 1:在上文中已经对单张图片的显示进行了测试,从中可以知道一张图片需要一个QPixmap对象对其进行加载.棋盘图片共有23张,也就需要23个QPixmap的对象.同时要求对象名与图片 ...

  5. Qt实现中国象棋:(七)悔棋

    一.下棋步骤的保存 在设置保存下棋步骤之前,先定义一个bool类型的变量player用于判定是哪一方下子,设定player=true时是红方下棋,player=false时是黑方下棋. 1:要想保存下 ...

  6. Unity和C#开发 - 中国象棋+源代码工程

    Unity和C#开发 - 中国象棋+高清视频指导+源代码工程 https://item.taobao.com/item.htm?ft=t&id=650971483074

  7. Qt实现中国象棋:(四)棋子绘制的实现

    一.棋子图片的简要介绍 上图就是所要使用到的棋子图片,以"r"开头命名的均为红棋,以"b"开头命名的是黑棋:其中带有红色边框的棋子表示将要被移动的棋子(被选中的 ...

  8. Qt实现中国象棋:(六)棋子移动规则

    一.移动规则的制定 关于中国象棋游戏棋子移动规则有马走日,象走田等说法,下面就将各类棋子的移动规则进行说明及实现(开局时默认红棋在下方,黑棋在上方).棋子移动规则中fromX.fromY为起始点坐标, ...

  9. C++ QT开发人机象棋(大纲)

    目录 1 系统需求分析: 1.1游戏简介: 1.2机器下棋史: 1.3研究内容: 1.4编译环境:QT 2 总体设计 2.1系统功能分析: 1.界面表示 2.鼠标点击 3.棋子走法 4.评估函数 5. ...

最新文章

  1. Linux音频设备驱动
  2. Uri、URL、UriMatcher、ContentUris详解
  3. java 开源记账_生鲜配送系统ERP(JAVA开源版)-水产记账ipad
  4. 细数你不得不知的容器安全工具
  5. LeetCode 543. 二叉树的直径(DFS)
  6. php字符串与数字比较,PHP容易被忽略而出错陷阱 数字与字符串之间的比较
  7. Wasserstein GAN
  8. PyTorch | 通过torch.normal()创建概率分布的张量 | torch.normal()如何使用?torch.normal()使用方法 | torch.normal()例子
  9. 网信办:从严整治激情打赏、高额打赏、诱导打赏
  10. DRUID连接池:java.sql.SQLRecoverableException: 关闭的语句
  11. OpenCore引导配置说明第十一版说明-基于OpenCore-0.6.4正式版
  12. 使用apktool+dex2jar+xjad进行反编译
  13. c# 图片批量转双层PDF,OFD格式文件
  14. 还没来得及买,就已经被淘汰的东西
  15. sudo must be owned by uid 0 and have the setuid bit set错误处理
  16. 吃鸡空投掉落射线检测,粒子系统产生红色信号烟
  17. sts工具如何配置mvn,解决settings.xml文件配置问题
  18. 征战希洛克集卡活动显示服务器没角色,希洛克征战模式
  19. Markdown语法-从基础到进阶
  20. 日期转换--接收日期与数据库存储不兼容问题时间段查询

热门文章

  1. 5 关于数据仓库维度数据处理的方法探究系列——缓慢变化维处理——全历史记录...
  2. 使用 CommandBuilder 生成命令 (ADO.NET)
  3. c的按位取反运算符(~) 与逻辑逻辑(!)
  4. 软件工程概论作业:返回一个整数数组中最大子数组的和
  5. Linux 自定义命令
  6. 递归遍历所有文件夹名称
  7. Linux的IPC机制(二):Socket/管道/消息队伍/信号量
  8. CUSTOMDRAW msdn网站
  9. 算法-----数组------ 数组中的第K个最大元素
  10. Android7.0多窗口实现原理(一)