Qt開發人機象棋

2021-10-13 22:49:07 字數 1865 閱讀 1906

3. qt開發象棋過程問題記錄

4. 專案尚存在的問題

5. 專案體驗位址

前段時間在網上看到有人在用qt做象棋,心血來潮準備自己也實現一下,先看一波效果圖(專案存在一些瑕疵):

本程式較為簡單,設計上分為四個沒有繼承關係的類:

由於博弈樹會很大,如果將所有的計算都放在widget類中計算會出現卡介面問題;所以通過類的設計,分為widget和computer兩個類,通過棋子這個中間變數來進行通訊

使用多執行緒來實現介面計算分離,使得計算最優走棋時不會出現卡介面問題

定義定時器,timeout連線槽函式,更新各方等待時間

問題描述:在初次開發中,出現執行後電腦卡機現象

解決:一般出現執行程式電腦卡機現象,是大量記憶體洩漏導致的;回顧程式,大量使用堆記憶體的地方就是博弈樹vector儲存路徑;檢視後發現在使用該vector時,只是removelast,並未真正釋放申請的堆記憶體,然後delete,解決。

問題描述:由於時間關係,在類的設計上顯得糟糕,計算機計算類直接繼承於介面類,導致計算量大時,存在卡介面問題

解決:花時間將專案重寫,對專案進行功能分割,使得專案分為:介面類,控制類,棋子類,電腦計算類;從而使得計算和介面分離

問題描述:重寫專案後,發現計算效率差了十倍,花了兩天業餘時間,通過不斷縮小範圍qdebug,還是找不到問題

解決:無奈就又開始重寫,最後發現是因為原來專案中使用原始陣列來儲存棋子,但是新的專案使用qvector儲存棋子,原因就在這裡,不清楚為什麼使用qvector的效率這麼低,最後還是換成了陣列儲存。

問題描述:自定義類和繼承自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巨集

問題描述:將專案重寫一遍後,做好了介面和計算分離,可以新增執行緒使得計算時不會卡介面;但是在新增執行緒後會出現介面頻繁重繪問題( 現象就是棋子會頻繁跳動)

解決:演算法較為初級,棋力水平一般(當然不會下象棋的我下不過它),本想加入一些開局庫和殘局庫的,但是沒有心思再搞下去了

程式大部分都完成了,除了小部分:

專案在程式的繪製方面存在小瑕疵

專案體驗位址

Qt版本中國象棋開發(三)

實現功能 棋子初始化及走棋規則 棋子類 1 ifndef stone h 2 define stone h 34 include 5 6class stone7 1314 int row 棋子所在行 15int col 棋子所在列 16 type type 棋子型別 jiang,che.1718 1...

中國象棋的人機博弈程式

對此題目有興趣的朋友們 感謝你們抽出寶貴的時間來閱讀這些淺顯的文字。很多人可能都知道chess的人機大戰 1996年,卡斯帕羅夫以4比2戰勝 深藍 deep blue 1997年,更深的藍 deeper blue 以3.5比2.5擊敗了卡斯帕羅夫 2002年,深弗里茨 deep fritz 與克拉姆...

Qt象棋遊戲 02 繪畫象棋棋盤

進行 編寫之前,在chessarea.h 增加相關成員和方法定義,同時加入qt需要使用到的基本標頭檔案。主要用到qt繪畫類 qpen,qbrush,qpoint,qpaintevent等,重寫paintevent,達到繪製棋盤線功能。ifndef chessarea h define chessar...