一般的象棋遊戲中都會限時,超過時間沒走棋,就算輸了。這個遊戲採用的是步時限制。走棋的時候會有提示,像下面那樣:
介面用的是乙個qlable來顯示「紅方走棋」,後面顯示時間的用的是乙個qlcdnumber的控制項。顯示時間可以用定時器的方式或者執行緒的方式,我這裡用的是執行緒的方式。採用的是執行緒和條件變數的方式。qt提供了qwaitcondition用於條件變數,qmutex用於互斥鎖,qthread類用於執行緒。了解posix多執行緒程式設計的同學想必都知道,條件變數,鎖和執行緒是posix多執行緒程式設計慣用的伎倆。做這個東西時,我就參考的這種方式。要使用執行緒,可以寫乙個類繼承自qthread類,據說還有一種方法,這裡就不研究了,必須實現其run方法,也就是執行緒要做的事情。
整個思路如下:
(1)每開始新的一局時,啟動子執行緒,然後子執行緒就等待條件變數a,同時主線程睡眠500毫秒,然後廣播條件變數,子執行緒被喚醒,開始顯示時間。
(2)在乙個while迴圈裡面,子執行緒不停的等待條件變數b,每次等待的超時時間為1s,到時後,更新qlcdnumber控制項上的時間顯示。
(3)走完一步棋後,主線程廣播條件變數b,子執行緒重置qlcdnumber控制項上的時間為步時,這個時候並未退出while迴圈,又開始等待條件變數b。
(4)噹步時完了或者是遊戲結束了仍未等到條件變數時,子執行緒會退出while迴圈。
執行緒類是steptimerthread,互斥鎖是steptimemutex,有兩個條件變數,gamestartcond表示新局開始,stepovercond表示走棋結束。都是mainwindows的成員,執行緒類例項化時,傳入mainwindow的指標作為引數,這樣在run方法中就可以通過指標來呼叫某些函式。每次每次執行緒呼叫start方法後,就會進入run方法中去做事情。
下面是執行緒run方法的**:
void steptimerthread::run()
mainwin->steptimemutex.unlock();
mainwin->displaysteptime(mainwin->getstepinterval());
while (!mainwin->isgameover())
else
mainwin->displaysteptime(mainwin->getstepinterval());
}mainwin->setstepinterval(0);
mainwin->setgameover(true);
mainwin->steptimeover();
mainwin->steptimemutex.unlock();}}
每次新局開始時會呼叫執行緒的start方法,主線程也會廣播條件變數:
if (g_gamesettings.getsteptime() > 0)
每次走完一步棋也會廣播條件變數:
if (src(info.move) > 0 && dst(info.move) > 0)
}
以上就是這個遊戲中步時控制的邏輯,這種模式就是完全借鑑的posix多執行緒程式設計的模式。posix多執行緒程式設計是基礎啊,當初學習posix多執行緒程式設計還是很值得的。 Python開發中國象棋實戰(附原始碼)
pygame 做的中國象棋,一直以來喜歡下象棋,寫了 python 就拿來做乙個試試,水平有限,電腦走法水平低,需要在下次版本中更新電腦走法,希望原始碼能幫助大家更好的學習 python。總共分為四個檔案,chinachess.py 為主檔案,constants.py 資料常量,pieces.py ...
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...
中國象棋 QT版
由於當時對象棋人工智慧非常感興趣,索性自己藉著實踐qt又重新開發了乙個。這個版本通過參考圖書館借的 c 中國象棋入門與提高 從頭到尾自己徹徹底底做了一遍,雖然到最後因為有別的事沒有把啟發式演算法寫入,總的來說打菜鳥還是很輕鬆的。其實工作量真的挺大的,ui 後台全由自己設計。演算法方面 1 棋子的走法...