最近看了一些關於中國象棋的實現書籍,里面講述了如何開發一個完整的中國象棋游戲,看了里面的內容,感覺里面的內容特別巧妙的,比如書中提到了用位棋盤來表示中國象棋的棋盤以及一些精妙的走棋算法。基於這些,自己也嘗試的開發了一個中國象棋。
我是在Linux Mint 17.1 32位操作系統下面開發的,用的是Qt Creator 3.3.1,Qt的版本是5.4.1。由於要實現的功能比較多,加上每天能抽出來的時間最多也就兩三個小時,平時都忙着工作,開發也是斷斷續續。整個過程大概花了我三四個月時間。感覺還是比較痛苦的,當然也有一些小小的成就感。源代碼的下載鏈接:http://down.51cto.com/data/2116205。要是在讀大學的時候能做出這個東西出來,那別提多高興了。好了,廢話少說,下面介紹一下實現了哪些功能:
整個游戲游戲有三種模式:自己和自己下棋,人機對戰,網絡對戰。從功能上講,主要有這些功能:歩時限制,走棋,悔棋,死棋判斷,重復局面檢測(長將判負),保存棋局到文件,從文件中加載棋局,着法顯示。
對於Qt來說,最顯著的特點就是其信號-槽的機制,是一種觀察者模式。在代碼中我們也經常用到。整個設計如下:
1.MainWindow類:游戲的主界面,包括菜單,工具欄。
2.ChessBoard類:顯示棋盤和棋子。
3.StepList類:顯示中文着法列表。
4.ChessHandler類:游戲的邏輯層。
5.MoveGenerator類:判斷走棋的走法是否合理,着法生成。
6.ServerNetwork/ClientNetwork類:網絡對戰時,用於發送走棋消息和其他消息。
7.GameSettings類:保存和加載游戲的設置。
MainWindow中封裝一個ChessBoard對象,兩個StepList對象,一個ChessHandler對象。其中MainWindow類相當於觀察者,ChessBoard和ChessHandler相當於被觀察者。因為ChessBoard和ChessHandler類中都有指定的信號連接到MainWindow中的槽。比如說走棋的時候,ChessBoard響應鼠標事件,然后emit指定的signal,MainWindow調用slot,在slot中調用chessHandler的走棋邏輯,chessHandler中走棋完了后,又emit指定的signal,MainWindow調用slot更新StepList和ChessBoard,最終完成一個完整的走棋邏輯。在信號-槽這方面,只有從ChessBoard到MainWindow和ChessHandler到MainWindow,沒有反過來的,否則會顯得混亂,再說也犯不着,畢竟都是MainWindow的成員,直接調用就是。ChessHandler和ChessBoard中沒有保存MainWindow的指針,不能直接調用MainWindow中的方法,只能通過信號-槽機制來實現。
下面是游戲的截圖:
一些圖標是隨便找的,界面比較丑陋,希望大家不要介意。
讀大學的時候,學長用Java開發了一個中國象棋的游戲,那個時候,都覺得是多么多么牛,現在想來,自己當時想法太稚嫩。可以這么說,只要肯花200個小時,或者不用這么長時間,就可以把這個東西做出來了。不信的話,大家可以試試。后面的文章中將有更多的介紹。