【正文】
A, 0, 0, 0, 0, 0, 0, 0, 0, a,K, 0, 0, P, 0, 0, p, 0, 0, k,A, 0, 0, 0, 0, 0, 0, 0, 0, a,E, 0, 0, P, 0, 0, p, 0, 0, e,H, 0, C, 0, 0, 0, 0, c, 0, h,R, 0, 0, P, 0, 0, p, 0, 0, r}。然后通過搜索算法來逐一讀取著法并調(diào)用局面評(píng)估函數(shù)對(duì)該著法所產(chǎn)生的后繼局面進(jìn)行評(píng)估打分,從中選出一個(gè)最有可能導(dǎo)致走棋方取勝的著法。 象棋設(shè)計(jì)研究方法對(duì)于象棋來說,核心設(shè)計(jì)主要包括人工智能算法的以及整個(gè)游戲中界面及程序輔助部分的實(shí)現(xiàn),主要用 Visual C++ 進(jìn)行開發(fā),里面的MFC類庫(kù),使游戲開發(fā)更加方便,并利用人工智能相關(guān)搜索算法實(shí)現(xiàn)人工智能的著法生成,從而完善整個(gè)游戲的功能。電子游戲在整個(gè)計(jì)算機(jī)產(chǎn)業(yè)的帶動(dòng)下不斷地創(chuàng)新、發(fā)展著。 關(guān)鍵詞:中國(guó)象棋;人工智能;博弈樹;AlphaBeta搜索 The Design and Implementation of Chinese ChessAbstractThe implementation of a chess program can be deposed into two major parts: the artificial intelligence and the user interface and program assist. The part of artificial intelligence shows the way of puter thinking, and which step is the best step would be decided by it. Firstly, the puter uses search algorithms to search, and then evaluates every impossible step, finally choses the best one, the other part is used for the player to adjust his thought to the currently phases. The display of step list makes player know the process of chess distinctly, and let player make a better choice.This paper firstly studies how to represent a chess board in puter, then discusses how to generate legal moves. Secondly, this paper studies the minimax searching procedure of Game Tree, and the AlphaBeta pruning algorithm. A Chessplaying system is designed and developed, which is built on the integrated puter MFC SDI document view architecture by using Visual C++. Key words: Chinese chess。其次研究了博弈樹的極小極大搜索技術(shù)及在此基礎(chǔ)上發(fā)展起來的AlphaBeta剪枝算法,使用MFC文檔視圖體系結(jié)構(gòu)和Visual C++開發(fā)工具,實(shí)現(xiàn)了一個(gè)具有一定棋力的中國(guó)象棋人機(jī)對(duì)弈程序。當(dāng)計(jì)算機(jī)發(fā)明以后,電子游戲又多了一個(gè)新的載體。因此,對(duì)游戲開發(fā)過程中的人工智能技術(shù)的研究自然也就成了業(yè)界的一個(gè)熱門研究方向。程序的大概的思想是:首先使用一個(gè)數(shù)據(jù)結(jié)構(gòu)來描述棋局信息,對(duì)某一特定的棋局信息由著法生成器生成當(dāng)前下棋方所有合法的著法并依次存入著法隊(duì)列。這種表示方法簡(jiǎn)單易行(缺點(diǎn)是效率不是很高)。這些信息由外部讀取棋盤上起點(diǎn)、終點(diǎn)的數(shù)據(jù)獲得。因而,棋局表示好比是整個(gè)程序(計(jì)算機(jī)下棋引擎部分)的地基,之后所有的操作都將建立在其基礎(chǔ)上。 行子的半路上不能有其它子阻攔(除了炮需要隔一個(gè)子才能打子之外)以及行子的目的點(diǎn)不能有本方的棋子(當(dāng)然不能自己吃自己了)。定義第二個(gè)數(shù)組下標(biāo)為80,應(yīng)當(dāng)可以保證十分的安全。他們輪流走棋,目的就是將死對(duì)方,或者避免被將死。如此,當(dāng)輪到甲走棋時(shí)他會(huì)盡可能地讓局面上的分值大,相反輪到乙走棋時(shí)他會(huì)選盡可能地讓局面上的分值小。對(duì)于中國(guó)象棋而言,在中盤時(shí)平均著法數(shù)目大約是40種左右,那么搜索4層需要檢查250萬條路線,搜索5層需要檢查1億條路線,搜索6層需要檢查40億條路線!AlphaBeta搜索能在不影響搜索精度的前提下大幅減少工作量。圖中表示該結(jié)點(diǎn)要取子結(jié)點(diǎn)中的最大值;表示該結(jié)點(diǎn)要取子結(jié)點(diǎn)中的最小值。再來分析結(jié)點(diǎn)A的第二個(gè)子結(jié)點(diǎn)C,結(jié)點(diǎn)C與結(jié)點(diǎn)B同屬一層,它依然是輪到你的對(duì)手作選擇。最基本的AlphaBeta算法的代碼如下:int AlphaBeta(int depth, int alpha, int beta){ if (depth == 0) //如果是葉子節(jié)點(diǎn)(到達(dá)搜索深度要求) return Evaluate()。} 歷史啟發(fā)及著法排序既然AlphaBeta搜索算法是在“最小最大”的基礎(chǔ)上引入“樹的裁剪”的思想以期提高效率,那么它的效率將在很大程度上取決于樹的結(jié)構(gòu)——如果搜索了沒多久就發(fā)現(xiàn)可以進(jìn)行“裁剪”了,那么需要分析的工作量將大大減少,效率自然也就大大提高;而如果直至分析了所有的可能性之后才能做出“裁剪”操作,那此時(shí)“裁剪”也已經(jīng)失去了它原有的價(jià)值(因?yàn)槟阋呀?jīng)分析了所有情況,這時(shí)的AlphaBeta搜索已和“最小最大”搜索別無二致了)。歸并排序的空間復(fù)雜度為O(n),時(shí)間復(fù)雜度為O(nlog2n),具有較高的效率。例如,車值500的話,那可能馬值300,卒值80等等。棋子的相互關(guān)系這一點(diǎn)的分析較為復(fù)雜,因?yàn)橐粋€(gè)棋子與其它子之間往往存在多重關(guān)系。 //存放每一位置被威脅的信息BYTE m_GuardPos[10][9]。比如,一個(gè)車正遭受一個(gè)炮的攻擊,那么任何對(duì)車的保護(hù)都將失去意義——對(duì)方肯定樂意用一個(gè)炮來換一個(gè)車。如下:——象棋相關(guān)定義?!ㄅ判颉? 界面及程序輔助設(shè)計(jì) 界面基本框架關(guān)于界面,建了一個(gè)基于對(duì)話框的MFC應(yīng)用程序。由于棋盤、棋子等都是以位圖的形式給出的。如果之前用戶已經(jīng)選過了棋子,那么這一次的點(diǎn)擊(如果不是另選本方的其它棋子的話)表達(dá)了用戶的一次走棋過程。解決方案就是另外開一個(gè)線程,讓各程序分開于多個(gè)線程。 //計(jì)算機(jī)思考并走棋 return 0。首先,在ChessDlg下定義以下函數(shù):thisGetMoveStr(nFromX,nFromY,nToX,nToY,nSourceID)。要實(shí)現(xiàn)悔棋和還原功能,首先要明確哪些信息應(yīng)當(dāng)被保存以供悔棋和還原所使用。//被吃掉的棋子}UNDOMOVE。以上便是悔棋和還原功能所完成的具體操作,其代碼分別寫入悔棋和還原按鈕(Button)的事件處理函數(shù)中。帥與將不能在同一直線上直接對(duì)面,否則走方判負(fù)。 *炮:炮在不吃子的時(shí)候,走動(dòng)與車完全相同。“資源共享,信息互通” 需要更多相關(guān)設(shè)計(jì)資料和源代碼加:493703123