文章目录
- Qt开发人机象棋
-
- 1. 类关系图
- 2. 用到的技术手段
-
- 2.1 界面计算分离
- 2.2 线程
- 2.3 定时器
- 3. Qt开发象棋过程问题记录
-
- 3.1 问题 1. 在初次开发中存在内存泄漏问题
- 3.2 问题 2. 类设计糟糕,使得计算和界面未分离
- 3.3 问题 3. 重写项目后,效率降低了十倍
- 3.4 问题 4. 信 和槽连接问题
- 3.5 问题 5. 使用线程之后,界面频繁重绘
- 4. 项目尚存在的问题
-
- 4.1 算法问题
- 4.2 程序完成性问题
- 4.2 程序重绘问题
- 5. 项目体验地址
Qt开发人机象棋
前段时间在 上看到有人在用qt做象棋,心血来潮准备自己也实现一下,先看一波效果图(项目存在一些瑕疵):
本程序较为简单,设计上分为四个没有继承关系的类:
- Widget:界面类;负责界面重绘,鼠标点击和按钮点击事件响应,并创建棋子,控制类,计算类等
- ChessPiece:棋子类;包含棋子的属性:id, 所在行列, 是否是红方阵营, 是否死亡
- Control:控制类;包括棋子走棋方法:是否可以走棋, 保存走棋路径等等
- Computer:电脑计算类;运用最大最小值算法求得最优走棋

2. 用到的技术手段
2.1 界面计算分离
由于博弈树会很大,如果将所有的计算都放在widget类中计算会出现卡界面问题;所以通过类的设计,分为widget和computer两个类,通过棋子这个中间变量来进行通信
2.2 线程
使用多线程来实现界面计算分离,使得计算最优走棋时不会出现卡界面问题
2.3 定时器
定义定时器,timeout连接槽函数,更新各方等待时间
3. Qt开发象棋过程问题记录
3.1 问题 1. 在初次开发中存在内存泄漏问题
问题描述:在初次开发中,出现运行后电脑卡机现象
解决: 一般出现运行程序电脑卡机现象,是大量内存泄漏导致的;回顾程序,大量使用堆内存的地方就是博弈树vector保存路径;查看后发现在使用该vector时,只是removeLast,并未真正释放申请的堆内存,然后delete,解决。
3.2 问题 2. 类设计糟糕,使得计算和界面未分离
问题描述:由于时间关系,在类的设计上显得糟糕,计算机计算类直接继承于界面类,导致计算量大时,存在卡界面问题
解决: 花时间将项目重写,对项目进行功能分割,使得项目分为:界面类,控制类,棋子类,电脑计算类;从而使得计算和界面分离
3.3 问题 3. 重写项目后,效率降低了十倍
问题描述:重写项目后,发现计算效率差了十倍,花了两天业余时间,通过不断缩小范围qDebug,还是找不到问题
解决: 无奈就又开始重写,最后发现是因为原来项目中使用原始数组来存储棋子,但是新的项目使用QVector存储棋子,原因就在这里,不清楚为什么使用QVector的效率这么低,最后还是换成了数组存储。
3.4 问题 4. 信 和槽连接问题
问题描述:自定义类和继承自QWidget的类使用信 和槽通信,发现连接不上
解决: 这个问题以前有遇到过; 在自定义的类中,使用信 和槽,需要继承自QObject类,并且在类头添加 宏
3.5 问题 5. 使用线程之后,界面频繁重绘
问题描述:将项目重写一遍后,做好了界面和计算分离,可以添加线程使得计算时不会卡界面;但是在添加线程后会出现界面频繁重绘问题( 现象就是棋子会频繁跳动)
解决: 虽然还不清楚为什么添加线程后会出现这样的问题,但是可以知道线程和界面唯一的联系就是棋子变量,所以只需要在线程中做一份棋子变量的拷贝,让其在线程计算中使用即可
4. 项目尚存在的问题
4.1 算法问题
算法较为初级,棋力水平一般(当然不会下象棋的我下不过它),本想加入一些开局库和残局库的,但是没有心思再搞下去了
4.2 程序完成性问题
程序大部分都完成了,除了小部分:
- 一方输之后,只是简简单单的弹框了事,没有后续
- 默认红方先手(即人一方);机器先手的按钮没实现,不过不难
- 输出棋谱方面,不懂象棋方面的术语,所以输出的棋谱以坐标表示走棋路径
- 定时器方面存在问题
4.2 程序重绘问题
项目在程序的绘制方面存在小瑕疵
5. 项目体验地址
项目体验地址
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!