版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 目 錄</b></p><p> 1.軟硬件運行環(huán)境1</p><p> 1.1 運行環(huán)境1</p><p> 1.2 編寫語言1</p><p> 1.3 編寫工具1</p><p> 2.算法設(shè)計思想2</p><p>
2、; 2.1 走法生成2</p><p> 2.2 選擇最佳走法2</p><p> 2.3 局面評估3</p><p> 3.算法的流程圖4</p><p> 3.1 走法生成4</p><p> 3.1.1 馬的走法生成4</p><p> 3.1.2 兵的走法生成
3、5</p><p> 3.1.3 炮的走法生成6</p><p> 3.1.4 車的走法生成7</p><p> 3.1.5 搜索算法8</p><p> 4.算法的實現(xiàn)與分析9</p><p> 4.1 走法生成9</p><p> 4.1.1 馬的走法生成9</
4、p><p> 4.1.2 炮的走法生成9</p><p> 4.1.3 車的走法生成10</p><p> 4.1.4 兵的走法生成10</p><p> 4.2 搜索算法11</p><p> 4.2.1 搜索樹11</p><p> 4.3 局面評估12</p>
5、;<p> 4.3.1 棋子價值評估12</p><p> 4.3.2 棋子位置分值12</p><p> 4.3.3 棋子靈活性分值12</p><p> 4.3.4 其他復(fù)雜的局面評估13</p><p> 5.運行結(jié)果與分析14</p><p><b> 6.總結(jié)1
6、5</b></p><p><b> 參考文獻16</b></p><p><b> 1.軟硬件運行環(huán)境</b></p><p><b> 1.1 運行環(huán)境</b></p><p> Windows XP,Windows 7。</p><
7、;p><b> 1.2 編寫語言</b></p><p><b> C++</b></p><p><b> 1.3 編寫工具</b></p><p> Visual C++ 6.0</p><p><b> 2.算法設(shè)計思想</b><
8、;/p><p><b> 2.1 走法生成</b></p><p> 走法就是一個棋子從一個位置移動到另一個位置。所以走法包含三要素:棋子、起點、終點。</p><p> 每種棋子都有自己的行走規(guī)則,計算機程序進行走法生成,都是先窮舉再排除。即先列舉出全部可能的位置,再一個一個除去不合規(guī)則的走法,剩下的就是合理的走法。</p>
9、<p> 不同棋子走法生成的共同點:</p><p> 找出棋子的下一個可能位置n。</p><p> ? 判斷n是否在棋盤上。</p><p> ? 判斷n是否被本方棋子占據(jù)。</p><p> 不同棋子應(yīng)考慮的問題:</p><p> ? 將、士是否走出九宮。</p>&l
10、t;p> ? 象是否過河,象眼是否被堵。</p><p><b> ? 馬是否蹩腳。</b></p><p> ? 炮要翻山吃子。</p><p> ? 兵過河前只能前進,過河后可以前進和左右移動。</p><p> (1)各棋子按其行子規(guī)則行子。諸如馬跳“日”字、象走“田”字、士在九宮內(nèi)斜行等等
11、(這里需要特別注意的是卒的行子規(guī)則隨其所在位置不同而會發(fā)生變化——過河后可以左右平移)。</p><p> (2)行子不能越出棋盤界限。當(dāng)然所有子都不能走到棋盤的外面,同時某些特定的子還有自己的行棋界限,如將、士不能出九宮,象不能過河。</p><p> (3)行子的半路上不能有子阻攔(除了炮隔子打子之外)以及行子的目的點不能有本方棋子(當(dāng)然不能自己吃自己了)。</p>
12、<p> (4)將帥不能碰面(本程序中只認(rèn)為將帥碰面是非法的,而其它“送死”的著法并不非法,只是產(chǎn)生敗局罷了)</p><p> 產(chǎn)生了著法后要將其存入著法隊列以供搜索之用,由于搜索會搜索多層(即考慮雙方你來我往好幾步,這樣才有利于對局面進行評估而盡可能避免“目光短淺” ),所以在存著法隊列的時候還要同時存儲該著法所屬的搜索層數(shù)。因此我將著法隊列定義為二維數(shù)組MoveList[12][80],第一個
13、下標(biāo)為層數(shù),第二個下標(biāo)為每一層的全部著法數(shù)。</p><p> 2.2 選擇最佳走法</p><p> 考慮到下棋的情景。棋局進行到某個時候,輪到電腦走棋。電腦可能有幾十種走法,但它只能選擇一個走法。電腦走任何一步棋,局面發(fā)生變化輪到人走棋,人也可能有幾十種走法,他也只能選擇一個。電腦要考慮每一個走法的好壞,同時也要考慮它走了之后人會如何走棋。整個問題像樹一樣展開,問題復(fù)雜度呈幾何指數(shù)
14、上</p><p><b> 2.3 局面評估</b></p><p> 局面評估,也可以說是局面估值,就是判斷局面對某一方的優(yōu)勢,并把優(yōu)勢進行量化。在象棋程序中如果說搜索算法是心臟,那么局面評估就是大腦。搜索算法負責(zé)驅(qū)動整個程序,而局面評估則負責(zé)對搜索的內(nèi)容進行判斷評價對局面進行評估并量化結(jié)果的目的是為了在多個局面之間進行比較,從而得到有利得局面,并得到合適的走
15、法。局面評估中需要考慮幾個因素包括如下四點:</p><p><b> (1)棋子價值評估</b></p><p> (2)棋子位置分值(控制區(qū)域)</p><p> (3)棋子靈活性分值</p><p> (4)其他復(fù)雜的局面評估</p><p><b> 3.算法的流程圖&
16、lt;/b></p><p><b> 3.1 走法生成</b></p><p> 3.1.1 馬的走法生成</p><p><b> 如圖3-1所示:</b></p><p><b> 圖 3-1</b></p><p> 3.1.2
17、兵的走法生成</p><p><b> 如圖3-2所示:</b></p><p><b> 圖 3-2</b></p><p> 3.1.3 炮的走法生成</p><p><b> 如圖3-3所示:</b></p><p><b>
18、圖 3-3</b></p><p> 3.1.4 車的走法生成</p><p><b> 如圖3-4所示:</b></p><p> 3.1.5 搜索算法</p><p><b> 如圖3-5所示:</b></p><p><b> 圖 3-5
19、</b></p><p> 4.算法的實現(xiàn)與分析</p><p><b> 4.1 走法生成</b></p><p> 4.1.1 馬的走法生成</p><p><b> 輸入:馬的位置p</b></p><p> 輸出:馬的所有可能走法</p&g
20、t;<p><b> 現(xiàn)在位置p</b></p><p> 八個可行方向(i=0…7)</p><p><b> 計算下一個位置n</b></p><p><b> n是否在棋盤上</b></p><p><b> 是,轉(zhuǎn)第5步</b&g
21、t;</p><p><b> 否,轉(zhuǎn)第2步</b></p><p> 從p到n的馬腿位置m上是否有棋子</p><p><b> 有,轉(zhuǎn)第2步</b></p><p><b> 沒有,轉(zhuǎn)第6步</b></p><p> n是否被本方棋子占據(jù)&
22、lt;/p><p><b> 是,轉(zhuǎn)第2步</b></p><p> 否,保存可行的走法,考慮下一位置轉(zhuǎn)第2步</p><p> 4.1.2 炮的走法生成</p><p><b> 輸入:炮的位置p</b></p><p> 輸出:炮的所有可能走法</p>
23、<p><b> 現(xiàn)在位置p</b></p><p><b> 四個可行方向</b></p><p> 翻山標(biāo)志0,OverFlag=0</p><p> 沿這個方向繼續(xù)前進一步(最多前進9步)</p><p><b> 計算下一個位置n</b></
24、p><p><b> n是否在棋盤上</b></p><p><b> 是,轉(zhuǎn)第6步</b></p><p><b> 否,轉(zhuǎn)第2步</b></p><p><b> n位置上是否有棋子</b></p><p><b>
25、; 沒有棋子</b></p><p> 如果OverFlag==0,保存可行的走法(不吃子走法),轉(zhuǎn)第3步</p><p><b> 否則,轉(zhuǎn)第3步</b></p><p><b> 有棋子則</b></p><p> 如果OverFlag==0,則令OverFlag=1(翻山
26、)</p><p> 否則,該棋子是否為本方棋子</p><p> 不是,保存可行的走法(吃子走法),轉(zhuǎn)第2步</p><p><b> 是,轉(zhuǎn)第2步</b></p><p> 4.1.3 車的走法生成</p><p> 輸入:車的位置position</p><p&
27、gt; 輸出:車的所有可能走法</p><p> 現(xiàn)在位置position</p><p> 四個可行方向 //第一重循環(huán)</p><p> 沿著這個方向繼續(xù)前進一步(最多9步) //第二重循環(huán)</p><p> 計算下一位置next</p><p> next是否在棋盤上</p>
28、;<p><b> 是,轉(zhuǎn)第6步</b></p><p><b> 否,轉(zhuǎn)第2步</b></p><p> next位置上是否有棋子</p><p> 沒有,保存可行走法,考慮下一位置轉(zhuǎn)第3步(不吃子走法)</p><p> 有棋子,判斷該棋子是否本方棋子</p>
29、<p><b> 是,轉(zhuǎn)第2步</b></p><p> 否,保存可行走法,考慮下一位置轉(zhuǎn)第2步(吃子走法)</p><p> 4.1.4 兵的走法生成</p><p> 輸入:兵的位置position</p><p> 輸出:兵的所有可能的走法</p><p> 現(xiàn)在的
30、位置position</p><p><b> 三個可行方向</b></p><p> 計算下一個位置next=position+PawnDir[side][n];</p><p> Next是否在棋盤上</p><p><b> 是,轉(zhuǎn)第5步</b></p><p>
31、;<b> 否,轉(zhuǎn)第2步</b></p><p><b> 是否未過河橫向移動</b></p><p><b> 是,轉(zhuǎn)第2步</b></p><p><b> 否,轉(zhuǎn)第6步</b></p><p> next是否被本方棋子占據(jù)</p>
32、;<p><b> 是,轉(zhuǎn)第2步</b></p><p> 否,保存可行走法,考慮下一位置轉(zhuǎn)第2步</p><p><b> 4.2 搜索算法</b></p><p><b> 4.2.1 搜索樹</b></p><p> 定義搜索深度depth,本方最
33、優(yōu)值best</p><p><b> 返回值value</b></p><p> search(depth,best,worst)</p><p><b> {</b></p><p> 紅方走棋時,best=無窮大</p><p> 黑方,best=無窮小<
34、;/p><p> 若深度小于等于0,調(diào)用局面評估函數(shù)分析局面</p><p> 若深度大于0,調(diào)用生成走法函數(shù),并判斷可用走法。</p><p> for每一個可用走法</p><p><b> 執(zhí)行走法</b></p><p> 遞歸調(diào)用搜索函數(shù)value = - search(); de
35、pth -1;</p><p><b> 撤銷算法</b></p><p><b> If 紅方走棋</b></p><p> If(value >best)</p><p> Best=value</p><p> If(depth=Maxdepth) //
36、Maxdepth為設(shè)置的最多搜索層數(shù)</p><p> Bestmove = 當(dāng)前走法</p><p><b> Else</b></p><p> If(value<best)</p><p> Best=value</p><p> If(depth=Maxdepth)<
37、/p><p> Bestmove=當(dāng)前走法</p><p> Return best</p><p><b> }</b></p><p><b> 4.3 局面評估</b></p><p> 4.3.1 棋子價值評估</p><p> 不同的
38、棋子都有不同的價值。詳見下表:</p><p> 根據(jù)基本價值,可以得到一個最初的評估算法:</p><p><b> 輸入:棋盤數(shù)組</b></p><p><b> 輸出:局面估值</b></p><p> wValue:紅方棋子價值的總和</p><p> b
39、Value:黑方棋子價值的總和</p><p> wValue = bValue = 0 ;</p><p> 1 行變量 row = 3 to 12</p><p> 2 列變量 list = 3 to 11</p><p> 對應(yīng)一維數(shù)組下標(biāo)chessman = row<<4 + j ;</p><
40、p> 如果chessman位置已出界,則</p><p><b> 返回第2步</b></p><p> pc為chessman位置對應(yīng)的棋子</p><p> 如果pc為紅方棋子,則</p><p> wValue += pc棋子對應(yīng)的子力值</p><p><b>
41、 否則</b></p><p> bValue += pc棋子對應(yīng)的子力值</p><p> return wValue – bValue</p><p> 4.3.2 棋子位置分值</p><p> 一個棋子在棋局中的真正價值,不僅與固定分值有關(guān),還與所處位置有關(guān)。</p><p> 定義一個三
42、維數(shù)組來表示在不同棋子在不同位置的分值:</p><p> static const unsigned char PositionValues[2][7][256] ; </p><p> 第一維表示走方,0為黑方,1為紅方,第二維表示棋子種類,0到6分別表示士、象、炮、將、馬、卒、車,第三維表示位置。</p><p> 位置分值根據(jù)棋手多年的經(jīng)驗而得,有些難
43、以量化,只能盡量模擬。</p><p> 4.3.3 棋子靈活性分值</p><p> 棋子所在位置的重要性,通過位置分值已經(jīng)體現(xiàn)。但即使是在同一位置,如果周圍全是棋子,限制了棋子的靈活性,這樣往往會陷入被動挨打的局面。由此可見,靈活性在行棋中還是占有相當(dāng)重要的作用。</p><p><b> 棋子靈活性的度量:</b></p>
44、;<p> 棋子靈活性的度量只能以棋子能走棋步數(shù)來體現(xiàn),能走的位置越多,靈活性越高。因此,在估值函數(shù)中計算每一個棋子的行棋步數(shù),然后再給以一定分值的獎勵。</p><p> 各個棋子的靈活性分值分別為:</p><p> 將:2,士:2,馬:5,車:4,炮:3,卒:2</p><p> 棋子每有一種走法,就增加一個靈活性分值。</p>
45、;<p> 4.3.4 其他復(fù)雜的局面評估</p><p> 一盤棋局的局勢跟本方棋子間的協(xié)作有關(guān),跟對方棋子的牽制有關(guān)。</p><p> 馬踏在九宮格附近威脅較大,應(yīng)該加分,而當(dāng)馬踏在四條邊線上時,因走法受限很容易被對方攻擊,應(yīng)該減分。</p><p> 當(dāng)兩個馬踏成連環(huán)馬時,威力比兩個單馬要大,這是棋子之間的協(xié)作,應(yīng)該加分。一個棋子處于另
46、一個棋子的保護范圍內(nèi),都可以說是協(xié)作。還有一些固定的進攻組合和防守組合,也應(yīng)該考慮,如馬炮,車馬,過河卒連在一起,擔(dān)子炮,等等。</p><p> 當(dāng)一個棋子收到對方棋子的攻擊時,就是受到對方棋子的牽制,應(yīng)該減分。</p><p><b> 還有更多的因素:</b></p><p> 區(qū)域合作問題,典型的三子歸邊。凡有車、馬、炮等三個進攻
47、性的棋子集結(jié)在一起,就有可能構(gòu)成各種殺勢。</p><p> 對將得威脅。如,車炮置中路或底路,都有潛在對將的威脅。</p><p> 每一種情況的加分減分只有通過實驗來解決。設(shè)置不同的加減分值,看程序如何表現(xiàn),通過不斷調(diào)整,最后達到一個相對合理的值。</p><p><b> 5.運行結(jié)果與分析</b></p><p
48、> 運行正常,所有的錯誤操作都有判斷。</p><p><b> 6.總結(jié)</b></p><p> 通過本次課程設(shè)計課,我們的編程能力得到了加強,而且使我們更深刻的體會到數(shù)據(jù)結(jié)構(gòu)與算法的重要性。為了讓電腦能更快速的做出更準(zhǔn)確的判斷,我們不斷改進算法。</p><p> 在技術(shù)上,知道了很多先進的算法,例如Alpha-Beta搜索
49、算法。還學(xué)會了用MFC編寫窗口程序。</p><p> 在團隊合作上,我們分工明確,這使得我們的進展一直按著計劃進行。同時,我們的團隊意識也得到了提高。</p><p><b> 參考文獻</b></p><p> 1 蔣鵬, 雷貽祥,陳園園. C\C++中國象棋程序入門與提高. 電子工業(yè)出版社, 2009:1-166</p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--數(shù)據(jù)結(jié)構(gòu)課程設(shè)計----huffman編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)迷宮課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)迷宮課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---迷宮
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計 (3)
評論
0/150
提交評論