日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt开发人机象棋

發布時間:2023/12/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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. 項目體驗地址

項目體驗地址

總結

以上是生活随笔為你收集整理的Qt开发人机象棋的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。