2005年6月我系第二批科技小組的項目正式確定為實現一款中國象棋對弈軟件。基本功能包括人機對戰、網絡對戰。我負責開發人機對戰的引擎部分,也就是讓計算機下棋。經過了暑假整整兩個月的學習與實踐,我終于初步完成了程序,雖然電腦的下棋水平實在不敢恭維,但好歹也是我心血所成,所以就茍且將其命名為scCChess1.0版本,整理一下發到blog上來。(本程序在8月底就完工了,之所以現在才貼上來是因為我本想在這個學期對它進行改善,力求讓電腦的下棋水平再上一個層次之后再貼出來,免得眾老鳥笑話。結果這個學期實在是比較忙,而且現在又找不到人做界面,我不得不轉去給我的引擎做界面。唉,說來慚愧啊,小生對做界面至今仍未入門,當你看這篇blog時,說不定我正在痛苦的學著MFC……再加上其他一些亂七八糟的事恐怕年前是不會有空修改引擎了。所以干脆先貼了,以后若有大改再貼新的。如果有哪位朋友耐住性子、犧牲了寶貴時間看了小生的東西,還望多提寶貴意見。謝謝、謝謝……
好了,說了這么多廢話現在轉入正題。
程序的基本框架:
從程序的結構上講,大體上可以將本程序劃分為四大部分:
棋局表示、 著法生成、 搜索算法、 局面評估
程序的大概的思想是:
首先使用一個數據結構來描述棋局信息,對某一特定的棋局信息由著法生成器生成當前下棋方所有合法的著法并依次存入著法隊列。然后通過搜索算法來逐一讀取著法并調用局面評估函數對該著法所產生的后繼局面進行評估打分,從中選出一個最有可能導致走棋方取勝的著法。在搜索的過程中還可以采用一些輔助手段來提高搜索的效率。其過程如下圖所示:
在搜索算法上我采用了Alpha-Beta搜索。此外,為了提高搜索的效率,我還加進了歷史啟發以及歸并排序等以輔助搜索。這些用的都是前人的東西。本程序最具創造性的地方在于局面評估部分(請允許我用“創造性”這個詞,盡管我設計的算法可能很幼稚——從目前電腦的下棋水平來看我不得不這么說,但畢竟耗費了我好多腦細胞啊)。搜索算法和局面評估是整個程序的核心。其中局面評估對計算機的下棋水平起著至關重要的影響。也是今后我的程序想要提高機器“智能”所要著重改進的地方。呵呵,既然如此重要這個就放在最后再講了。
程序項目的構成:
我為程序建了一個win32控制臺項目,這意味著我的程序用了一個DOS的界面(在界面開發出來之前,我通過在DOS窗口中輸入坐標、電腦反饋坐標的方式來和電腦下棋,以此測試我的引擎)。
我將各個模塊分別寫成頭文件,最后再包進一個主的cpp文件。我知道這樣似乎有點外行,但對像我一樣的初學者來說這種方法簡單易懂:)
整個項目包含如下文件:
scCChess.cpp
——程序主文件。負責游戲的開始。
scCChess.h
——主頭文件。定義了初始化游戲、開始游戲等基本函數。
CChessDef.h
——象棋相關定義。包括棋子棋盤的表示,行棋的基本結構類型等定義。
CChessEvaluate.h
——局面評估。為某一特定局面進行評分。
CChessMove.h
——著法生成器。就當前局面生成某一方所有合法著法。
CChessSearch.h
——搜索部分。對著法隊列進行搜索,求出最佳著法。
HistoryHeuristic.h
——歷史啟發。Alpha-Beta搜索之補充,以提高搜索效率。
SortMove.h
——著法排序。對著法按其歷史得分進行降序排序,以提高搜索效率。
參考資料:
在寫本程序時我參考學習了以下資料:
*《PC 游戲編程(人機博弈)》 作者:王小春 重慶大學出版社
* 象棋百科全書 ElephantBoard的主頁 http://www.elephantbase.net/ 站長郵箱: webmaster@elephantbase.NET
*《Visual C++.NET 小游戲開發時尚編程百例》 作者:網冠科技 機械工業出版社
* 以及眾多其它無名作者的源程序
它們對我最終能夠順利完成程序起了巨大的幫助作用。在此,謹向以上所列表示感謝!
此外,我還要感謝我們的指導老師——蔣德茂老師和陳宇老師,他們給了我們科技小組很大的支持和幫助。在此,也向兩位老師表示感謝!
下面將陸續介紹程序各部分的實現……