Qt开发人机象棋
文章目錄
- 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做象棋,心血來潮準備自己也實現一下,先看一波效果圖(項目存在一些瑕疵):
1. 類關系圖
本程序較為簡單,設計上分為四個沒有繼承關系的類:
- 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::connect: No such slot QObject::startComputerSlot() in ..\ChineseChess\widget.cpp:34 QObject::connect: (sender name: 'Widget') QObject::connect: No such signal QObject::sendComputerBestStep(Step *) in ..\ChineseChess\widget.cpp:35 QObject::connect: (receiver name: 'Widget')解決: 這個問題以前有遇到過; 在自定義的類中,使用信號和槽,需要繼承自QObject類,并且在類頭添加 Q_OBJECT宏
3.5 問題 5. 使用線程之后,界面頻繁重繪
問題描述:將項目重寫一遍后,做好了界面和計算分離,可以添加線程使得計算時不會卡界面;但是在添加線程后會出現界面頻繁重繪問題( 現象就是棋子會頻繁跳動)
解決: 雖然還不清楚為什么添加線程后會出現這樣的問題,但是可以知道線程和界面唯一的聯系就是棋子變量,所以只需要在線程中做一份棋子變量的拷貝,讓其在線程計算中使用即可
4. 項目尚存在的問題
4.1 算法問題
算法較為初級,棋力水平一般(當然不會下象棋的我下不過它),本想加入一些開局庫和殘局庫的,但是沒有心思再搞下去了
4.2 程序完成性問題
程序大部分都完成了,除了小部分:
- 一方輸之后,只是簡簡單單的彈框了事,沒有后續
- 默認紅方先手(即人一方);機器先手的按鈕沒實現,不過不難
- 輸出棋譜方面,不懂象棋方面的術語,所以輸出的棋譜以坐標表示走棋路徑
- 定時器方面存在問題
4.2 程序重繪問題
項目在程序的繪制方面存在小瑕疵
5. 項目體驗地址
項目體驗地址
總結
- 上一篇: nginx配置https双向验证(ca机
- 下一篇: 石油勘探开发知识图谱技术实现思路探讨