2005年6月我係第二批科技小組的項目正式肯定爲實現一款中國象棋對弈軟件。基本功能包括人機對戰、網絡對戰。我負責開發人機對戰的引擎部分,也就是讓計算機下棋。通過了暑假整整兩個月的學習與實踐,我終於初步完成了程序,雖然電腦的下棋水平實在不敢恭維,但好歹也是我心血所成,因此就苟且將其命名爲scCChess1.0版本,整理一下發到blog上來。(本程序在8月底就完工了,之因此如今才貼上來是由於我本想在這個學期對它進行改善,力求讓電腦的下棋水平再上一個層次以後再貼出來,省得衆老鳥笑話。結果這個學期實在是比較忙,並且如今又找不到人作界面,我不得不轉去給個人引擎作界面。唉,說來慚愧啊,小生對作界面至今仍未入門,當你看這篇blog時,說不定我正在痛苦的學着MFC……再加上其餘一些亂七八糟的事恐怕年前是不會有空修改引擎了。因此乾脆先貼了,之後如有大改再貼新的。若是有哪位朋友耐住性子、犧牲了寶貴時間看了小生的東西,還望多提寶貴意見。謝謝、謝謝……web
好了,說了這麼多廢話如今轉入正題。算法
程序的基本框架:
從程序的結構上講,大致上能夠將本程序劃分爲四大部分:
棋局表示、 着法生成、 搜索算法、 局面評估編程
程序的大概的思想是:
首先使用一個數據結構來描述棋局信息,對某一特定的棋局信息由着法生成器生成當前下棋方全部合法的着法並依次存入着法隊列。而後經過搜索算法來逐一讀取着法並調用局面評估函數對該着法所產生的後繼局面進行評估打分,從中選出一個最有可能致使走棋方取勝的着法。在搜索的過程當中還能夠採用一些輔助手段來提升搜索的效率。其過程以下圖所示:網絡
在搜索算法上我採用了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 小遊戲開發時尚編程百例》 做者:網冠科技 機械工業出版社
* 以及衆多其它無名做者的源程序
它們對我最終可以順利完成程序起了巨大的幫助做用。在此,謹向以上所列表示感謝!
此外,我還要感謝咱們的指導老師——蔣德茂老師和陳宇老師,他們給了咱們科技小組很大的支持和幫助。在此,也向兩位老師表示感謝!post
下面將陸續介紹程序各部分的實現……學習