黑白棋游戲畢業(yè)論文_第1頁(yè)
已閱讀1頁(yè),還剩40頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  摘 要</b></p><p>  程序使用面向?qū)ο蟮腝T庫(kù)的C++語(yǔ)言,開(kāi)發(fā)于可以同時(shí)運(yùn)行于Linux和Windows環(huán)境下的游戲程序。有雙人對(duì)弈,人機(jī)對(duì)弈,無(wú)限悔棋等功能,其中人機(jī)對(duì)弈包含難度選擇和先后手選擇。</p><p>  論文首先指出了黑白棋游戲、Linux桌面環(huán)境、QT開(kāi)發(fā)環(huán)境的發(fā)展現(xiàn)狀,然后重點(diǎn)介紹了QT開(kāi)發(fā)工具的使

2、用、黑白棋的常見(jiàn)戰(zhàn)術(shù)、黑白棋程序的界面設(shè)計(jì)、規(guī)則設(shè)計(jì)、算法設(shè)計(jì)(包含搜索算法、局面估值、α-β減枝、散列表、MTD等當(dāng)今主流算法)、終局搜索、以及作為一款游戲的其他必須功能,最后介紹了Linux桌面環(huán)境 GUI的發(fā)展趨勢(shì)。</p><p>  設(shè)計(jì)通過(guò)一個(gè)棋類游戲的開(kāi)發(fā),闡述了棋類游戲的開(kāi)發(fā)過(guò)程,包括軟件開(kāi)發(fā)的邏輯分析,程序設(shè)計(jì),軟件實(shí)現(xiàn)和軟件測(cè)試幾個(gè)步驟。</p><p>  關(guān)鍵詞:黑

3、白棋;Linux;人工智能;QT</p><p><b>  ABSTRACT</b></p><p>  This programmer used QT Object-Oriented Database C++ language, develops the game which can be run on Linux and Windows environments

4、. has doubles plays , man-machine plays, retract a false move in a chess game boundlessly waiting for a function. Single mode contains degree of difficulty choosing and choosing successively personally.</p><p&

5、gt;  The thesis has pointed out first the Othello, the Linux desktop environment, the development status of QT develop. Then, focuses on the use of QT development tools, Othello common tactical, Othello program interface

6、 design, design of rules, algorithm design (including search algorithms, the valuation of the situation, α-β by sticks, Hash table, MTD algorithm, such as today's mainstream), final search, and as well as other games

7、’ functions. Finally, introduce the GUI desktop environment for Linux</p><p>  This design through the development of a chess game, described the development of chess games, including logic analyzer of softw

8、are development, programming, software achieve and Software Testing, and so on.</p><p>  Key Words :black & white chess; Linux; </p><p><b>  目 錄</b></p><p><b&

9、gt;  緒 論1</b></p><p>  第1章 程序開(kāi)發(fā)技術(shù)介紹4</p><p>  1.1 黑白棋戰(zhàn)略4</p><p>  1.1.1黑白棋規(guī)則4</p><p>  1.1.2黑白棋戰(zhàn)術(shù)分析4</p><p>  1.2相關(guān)實(shí)現(xiàn)環(huán)境8</p><p>  

10、1.2.1 開(kāi)發(fā)環(huán)境8</p><p>  1.2.2 運(yùn)行環(huán)境8</p><p>  1.2.3 硬件環(huán)境9</p><p>  1.3 主要研究?jī)?nèi)容9</p><p>  1.4系統(tǒng)開(kāi)發(fā)的現(xiàn)實(shí)意義9</p><p>  第2章 開(kāi)發(fā)工具QT10</p><p>  2.1 QT簡(jiǎn)

11、介10</p><p>  2.2 QT的使用10</p><p>  2.3 信號(hào)與槽12</p><p>  第3章 黑白棋需求分析14</p><p>  3.1 黑白棋程序界面的需求14</p><p>  3.1.1 調(diào)查對(duì)比同類軟件14</p><p>  3.1.2 確

12、定需求16</p><p>  3.2 黑白棋游戲規(guī)則的需求16</p><p>  3.3 黑白棋程序的其它需求17</p><p>  第4章 黑白棋程序設(shè)計(jì)18</p><p>  4.1 程序流程圖18</p><p>  4.2 主要模塊簡(jiǎn)介18</p><p>  4.2

13、.1繪圖模塊18</p><p>  4.2.2初始化模塊19</p><p>  4.2.3雙人模塊19</p><p>  4.2.4單人模塊19</p><p>  4.2.5規(guī)則模塊19</p><p>  4.2.6悔棋和悔棋恢復(fù)模塊19</p><p>  4.2.7算法

14、模塊19</p><p>  第5章 程序?qū)崿F(xiàn)20</p><p>  5.1 界面實(shí)現(xiàn)20</p><p>  5.2 功能按鈕的實(shí)現(xiàn)21</p><p>  5.3 程序主要函數(shù)23</p><p>  5.4 電腦戰(zhàn)術(shù)分析25</p><p>  5.4.1 棋盤(pán)掃描25&l

15、t;/p><p>  5.4.2判斷行動(dòng)力25</p><p>  5.4.3 四角優(yōu)先戰(zhàn)術(shù)26</p><p>  5.4.4 選擇最佳位置落子27</p><p>  第6章 系統(tǒng)測(cè)試28</p><p>  6.1雙人模式下的測(cè)試28</p><p>  6.1.1 悔棋和悔棋恢復(fù)測(cè)

16、試28</p><p>  6.1.2 PASS情況下的悔棋恢復(fù)29</p><p>  6.1.3 游戲規(guī)則測(cè)試31</p><p>  6.1.4 終局測(cè)試31</p><p>  6.2 單人模式下的測(cè)試31</p><p>  6.2.1 PASS情況的測(cè)試31</p><p&g

17、t;  6.2.2 游戲正常測(cè)試31</p><p>  6.2.3 悔棋測(cè)試32</p><p>  第7章 總結(jié)和展望33</p><p><b>  7.1 總結(jié)33</b></p><p><b>  7.2展望33</b></p><p>  7.2.1

18、人工智能展望33</p><p>  7.2.2 Linux GUI展望34</p><p><b>  致 謝35</b></p><p><b>  參考文獻(xiàn)36</b></p><p><b>  緒 論</b></p><p><b

19、>  黑白棋開(kāi)發(fā)背景</b></p><p>  隨著網(wǎng)絡(luò)技術(shù)的日新月異和計(jì)算機(jī)的普及,當(dāng)今的計(jì)算機(jī)技術(shù)也走上了平民化和娛樂(lè)化的時(shí)代,計(jì)算機(jī)技術(shù)再也不是只能由少數(shù)人掌握的深不可測(cè)的學(xué)問(wèn);同時(shí)個(gè)人計(jì)算機(jī)也由原來(lái)單純的數(shù)值計(jì)算和工業(yè)應(yīng)用逐漸轉(zhuǎn)變成像電視機(jī)一樣的家庭娛樂(lè)中心,伴隨著這種巨大的轉(zhuǎn)變計(jì)算機(jī)軟件的發(fā)展也走向了娛樂(lè)化。</p><p>  尤其是游戲產(chǎn)業(yè)的發(fā)展已經(jīng)成為信

20、息產(chǎn)業(yè)中發(fā)展勢(shì)頭最猛烈最具前景的一個(gè)分支,而游戲廳也漸漸被網(wǎng)吧擠出了正常的營(yíng)業(yè)市場(chǎng),游戲除了單純的個(gè)人娛樂(lè)功能之外,也逐漸向互動(dòng)的方向發(fā)展。游戲的功能不斷按照玩家的需求和愛(ài)好擴(kuò)展延伸進(jìn)化,如今運(yùn)行在各種平臺(tái)上不同名稱,不同內(nèi)容,不同形式的游戲不僅僅為廣大游戲愛(ài)好者提供了豐富的選擇,而且為游戲開(kāi)發(fā)商帶來(lái)了豐厚的回報(bào),游戲產(chǎn)業(yè)吸引著許多程序員去開(kāi)發(fā)更多更新的游戲。</p><p>  基于游戲發(fā)展的歷史和前景,我決定

21、用C++語(yǔ)言開(kāi)發(fā)一款小游戲,游戲內(nèi)容來(lái)自網(wǎng)絡(luò)上日漸流行的一種智力游戲。我希望把平時(shí)界面簡(jiǎn)單、選項(xiàng)復(fù)雜的游戲,在Linux里面做成漂亮的、簡(jiǎn)單的游戲程序,以給Linux玩家一個(gè)新的選擇。</p><p>  人工智能是一門(mén)極富挑戰(zhàn)性的科學(xué),包括十分廣泛的科學(xué),它由不同的領(lǐng)域組成,如機(jī)器學(xué)習(xí),計(jì)算機(jī)視覺(jué)等等,總的說(shuō)來(lái),人工智能研究的一個(gè)主要目標(biāo)是使機(jī)器能夠勝任一些通常需要人類智能才能完成的復(fù)雜工作。但不同的時(shí)代、不同

22、的人對(duì)這種“復(fù)雜工作”的理解是不同的。例如繁重的科學(xué)和工程計(jì)算本來(lái)是要人腦來(lái)承擔(dān)的, 現(xiàn)在計(jì)算機(jī)不但能完成這種計(jì)算, 而且能夠比人腦做得更快、更準(zhǔn)確, 因而當(dāng)代人已不再把這種計(jì)算看作是“需要人類智能才能完成的復(fù)雜任務(wù)”, 可見(jiàn)復(fù)雜工作的定義是隨著時(shí)代的發(fā)展和技術(shù)的進(jìn)步而變化的, 人工智能這門(mén)科學(xué)的具體目標(biāo)也自然隨著時(shí)代的變化而發(fā)展。它一方面不斷獲得新的進(jìn)展, 一方面又轉(zhuǎn)向更有意義、更加困難的目標(biāo)。目前能夠用來(lái)研究人工智能的主要物質(zhì)手段以

23、及能夠?qū)崿F(xiàn)人工智能技術(shù)的機(jī)器就是計(jì)算機(jī), 人工智能的發(fā)展歷史是和計(jì)算機(jī)科學(xué)與技術(shù)的發(fā)展史聯(lián)系在一起的。除了計(jì)算機(jī)科學(xué)以外, 人工智能還涉及信息論、控制論、自動(dòng)化、仿生學(xué)、生物學(xué)、心理學(xué)、數(shù)理邏輯、語(yǔ)言學(xué)、醫(yī)學(xué)和哲學(xué)等多門(mén)學(xué)科。</p><p>  隨著計(jì)算機(jī)處理速度的飛速提高,人們很早就提出了疑問(wèn):計(jì)算機(jī)是否會(huì)超越人類?世界國(guó)際象棋棋王卡斯帕羅夫與美國(guó)IBM公司的RS/6000(深藍(lán))計(jì)算機(jī)系統(tǒng)于1997年5月1

24、1日進(jìn)行了六局“人機(jī)大戰(zhàn)”,結(jié)果“深藍(lán)”以3.5比2.5的總比分獲勝。比賽結(jié)束了給人們留下了深刻的思考;下棋要獲勝要求選手要有很強(qiáng)的思維能力、記憶能力、豐富的下棋經(jīng)驗(yàn),還得及時(shí)做出反應(yīng),迅速進(jìn)行有效的處理,否則一著出錯(cuò)滿盤(pán)皆輸,這顯然是個(gè)“智能”問(wèn)題。盡管開(kāi)發(fā)“深藍(lán)”。</p><p>  計(jì)算機(jī)的IBM專家也認(rèn)為它離智能計(jì)算機(jī)還相差甚遠(yuǎn),但它以高速的并行的計(jì)算能力(2r108步/秒棋的計(jì)算速度)。實(shí)現(xiàn)了人類智力

25、的計(jì)算機(jī)上的部分模擬。那么計(jì)算機(jī)已經(jīng)超過(guò)了人類嗎?看完本文,相信你會(huì)對(duì)計(jì)算機(jī)棋手的智能有所了解。</p><p><b>  課題研究目的和意義</b></p><p>  黑白棋,又叫反棋(Reversi)、奧賽羅棋(Othello),蘋(píng)果棋,翻轉(zhuǎn)棋。黑白棋起源中世紀(jì)的英國(guó),18世紀(jì)傳入日本,并在日本得到了發(fā)展?,F(xiàn)在,黑白棋在西方和日本很流行。游戲通過(guò)相互翻轉(zhuǎn)對(duì)方的

26、棋子,最后以棋盤(pán)上誰(shuí)的棋子多來(lái)判斷勝負(fù)。</p><p>  它的游戲規(guī)則簡(jiǎn)單,因此上手很容易,但是它的變化又非常復(fù)雜。有一種說(shuō)法是:只需要幾分鐘學(xué)會(huì)它,卻需要一生的時(shí)間去精通它。</p><p>  黑白棋不僅能增強(qiáng)思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。黑白棋既有現(xiàn)代休閑的明顯特征“短、平、快”,又有古典哲學(xué)的高深學(xué)問(wèn)“陰陽(yáng)易理”;它既有簡(jiǎn)單易學(xué)的特性,為人民群眾所喜聞樂(lè)見(jiàn),

27、又有深?yuàn)W的技巧和高水平的國(guó)際性比賽;它的棋文化源淵流長(zhǎng),具有東方的神秘和西方的直觀;既有“場(chǎng)”的概念,亦有“點(diǎn)”的連接。它是中西文化的交流點(diǎn),是古今哲理的結(jié)晶。</p><p>  中國(guó)最早出現(xiàn)黑白棋是在80年代的任天堂游戲機(jī)和蘋(píng)果II個(gè)人電腦游戲里,但從那時(shí)一直玩到現(xiàn)在的人已經(jīng)寥寥可數(shù)了,我們只能說(shuō),從那時(shí)起,中國(guó)第一次出現(xiàn)了黑白棋;然后就是1990年的Windows 3.0的推出,當(dāng)時(shí)Windows自帶的游戲

28、就是黑白棋,由于當(dāng)時(shí)電腦還比較少,沒(méi)等到黑白棋傳開(kāi),Windows 3.1推出,把自帶游戲換成現(xiàn)在大家見(jiàn)到的踩地雷和接龍;讓大量人認(rèn)識(shí)黑白棋的是文曲星,文曲星的黑白棋棋力很低,一個(gè)人下了幾盤(pán)以后就可以輕易把它打敗,棋力之低簡(jiǎn)直可以說(shuō)是誤人子弟的地步,讓人一葉障目,不見(jiàn)森林,以為黑白棋不過(guò)爾爾;在90年代中期流行的任天堂Gameboy當(dāng)中也有一款黑白棋游戲,棋力甚為不錯(cuò),比起以上提及的游戲強(qiáng)很多。黑白棋真正發(fā)展起來(lái)還是在互聯(lián)網(wǎng)普及以后(下

29、述:網(wǎng)上黑白棋的興起),黑白棋作為一種經(jīng)典的策略性游戲,受到了廣大網(wǎng)友,特別是得到了希望鍛煉智力的網(wǎng)友的喜愛(ài)。</p><p>  在90年代中期互聯(lián)網(wǎng)開(kāi)始普及,亦冒起了一些大型游戲網(wǎng)站。最先出現(xiàn)的是微軟的Microsoft Games網(wǎng)站,被吸引進(jìn)去下黑白棋的都是各國(guó)的好手,因?yàn)槭峭鈬?guó)網(wǎng)站,當(dāng)時(shí)下棋的華人還是比較少。及后紛紛出現(xiàn)其他網(wǎng)站,具代表性的有: 多國(guó)棋手網(wǎng)站:Playsite、VOG、Yahoo! Ga

30、mes、新浪網(wǎng)、Kurnik(現(xiàn)為PlayOK) 以香港棋手為主:Cybercity 以臺(tái)灣棋手為主:宏碁戲谷、CYC游戲大聯(lián)盟 以大陸棋手為主:Chinaren、聯(lián)眾世界、中國(guó)游戲中心、邊峰網(wǎng)絡(luò)游戲 純學(xué)術(shù)性網(wǎng)站。</p><p>  值得一提的是微軟的Windows XP里自帶了網(wǎng)絡(luò)黑白棋,由于XP的普及讓很多電腦初學(xué)者第一次嘗試真人對(duì)戰(zhàn)?,F(xiàn)今在搜尋引擎能找到的下棋網(wǎng)站已多不勝數(shù)! </p>&

31、lt;p>  原先黑白棋在國(guó)內(nèi)集中在3個(gè)游戲?qū)?zhàn)平臺(tái)——中游、聯(lián)眾和邊鋒。黑白棋的發(fā)展實(shí)際上是伴隨著中國(guó)網(wǎng)絡(luò)的發(fā)展。三大平臺(tái)鼎盛時(shí)期也是中國(guó)黑白棋的鼎盛時(shí)期。期間高手輩出,新人不斷?,F(xiàn)在國(guó)內(nèi)最強(qiáng)的一批高手都是那個(gè)時(shí)期成長(zhǎng)起來(lái)的。 </p><p>  由于網(wǎng)絡(luò)下棋可以通過(guò)一些手段作弊,導(dǎo)致人類黑白棋玩家積極性下降。大事件后,不少黑白棋玩家的積極性大大受挫。加之各個(gè)平臺(tái)對(duì)于程序沒(méi)有很好的控制。導(dǎo)致高手流向國(guó)外

32、較好的平臺(tái)下棋。國(guó)內(nèi)三大平臺(tái)漸漸衰落。 </p><p>  最近,qq游戲推出了黑白棋游戲?;趒q用戶的基數(shù)龐大,在線下黑白棋的玩家數(shù)量達(dá)到了前所未有的地步。原先消失的高手們也紛紛出現(xiàn)。中國(guó)黑白棋出現(xiàn)了欣欣向榮的景象。 </p><p>  但值得注意的是,qq黑白棋對(duì)于外掛和程序也沒(méi)有較好的控制。平臺(tái)上的玩家水平較低。不少玩家對(duì)于黑白棋尚未真正了解。希望qq游戲可以借鑒前人,完善自我

33、。中國(guó)黑白棋也可以有更好的發(fā)展。 </p><p>  第1章 程序開(kāi)發(fā)技術(shù)介紹</p><p><b>  1.1 黑白棋戰(zhàn)略</b></p><p>  1.1.1黑白棋規(guī)則</p><p> ?。?)兩人對(duì)弈,以輪流方式持黑子與白子。</p><p> ?。?)開(kāi)辟新局者持白子,加入者持黑子

34、, 之后以輪流方式將棋子置于棋盤(pán)格子中。若無(wú)地方可下子,則跳過(guò)一回,由對(duì)方下子。</p><p> ?。?)在提示的格子中,選擇一個(gè)格子下子, 當(dāng)下子的位置與離最近的同色旗子中, 若有其他棋子則中間的棋子變?yōu)榕c我方一樣顏色。</p><p>  (4)當(dāng)下滿64個(gè)棋子,棋子多者為勝。</p><p>  1.1.2黑白棋戰(zhàn)術(shù)分析</p><p&g

35、t;  黑白棋規(guī)則規(guī)定對(duì)局結(jié)束時(shí)子多的一方為勝方,于是初學(xué)者通常會(huì)一開(kāi)始使勁吃子,這實(shí)際上是犯了短視的錯(cuò)誤。每一步都盡可能吃更多的子,我們把這種下法叫做大食策略(MAXIMUM DISC STRATEGY)。除了大食策略以外,還有其它幾種常用的策略以及重要位置和術(shù)語(yǔ),它們是:</p><p> ?。?) 爬邊(CREEPING ALONG EDGES)  </p>

36、;<p>  余裕手戰(zhàn)術(shù)運(yùn)用到極致就是爬邊戰(zhàn)術(shù),下棋的一方?jīng)Q定放棄對(duì)中間的控制,而多在邊上下子,出現(xiàn)的情況經(jīng)常和圖1-1類似。  </p><p>  圖1-1爬邊戰(zhàn)術(shù)圖一</p><p>  爬邊戰(zhàn)術(shù)的使用者通常占一條邊或兩條相鄰邊,而把中間和前線留給對(duì)手。</p><p>  圖1-2爬邊戰(zhàn)術(shù)圖二</p><p>

37、  爬邊戰(zhàn)術(shù)成功時(shí),對(duì)方由于不能吃你邊上的子,而會(huì)發(fā)現(xiàn)無(wú)子可下。在圖26中,黑h7,白c7必然,黑c8,白棋就不得不下g7讓角了(見(jiàn)圖1-2)。  </p><p>  一般來(lái)說(shuō),爬邊戰(zhàn)術(shù)能快速消耗對(duì)方行動(dòng)力,但它同時(shí)會(huì)引起不平衡邊、弱勢(shì)邊、影響將來(lái)吃子等諸多問(wèn)題。該戰(zhàn)術(shù)一旦失敗就不可挽回,所以爬邊戰(zhàn)術(shù)是一種不成功便成仁的戰(zhàn)術(shù)。  </p><p> ?。?)奇偶性(P

38、ARITY)  </p><p>  奇偶性是行動(dòng)力理論中不可或缺的一部分,如果在對(duì)局過(guò)程中,雙方都沒(méi)有pass,則當(dāng)黑方下棋時(shí),棋盤(pán)上的空格數(shù)目總是偶數(shù),當(dāng)白方下棋時(shí),空格數(shù)總是奇數(shù),白方總是下到最后的一顆子,最后一步的白子和所吃的子都不會(huì)再被對(duì)方吃掉,所以后下的一方占一些便宜??匆幌聢D1-3的例子,如果黑先,黑g8白h8,勝如果白先,則無(wú)論白先下g8還是h8,黑棋都將獲勝!</p>&

39、lt;p>  圖1-3奇偶性戰(zhàn)術(shù)圖一</p><p>  圖1-4奇偶性戰(zhàn)術(shù)圖二</p><p>  如果在好幾個(gè)區(qū)域(每個(gè)區(qū)域里的空格都是偶數(shù))白棋都后下時(shí),這種優(yōu)勢(shì)將十分明顯。看圖30的例子,有4個(gè)空兩格的區(qū)域,每個(gè)區(qū)域黑棋都是先下,白棋后下,那么正常次序就是g2-h1-g7-h8-b7-a8-b1-a1,白40-24勝。  </p><p> 

40、 由于奇偶性原理,白棋在后盤(pán)戰(zhàn)斗中有先天優(yōu)勢(shì),但黑棋有辦法把這種奇偶性優(yōu)勢(shì)轉(zhuǎn)換成自己的優(yōu)勢(shì):如果在對(duì)局過(guò)程中,有一方pass,奇偶性情況就發(fā)生一次轉(zhuǎn)換,pass兩次,奇偶性又回到有利于白棋的狀態(tài),所以黑要想辦法讓對(duì)局過(guò)程發(fā)生奇數(shù)次pass。 </p><p> ?。?)四通陷阱(STONER TRAPS)  </p><p>  對(duì)非平衡邊的攻擊,并不總是引起換角,

41、被攻擊方有選擇的權(quán)利。下面我們看一個(gè)強(qiáng)制轉(zhuǎn)換的例子,這個(gè)例子和非平衡邊一樣,一方先發(fā)起攻擊,但是跟非平衡邊不一樣的時(shí),被攻擊方除了讓對(duì)方進(jìn)角外,別無(wú)它法。  </p><p>  四通陷阱的形成分兩個(gè)步驟,首先,攻擊方下X-格后獲得對(duì)角線的控制,然后攻擊不平衡邊,準(zhǔn)備進(jìn)角。這時(shí),被攻擊方一旦吃回,就會(huì)同時(shí)吃掉前面一步所下的X格,圖36給出了一個(gè)例子。 </p><p>  圖1-

42、5四通陷阱戰(zhàn)術(shù)圖一</p><p>  這里,黑棋南邊有弱點(diǎn),白下b7取得e4-b7對(duì)角線的控制(見(jiàn)圖1-5),黑棋不能馬上進(jìn)a8角,黑棋會(huì)盡量搶占對(duì)角線上點(diǎn)以進(jìn)角,應(yīng)f3為正常次序。但在這時(shí),白下d8(見(jiàn)圖38),黑棋已經(jīng)沒(méi)有辦法來(lái)阻止白棋下h8進(jìn)角了。</p><p>  圖1-6四通陷阱戰(zhàn)術(shù)圖二</p><p>  如果黑應(yīng)b8,那么黑棋會(huì)吃掉b7,從而把a(bǔ)8

43、和h8拱手相讓。如果黑下a8,白棋可以馬上下h8,或者在b8楔入而保留以后下h8的權(quán)利。如果黑方不應(yīng),白棋仍然可以下h8進(jìn)角(這就是四通陷阱和一般非平衡邊的不同之處)。  </p><p>  圖1-7四通陷阱戰(zhàn)術(shù)圖三</p><p>  通過(guò)上述黑白棋戰(zhàn)術(shù)的簡(jiǎn)單描述,希望能對(duì)您理解黑白棋的復(fù)雜性有所幫助。黑白棋的規(guī)則雖然很簡(jiǎn)單,但它的變化卻非常復(fù)雜,不愧是經(jīng)典的益智游戲。這里小

44、小的篇幅不能無(wú)法涵蓋黑白棋在法國(guó)和世界上幾十年的發(fā)展,我們只是希望通過(guò)這個(gè)入門(mén)教材,能幫你更好地享受黑白棋的樂(lè)趣。如果你希望得到更多的內(nèi)容,歡迎訪問(wèn)法國(guó)黑白棋協(xié)會(huì),這里有論壇、有關(guān)書(shū)籍、俱樂(lè)部、比賽。</p><p><b>  1.2相關(guān)實(shí)現(xiàn)環(huán)境</b></p><p>  本程序采用QT庫(kù)及其開(kāi)發(fā)環(huán)境,使用C++語(yǔ)言開(kāi)發(fā)運(yùn)行于Linux系統(tǒng)KDE桌面環(huán)境下的黑白棋

45、游戲。</p><p>  經(jīng)過(guò)實(shí)際檢測(cè),QT強(qiáng)大的跨平臺(tái)性,已經(jīng)保證了同樣的代碼在Windows XP下、Linux GNOME下、Linux KDE下,幾乎不用修改就能正常運(yùn)行。</p><p>  1.2.1 開(kāi)發(fā)環(huán)境</p><p>  qt-sdk-linux-x86-opensource-2009.01</p><p><b

46、>  MinGW編譯器</b></p><p>  1.2.2 運(yùn)行環(huán)境</p><p> ?。?)Linux環(huán)境</p><p> ?。?)Fedora 10 ? Linux with KDE</p><p> ?。?)Fedora 10 ? Linux with Gnome</p><p> ?。?/p>

47、4)Windows環(huán)境</p><p> ?。?)Microsoft® Windows XP sp2</p><p>  1.2.3 硬件環(huán)境</p><p>  AMD® Sempron® 2600+,1024M內(nèi)存,160G硬盤(pán)。</p><p>  1.3 主要研究?jī)?nèi)容</p><p&g

48、t;  本文將對(duì)計(jì)算機(jī)棋手下黑白棋做一個(gè)全面綜述,介紹計(jì)算機(jī)對(duì)黑白棋戰(zhàn)術(shù)分析的全過(guò)程,包括對(duì)圖形和動(dòng)畫(huà)的處理、對(duì)棋盤(pán)搜索的算法、對(duì)棋局做出正確的估計(jì)、并生成最佳走法,并將介紹其中各個(gè)流程的研究狀況及實(shí)用技術(shù)。本文的重點(diǎn)放在計(jì)算機(jī)對(duì)當(dāng)前棋局的分析,并做出最佳的選擇。</p><p>  介紹搜索算法,棋類游戲不可能一步就決出勝負(fù),象棋中不可能第一步就將對(duì)方將死;而對(duì)某個(gè)棋局的判斷也不可能完全精確,在黑白棋中,初局時(shí)

49、棋子多并不一定最終取得勝利,因?yàn)閷?duì)手可能在后面的博弈過(guò)程中將局面扭轉(zhuǎn)。想想人類下棋時(shí),一般會(huì)假設(shè)我走這步,那么對(duì)手會(huì)怎樣回應(yīng),如果對(duì)手回應(yīng)了某一步,我再走哪一步,如果對(duì)手回應(yīng)了另外某一步,我又該怎么走;然后再假設(shè)我走另外的某一步,如此反復(fù)下去。這個(gè)過(guò)程叫做搜索。</p><p>  1.4系統(tǒng)開(kāi)發(fā)的現(xiàn)實(shí)意義</p><p>  利用這次畢業(yè)設(shè)計(jì)的機(jī)會(huì)可以熟悉c++語(yǔ)言的各種特性,鍛煉程序設(shè)

50、計(jì)的實(shí)踐能力,熟悉c++語(yǔ)言Linux下的開(kāi)發(fā)環(huán)境,熟悉前沿的Linux圖形用戶界面的開(kāi)發(fā),以及鞏固數(shù)據(jù)結(jié)構(gòu)和算法等課程的學(xué)習(xí)成果,并深入理解數(shù)據(jù)結(jié)構(gòu)和算法在程序設(shè)計(jì)中的核心地位。</p><p>  同時(shí),借助開(kāi)發(fā)本游戲的過(guò)程,可以熟悉人工智能的程序?qū)崿F(xiàn),有助于掌握棋類所需人工智能的常見(jiàn)算法,隨著游戲產(chǎn)業(yè)的日益壯大,人工智能在游戲中的突出表現(xiàn),人工智能越來(lái)越得到世人的重視。在這次的人機(jī)對(duì)戰(zhàn)算法中,通過(guò)一定的算法

51、,實(shí)現(xiàn)電腦的下棋及走棋運(yùn)作,加深了對(duì)人工智能工作原理的了解。 </p><p>  綜上所述,通過(guò)每次黑白棋的開(kāi)發(fā),可以深入了解Linux編程方法、加深了解AI算法。</p><p>  第2章 開(kāi)發(fā)工具QT</p><p><b>  2.1 QT簡(jiǎn)介</b></p><p>  Qt是一個(gè)跨平臺(tái)的C++圖形用戶界面庫(kù)

52、,由挪威TrollTech公司出品,目前包括Qt,基于Framebuffer的Qt Embedded,快速開(kāi)發(fā)工具Qt Designer,國(guó)際化工具 Qt Linguist等部分Qt支持所有Unix系統(tǒng),當(dāng)然也包括 Linux,還支持 WinNT/Win2k,Win95/98 平臺(tái)。</p><p>  Qt是一個(gè)多平臺(tái)的C++圖形用戶界面應(yīng)用程序框架。它提供給應(yīng)用程序開(kāi)發(fā)者建立藝術(shù)級(jí)的圖形用戶界面所需的所用功能

53、。Qt是完全面向?qū)ο蟮暮苋菀讛U(kuò)展,并且允許真正地組件編程。</p><p>  自從1996年早些時(shí)候,Qt進(jìn)入商業(yè)領(lǐng)域,它已經(jīng)成為全世界范圍內(nèi)數(shù)千種成功的應(yīng)用程序的基礎(chǔ)。Qt也是流行的Linux桌面環(huán)境KDE 的基礎(chǔ),KDE是所有主要的Linux發(fā)行版的一個(gè)標(biāo)準(zhǔn)組件。</p><p>  基本上,Qt同X Window上的Motif、Openwin、GTK等圖形界面庫(kù)和Windows 平

54、臺(tái)上的MFC、OWL、VCL、ATL是同類型的東西,但是Qt具有下列優(yōu)點(diǎn):</p><p> ?。?)優(yōu)良的跨平臺(tái)特性:</p><p>  Qt支持下列操作系統(tǒng): Microsoft Windows 95/98、 Microsoft Windows NT、 linux、Solaris、SunOS、HP-UX、Digital UNIX (OSF/1、Tru64)、Irix、FreeBSD,

55、 BSD/OS、SCO、AIX、OS390、QNX 等等。</p><p><b>  (2)面向?qū)ο螅?lt;/b></p><p>  Qt 的良好封裝機(jī)制使得Qt的模塊化程度非常高,可重用性較好,對(duì)于用戶開(kāi)發(fā)來(lái)說(shuō)是非常方便的。Qt提供了一種稱為signals/slots的安全類型來(lái)替代 callback,這使得各個(gè)元件之間的協(xié)同工作變得十分簡(jiǎn)單。</p>

56、<p> ?。?)豐富的API:</p><p>  Qt 包括多達(dá)250個(gè)以上的C++類,還提供基于模板的collections、 serialization、file、I/O device、Directory management、date/time 類。甚至還包括正則表達(dá)式的處理功能。</p><p>  (4)支持2D/3D圖形渲染,支持OpenGL。</p>

57、;<p><b>  2.2 QT的使用</b></p><p>  本文以一個(gè)最常用的例子HelloWorld的開(kāi)發(fā)過(guò)程,作為QT編程的入門(mén)。</p><p><b>  需要的代碼如下:</b></p><p>  #include <qapplication.h></p>&l

58、t;p>  #include <qpushbutton.h></p><p>  Int main( int argc, char **argv )</p><p><b>  { </b></p><p>  QApplication a( argc, argv ); </p><p>  QPush

59、Button hello( "Hello world!", 0 ); </p><p>  hello.resize( 300, 100 ); </p><p>  a.setMainWidget( &hello ); </p><p>  hello.show(); </p><p>  return a.exe

60、c(); </p><p><b>  }</b></p><p>  #include <qapplication.h></p><p><b>  代碼解釋:</b></p><p>  這一行包含了QApplication類的定義。在每一個(gè)使用Qt的應(yīng)用程序中都必須使用一個(gè)QApp

61、lication對(duì)象。QApplication管理了各種各樣的應(yīng)用程序的廣泛資源,比如默認(rèn)的字體和光標(biāo)。 </p><p>  #include <qpushbutton.h></p><p>  這一行包含了QPushButton類的定義。參考文檔的文件的最上部分提到了使用哪個(gè)類就必須包含哪個(gè)頭文件的說(shuō)明。 </p><p>  QPushButton

62、是一個(gè)經(jīng)典的圖形用戶界面按鈕,用戶可以按下去,也可以放開(kāi)。它管理自己的觀感,就像其它每一個(gè)QWidget。一個(gè)窗口部件就是一個(gè)可以處理用戶輸入和繪制圖形的用戶界面對(duì)象。程序員可以改變它的全部觀感和它的許多主要的屬性(比如顏色),還有這個(gè)窗口部件的內(nèi)容。一個(gè)QPushButton可以顯示一段文本或者一個(gè)QPixmap。</p><p>  int main( int argc, char **argv )</

63、p><p>  main()函數(shù)是程序的入口。幾乎在使用Qt的所有情況下,main()只需要在把控制轉(zhuǎn)交給Qt庫(kù)之前執(zhí)行一些初始化,然后Qt庫(kù)通過(guò)事件來(lái)向程序告知用戶的行為。</p><p>  argc是命令行變量的數(shù)量,argv是命令行變量的數(shù)組。這是一個(gè)C/C++特征。它不是Qt專有的,無(wú)論如何Qt需要處理這些變量。 </p><p>  QApplication

64、 a( argc, argv )</p><p>  a是這個(gè)程序的QApplication。它在這里被創(chuàng)建并且處理這些命令行變量(比如在X窗口下的-display)。請(qǐng)注意,所有被Qt識(shí)別的命令行參數(shù)都會(huì)從argv中被移除(并且argc也因此而減少)。</p><p><b>  接下來(lái)是編譯:</b></p><p>  編譯一個(gè)C++應(yīng)用

65、程序,你需要?jiǎng)?chuàng)建一個(gè)makefile。創(chuàng)建一個(gè)Qt的makefile的最容易的方法是使用Qt提供的連編工具qmake。如果你已經(jīng)把main.cpp保存到它自己的目錄了,你所要做的就是這些: </p><p>  qmake *.pro</p><p><b>  make </b></p><p>  第一個(gè)命令調(diào)用qmake來(lái)生成一個(gè).pro

66、(項(xiàng)目)文件。第二個(gè)命令根據(jù)這個(gè)項(xiàng)目文件來(lái)生成一個(gè)(系統(tǒng)相關(guān)的)makefile。你現(xiàn)在可以輸入make,然后運(yùn)行你的第一個(gè)Qt應(yīng)用程序! </p><p>  運(yùn)行后效果如圖2-1所示</p><p>  圖2-1 QT開(kāi)發(fā)的Hello World</p><p><b>  2.3 信號(hào)與槽</b></p><p>

67、  QT不同于其他開(kāi)發(fā)工具的一個(gè)重要特點(diǎn),就是信號(hào)與槽。</p><p>  信號(hào)和槽用于對(duì)象間的通訊。信號(hào)/槽機(jī)制是Qt的一個(gè)中心特征并且也許是Qt與其它工具包的最不相同的部分。</p><p>  在圖形用戶界面編程中,我們經(jīng)常希望一個(gè)窗口部件的一個(gè)變化被通知給另一個(gè)窗口部件。更一般地,我們希望任何一類的對(duì)象可以和其它對(duì)象進(jìn)行通訊。例如,如果我們正在解析一個(gè)XML文件,當(dāng)我們遇到一個(gè)新

68、的標(biāo)簽時(shí),我們也許希望通知列表視圖我們正在用來(lái)表達(dá)XML文件的結(jié)構(gòu)。</p><p>  圖 2-2 一個(gè)關(guān)于一些信號(hào)和槽連接的摘要圖</p><p>  在Qt中我們有一種可以替代回調(diào)的技術(shù)。我們使用信號(hào)和槽。當(dāng)一個(gè)特定事件發(fā)生的時(shí)候,一個(gè)信號(hào)被發(fā)射。Qt的窗口部件有很多預(yù)定義的信號(hào),但是我們總是可以通過(guò)繼承來(lái)加入我們自己的信號(hào)。槽就是一個(gè)可以被調(diào)用處理特定信號(hào)的函數(shù)。Qt的窗口部件又很

69、多預(yù)定義的槽,但是通常的習(xí)慣是你可以加入自己的槽,這樣你就可以處理你所感興趣的信號(hào)。 信號(hào)和槽的機(jī)制是類型安全的:一個(gè)信號(hào)的簽名必須與它的接收槽的簽名相匹配。(實(shí)際上一個(gè)槽的簽名可以比它接收的信號(hào)的簽名少,因?yàn)樗梢院雎灶~外的簽名。)因?yàn)楹灻且恢碌模幾g器就可以幫助我們檢測(cè)類型不匹配。信號(hào)和槽是寬松地聯(lián)系在一起的:一個(gè)發(fā)射信號(hào)的類不用知道也不用注意哪個(gè)槽要接收這個(gè)信號(hào)。Qt的信號(hào)和槽的機(jī)制可以保證如果你把一個(gè)信號(hào)和一個(gè)槽連接起來(lái),槽會(huì)

70、在正確的時(shí)間使用信號(hào)的參數(shù)而被調(diào)用。信號(hào)和槽可以使用任何數(shù)量、任何類型的參數(shù)。它們是完全類型安全的:不會(huì)再有回調(diào)核心轉(zhuǎn)儲(chǔ)(core dump)。</p><p>  圖 2-3 一個(gè)信號(hào)和槽連接的例子 </p><p>  信號(hào)與插槽機(jī)制是一個(gè)函數(shù),原型如下:</p><p>  QObject::connect( &a, SIGNAL(funtionA()

71、), &b, SLOT(funtionB()) )</p><p>  這一行在兩個(gè)Qt對(duì)象(直接或間接繼承QObject對(duì)象的對(duì)象)中建立了一種單向的連接。每一個(gè)Qt對(duì)象都有signals(發(fā)送消息)和slots(接收消息)。所有窗口部件都是Qt對(duì)象。它們繼承QWidget,而QWidget繼承QObject。該函數(shù)意思是a部件發(fā)出 funtionA()消息,b部件執(zhí)行funtionB()函數(shù)。<

72、/p><p>  第3章 黑白棋需求分析</p><p>  3.1 黑白棋程序界面的需求</p><p>  3.1.1 調(diào)查對(duì)比同類軟件</p><p>  為了獲取一款黑白棋程序需要滿足的功能,我在網(wǎng)上查閱了大量前人做好的黑白棋程序。</p><p>  具有可比性的黑白棋程序有如下幾款,傷心黑白棋(見(jiàn)圖3-1)、億

73、唯黑白棋1.35(見(jiàn)圖3-2)、Monkey黑白棋1.0(見(jiàn)圖3-3)、以及大名鼎鼎的WZebra(見(jiàn)圖3-4)。</p><p>  圖3-1 傷心黑白棋</p><p>  圖3-2 億唯黑白棋1.35</p><p>  圖3-3 Monkey黑白棋1.0</p><p>  圖3-4 WZebra</p><p&g

74、t;  這四款游戲程序都能滿足玩家游戲的基本需求,但是使用起來(lái)還是帶給用戶以不同的體驗(yàn)。</p><p><b>  (1)傷心黑白棋:</b></p><p>  界面簡(jiǎn)潔、游戲棋力強(qiáng),具有棋子數(shù)目顯示、顯示上步棋位置、先后手選擇、單人雙人模式、悔棋和悔棋恢復(fù)、難度選擇、提示下棋點(diǎn)、聲音提示、棋盤(pán)翻轉(zhuǎn)、棋局保存及讀取等功能。</p><p>

75、  不足之處:悔棋、開(kāi)局等常用設(shè)置主界面不顯示,使用過(guò)程中要在菜單欄尋找。作為一款游戲,沒(méi)有考慮到程序的便捷性。作為一款游戲,界面不夠美觀。</p><p>  (2)億唯黑白棋1.35:</p><p>  界面較為簡(jiǎn)潔、游戲棋力較強(qiáng),具有棋子數(shù)目顯示、顯示上步棋位置、先后手選擇、單人雙人模式、悔棋和悔棋恢復(fù)、難度選擇、提示下棋點(diǎn)、聲音提示、棋盤(pán)翻轉(zhuǎn)、棋局保存及讀取、動(dòng)畫(huà)翻轉(zhuǎn)棋子、本局棋

76、譜顯示等功能。并在主界面上放置了常用功能按鈕,為用戶操作提供便捷性。</p><p>  不足之處:常用快捷鍵有點(diǎn)多,降低游戲開(kāi)發(fā)簡(jiǎn)單為好的原則。作為一款游戲,界面不夠美觀。</p><p> ?。?)Monkey黑白棋1.0:</p><p>  界面另類,給人以耳目一新的感覺(jué),人機(jī)對(duì)戰(zhàn)中會(huì)給玩家提示電腦認(rèn)為較好的位置。程序功能直觀。沒(méi)有菜單欄等的干擾。具有棋子數(shù)

77、目顯示、顯示上步棋位置、先后手選擇、悔棋和悔棋恢復(fù)、難度選擇、提示下棋點(diǎn)、聲音提示等功能。</p><p>  不足之處:作為一款游戲,大膽使用透明界面,無(wú)形中就增加了游戲的樂(lè)趣,但布局有些亂,背景透明和其他背景融合一起,長(zhǎng)時(shí)間游戲會(huì)對(duì)該界面產(chǎn)生反感。 實(shí)際調(diào)查中,本點(diǎn)已被程序作者接受,在Monkey黑白棋2.0中,已經(jīng)取消透明背景。</p><p> ?。?)WZebra:<

78、/p><p>  WZebra功能齊全、算法優(yōu)異、棋力深厚、電腦思考速度快,在黑白棋中處于老大的地位。其他黑白棋中有的功能本游戲中都有。</p><p>  不足之處:作為一款程序,他當(dāng)之無(wú)愧很成功,但作為一款游戲,它主界面上豐富的按鈕,并不會(huì)帶給玩家良好的用戶體驗(yàn)。</p><p>  3.1.2 確定需求</p><p>  通過(guò)上述網(wǎng)上常見(jiàn)

79、的一些具有代表性的黑白棋程序的對(duì)比分析,現(xiàn)在一個(gè)基于界面上的用戶需求已經(jīng)基本確立。該需求包含以下幾點(diǎn):</p><p> ?。?)作為按鈕出現(xiàn)在主界面上的:</p><p>  先后手選擇、單人雙人模式、悔棋和悔棋恢復(fù)、難度選擇、開(kāi)始新游戲。</p><p>  (2)能夠直觀顯示在游戲界面上的:</p><p>  棋子數(shù)目顯示、顯示上步棋

80、位置、提示下棋點(diǎn)、動(dòng)畫(huà)翻轉(zhuǎn)棋子。</p><p>  3.2 黑白棋游戲規(guī)則的需求</p><p>  第二章中已經(jīng)介紹了黑白棋游戲的規(guī)則,主要有如下規(guī)則:</p><p> ?。?)兩人對(duì)弈,以輪流方式持黑子與白子。</p><p> ?。?)開(kāi)辟新局者持黑子,加入者持白子, 之后以輪流方式將棋子置于棋盤(pán)格子中。若無(wú)地方可下子,則跳過(guò)一回,

81、由對(duì)方下子。</p><p>  (3)在提示的格子中,選擇一個(gè)格子下子, 當(dāng)下子的位置與離最近的同色旗子中, 若有其他棋子則中間的棋子變?yōu)榕c我方一樣顏色。</p><p> ?。?)當(dāng)下滿64個(gè)棋子,棋子多者為勝。</p><p> ?。?)雙方都無(wú)棋可走的其他局面,游戲結(jié)束,以子多者為勝。</p><p>  黑白棋游戲規(guī)則,是程序設(shè)計(jì)是

82、需要考慮的內(nèi)部需求,該部分需求,和前面的游戲界面需求,以及下小節(jié)的其他需求,功能構(gòu)成了黑白棋程序的基本需求。</p><p>  3.3 黑白棋程序的其它需求</p><p>  一個(gè)良好的游戲不僅要有一個(gè)好的界面來(lái)吸引用戶興趣,還需要把凡是不是必須有用戶做出選擇的地方都去掉。</p><p>  比如,在雙方下棋中,一方無(wú)棋可走,切換到另一方,這時(shí)只需要在界面上給

83、出提示即可,不需要彈出一個(gè)對(duì)話框的形式,告訴本步棋要pass,并提示玩家點(diǎn)擊該對(duì)話框來(lái)繼續(xù)游戲,這樣會(huì)降低游戲的可玩性。</p><p>  同樣的問(wèn)題也出現(xiàn)在用戶點(diǎn)擊退出時(shí),不少程序會(huì)彈出圖3-5的對(duì)話框來(lái)要求用戶確認(rèn)。這是見(jiàn)仁見(jiàn)智的選擇,本文認(rèn)為不符合用戶的需求,因此也去掉了。</p><p>  第4章 黑白棋程序設(shè)計(jì)</p><p><b>  4

84、.1 程序流程圖</b></p><p>  程序所需執(zhí)行的流程見(jiàn)圖4-1,該圖表示出了程序執(zhí)行的流程,也基本表示出了程序的各個(gè)模塊和相互關(guān)系,后面的詳細(xì)設(shè)計(jì)和代碼實(shí)現(xiàn),就是基于本圖設(shè)計(jì)的。</p><p>  圖4-1 黑白棋流程圖</p><p>  4.2 主要模塊簡(jiǎn)介</p><p>  為了實(shí)現(xiàn)黑白棋游戲的開(kāi)發(fā),通過(guò)流程

85、圖的分析,計(jì)劃采用以下幾大模塊。</p><p><b>  4.2.1繪圖模塊</b></p><p>  本模塊用來(lái)負(fù)責(zé)主界面的繪制,包括棋盤(pán)、棋子、個(gè)數(shù)統(tǒng)計(jì)、時(shí)間顯示、以及其它需要顯示的部分的繪圖。</p><p>  繪圖模塊的實(shí)現(xiàn),主要通過(guò)重載QT庫(kù)中自帶的繪圖函數(shù)來(lái)實(shí)現(xiàn)。</p><p>  4.2.2初始化

86、模塊</p><p>  初始化模塊是一個(gè)函數(shù),用來(lái)負(fù)責(zé)開(kāi)局時(shí)的棋盤(pán)初始化,主要負(fù)責(zé)把程序代碼中各變量值初始化。初始化函數(shù)再程序首次執(zhí)行時(shí)自動(dòng)調(diào)用,中途通過(guò)點(diǎn)擊新游戲按鍵調(diào)用。</p><p><b>  4.2.3雙人模塊</b></p><p>  雙人模塊是本程序得以運(yùn)行的基礎(chǔ),本模塊通過(guò)判斷用戶鼠標(biāo)點(diǎn)擊位置,判斷出該坐標(biāo)所處棋盤(pán)中響應(yīng)位

87、置,并通過(guò)后面的規(guī)則模塊決定能否下子,如果能下子就下己方棋子,并交換為對(duì)手走棋。</p><p><b>  4.2.4單人模塊</b></p><p>  單人模塊是基于雙人模塊的,當(dāng)玩家點(diǎn)擊棋盤(pán)并成功走棋后,把交換對(duì)手部分,變?yōu)榻粨Q至電腦走棋,電腦則通過(guò)算法模塊走出電腦認(rèn)為最佳位置,并等待玩家繼續(xù)走棋。</p><p>  因此,本黑白棋開(kāi)

88、發(fā)過(guò)程中,把單人模塊看成是雙人模塊的一部分來(lái)處理。</p><p><b>  4.2.5規(guī)則模塊</b></p><p>  走棋模塊是黑白棋的基礎(chǔ),它負(fù)責(zé)判斷哪些位置能走棋,并在成功走棋后,翻轉(zhuǎn)所需棋子后,并再次負(fù)責(zé)判斷出對(duì)方可走棋位置。</p><p>  本模塊包括翻轉(zhuǎn)函數(shù)、以及判斷可下子位置函數(shù)。</p><p&g

89、t;  4.2.6悔棋和悔棋恢復(fù)模塊</p><p>  本模塊通過(guò)每次走棋記錄棋譜,以便用戶能夠全局悔棋,并全局恢復(fù),但是當(dāng)悔棋過(guò)程中,用戶再次走棋,則后繼步數(shù)不能恢復(fù)。</p><p>  人機(jī)對(duì)弈模式下,只允許玩家悔當(dāng)前的兩步棋(計(jì)算機(jī)一步,玩家一步)。</p><p>  雙人網(wǎng)絡(luò)對(duì)弈模式下,悔棋的過(guò)程為:首先由玩家向?qū)Ψ桨l(fā)送悔棋請(qǐng)求(悔棋消息),然后由對(duì)方

90、決定是否允許玩家悔棋,在玩家得到對(duì)方的響應(yīng)消息(允許或者拒絕)之后,才進(jìn)行悔棋與否的操作。這是應(yīng)該做到的,但實(shí)際編碼中,沒(méi)有開(kāi)發(fā)網(wǎng)絡(luò)對(duì)弈,因此雙人悔棋無(wú)需確認(rèn),但每次只悔一步棋。</p><p><b>  4.2.7算法模塊</b></p><p>  算法模塊是人機(jī)對(duì)戰(zhàn)的關(guān)鍵,是AI函數(shù)的具體設(shè)計(jì)部分。考慮到黑白棋的實(shí)際情況,決定把算法分成三大部分:開(kāi)局算法、中局

91、算法和終局算法。</p><p>  開(kāi)局算法首先通過(guò)棋譜庫(kù)調(diào)用已有棋譜,如果棋譜庫(kù)中沒(méi)有該棋譜,則自動(dòng)調(diào)用中局算法。開(kāi)局算法由于采用棋譜庫(kù),程序執(zhí)行較快。</p><p>  中局算法采用減枝和棋盤(pán)位置估值以及其他黑白棋常用估值方法,并給每種不同估值賦一權(quán)值,進(jìn)行估值合并,選擇出估值最高的位置,并在該處下棋。中局算法由于棋局中期可走位置較多,致使中局算法執(zhí)行較慢。</p>

92、<p>  終局算法,終局算法是窮舉某一步到棋局結(jié)束的所有可能走法,選出對(duì)自己最有利的位置,并走棋。由于臨近終局,最后位置較少,因此程序執(zhí)行較快。</p><p><b>  第5章 程序?qū)崿F(xiàn)</b></p><p>  通過(guò)第3章和第4章的描述,黑白棋設(shè)計(jì)思路已經(jīng)確定,現(xiàn)在要做的就是把設(shè)計(jì)結(jié)果翻譯成專用的程序設(shè)計(jì)語(yǔ)言所書(shū)寫(xiě)的程序。編碼是對(duì)設(shè)計(jì)的進(jìn)一步具體化

93、,本部分的質(zhì)量取決于前期設(shè)計(jì)的質(zhì)量,但是,所選設(shè)計(jì)語(yǔ)言的特點(diǎn)及編碼風(fēng)格也會(huì)對(duì)程序的可靠性、可讀性、可測(cè)試性和可維護(hù)性產(chǎn)生影響。</p><p><b>  5.1 界面實(shí)現(xiàn)</b></p><p>  為了增加游戲的美觀,界面采用專業(yè)繪圖工具制作出來(lái)的漂亮圖片作為程序背景和棋盤(pán)背景。本程序利用FireWorks對(duì)網(wǎng)絡(luò)上的一些圖片做了修改,并作為程序背景使用。</

94、p><p>  界面的顯示,是把上述背景圖作為資源文件,通過(guò)重載QT庫(kù)自帶的paintEvent(QPaintEvent *e)函數(shù),來(lái)繪制背景棋盤(pán)。 效果見(jiàn)圖5-1。</p><p>  圖5-1 黑白棋背景圖</p><p>  葉子狀的是程序背景,木紋狀的是棋盤(pán)背景。之所以不作為一個(gè)圖片保存背景,是為了便于以后棋盤(pán)改變布局位置。</p><p&

95、gt;  在左邊有總用時(shí)和本步用時(shí)兩個(gè)小模塊,這是用QTDesigner自帶的控件繪制的,計(jì)劃用于上方走棋時(shí)間統(tǒng)計(jì)。</p><p>  為了使這兩個(gè)小模塊好看些,也加上了背景,同時(shí)背景的上半部分,用來(lái)標(biāo)示黑白雙方,以及顯示雙方當(dāng)前局面棋子個(gè)數(shù),并用高亮方式,表示出當(dāng)前該哪一方走棋。</p><p>  背景界面設(shè)計(jì)好了,再加上常用功能鍵、其它選擇按鈕等,一個(gè)程序打開(kāi)的初始界面就確定了,見(jiàn)

96、圖5-2</p><p>  圖5-2 黑白棋主界面</p><p>  重載QT庫(kù)自帶的paintEvent(QPaintEvent *e)函數(shù)的方法如下,首先定義用來(lái)統(tǒng)計(jì)黑白兩色棋子個(gè)數(shù),初始值為0,接著生成繪圖對(duì)象,并加載需要繪制的各個(gè)元素,然后并繪制出來(lái),以及繪制其他相關(guān)元素。</p><p>  5.2 功能按鈕的實(shí)現(xiàn)</p><p&g

97、t;  用QT開(kāi)發(fā)GUI程序,不如MFC容易,但只要掌握了QT的方法,還是很輕松的。如圖5-2的上方部分的按鈕,可以用QTDesigner里面的控件直接繪制出來(lái)。</p><p>  然而這是顯性的繪制,點(diǎn)擊該按鈕并不能直接執(zhí)行相應(yīng)的函數(shù)。而是通過(guò)信號(hào)與槽機(jī)制響應(yīng)相關(guān)函數(shù)。</p><p>  信號(hào)與槽的機(jī)制在2.3節(jié)中有介紹。再次我們要給新游戲按鈕與初始化函數(shù)建立聯(lián)系,即:</p&

98、gt;<p>  QObject::connect(pushButton_new, SIGNAL(clicked()), Form, SLOT(initialize()))。</p><p>  pushButton_new為新游戲部件名稱,本句話意思是點(diǎn)擊新游戲按鈕,程序執(zhí)行初始化(initialize())函數(shù)。</p><p>  其他按鈕已通過(guò)信號(hào)與槽機(jī)制和相關(guān)功能的

99、函數(shù)連接起來(lái),具體連接請(qǐng)參照附錄一主要代碼部分。</p><p>  本程序使用到的信號(hào)與槽,見(jiàn)圖5-3所示。同時(shí),圖5-3也標(biāo)識(shí)出QTDesigne在本程序開(kāi)發(fā)中所能發(fā)揮的全部作用。</p><p>  圖5-3 QTDesigner完成的作用</p><p>  Designer不能顯示白色的文本內(nèi)容(見(jiàn)圖5-3左下角數(shù)字2),但為了標(biāo)示白棋的顏色,需要在代碼部

100、分借助QPalette類的setColor函數(shù)來(lái)改變本控件的文本顏色,相關(guān)實(shí)現(xiàn)代碼見(jiàn)附錄一 主要代碼部分。</p><p>  結(jié)合著相關(guān)函數(shù)介紹實(shí)現(xiàn)代碼:</p><p>  本部分主要是把信號(hào)和槽進(jìn)行部件之間的連接,這部分在Designer里面會(huì)自動(dòng)生成。但是自定義的槽函數(shù),要聲明稱public slots形式。</p><p>  對(duì)應(yīng)圖5-3,本程序用到的信

101、號(hào)槽代碼和功能如下:</p><p>  QObject::connect(pushButton_new, SIGNAL(clicked()), Form, SLOT(initialize())),點(diǎn)擊開(kāi)始按鈕,程序初始化。</p><p>  QObject::connect(pushButton_backward, SIGNAL(clicked()), Form, SLOT(backw

102、ard())),點(diǎn)擊后退按鈕,執(zhí)行后退相關(guān)函數(shù)。</p><p>  QObject::connect(pushButton_forward, SIGNAL(clicked()), Form, SLOT(forward())),點(diǎn)擊前進(jìn)按鈕執(zhí)行前進(jìn)函數(shù)。</p><p>  QObject::connect(checkBox_tip, SIGNAL(clicked()), Form, SL

103、OT(update())),點(diǎn)擊tip按鈕,執(zhí)行刷新函數(shù),刷新過(guò)程中,根據(jù)該組件是否被選中,決定時(shí)候繪制提示點(diǎn)。</p><p>  QObject::connect(radio_single, SIGNAL(clicked(bool)), checkBox_2, SLOT(setEnabled(bool))),點(diǎn)擊單人游戲按鈕,改變?cè)摻M件狀態(tài)為選中模式,從而決定在mousePressEvent(QMouseEv

104、ent *e)里面執(zhí)行單人模式。</p><p>  QObject::connect(radio_double, SIGNAL(clicked(bool)), checkBox_2, SLOT(setDisabled(bool))) ,點(diǎn)擊單人游戲按鈕,改變?cè)摻M件狀態(tài)為選中模式,從而決定在mousePressEvent(QMouseEvent *e)里面執(zhí)行雙人模式。</p><p> 

105、 QObject::connect(radio_single, SIGNAL(clicked(bool)), radioButton_lv1, SLOT(setEnabled(bool))),點(diǎn)擊單人游戲按鈕,如果該按鈕被選中,則難度選擇按鈕為可更改狀態(tài),下面兩個(gè)相同。</p><p>  QObject::connect(radio_single, SIGNAL(clicked(bool)), radioBut

106、ton_lv2, SLOT(setEnabled(bool)))。</p><p>  QObject::connect(radio_single, SIGNAL(clicked(bool)), radioButton_lv3, SLOT(setEnabled(bool)))。</p><p>  QObject::connect(radio_double, SIGNAL(clicked(

107、bool)), radioButton_lv1, SLOT(setDisabled(bool))) 點(diǎn)擊雙人游戲按鈕,如果該按鈕被選中,則難度選擇按鈕為不可更改狀態(tài),下面兩個(gè)相同。</p><p>  QObject::connect(radio_double, SIGNAL(clicked(bool)), radioButton_lv2, SLOT(setDisabled(bool)))。</p>

108、<p>  QObject::connect(radio_double, SIGNAL(clicked(bool)), radioButton_lv3, SLOT(setDisabled(bool)))。</p><p>  QObject::connect(checkBox_2, SIGNAL(clicked()), Form, SLOT(update())),該處選中,執(zhí)行動(dòng)畫(huà)效果。</p&

109、gt;<p>  QObject::connect(radio_single, SIGNAL(clicked()), Form, SLOT(doubletosingle())),該處選中,執(zhí)行雙人到單人模式切換函數(shù)doubletosingle(),判斷如果該電腦走棋,則電腦走一步棋。</p><p>  5.3 程序主要函數(shù)</p><p>  從程序表面看,這是一個(gè)二維平面

110、圖,所以數(shù)據(jù)用二維數(shù)組類來(lái)表示,數(shù)組兩個(gè)下標(biāo)可以表示棋盤(pán)上的位置,數(shù)組元素的值代表棋格上的狀態(tài),共有五種情況,分別是0代表可下子格,1代表黑棋,-1代表黑棋,-2代表絕對(duì)不能下的位置,2代表需要判斷才知道能否下的位置。</p><p>  程序首次打開(kāi),執(zhí)行initialize()函數(shù)初始化棋局,用戶可以直接走棋或者選擇單人模式等一些功能。</p><p>  當(dāng)用戶點(diǎn)擊棋盤(pán)某一位置時(shí),響

111、應(yīng)mousePressEvent(QMouseEvent *e)函數(shù),判斷鼠標(biāo)點(diǎn)擊位置,如果能下棋則執(zhí)行onestep(int x,int y)函數(shù)在該方格內(nèi)走一步棋。并交由對(duì)方可能是另一名玩家,或者電腦走棋。</p><p>  mousePressEvent(QMouseEvent *e)函數(shù)的執(zhí)行過(guò)程如下:首先通過(guò)點(diǎn)擊鼠標(biāo)位置獲取點(diǎn)擊坐標(biāo),并判斷該處是否能下子,不能下子退出該函數(shù)。該位置能下子,執(zhí)行ones

112、tep(judgepos(x),judgepos(y))走一步棋。玩家走一步棋之后,如果是單人模式執(zhí)行,則交由電腦走棋。電腦走棋首先進(jìn)行難度判斷,并結(jié)合著棋局步數(shù)判斷,選擇不同的函數(shù)進(jìn)行搜索,搜索結(jié)束,電腦執(zhí)行onestep(judgepos(x), judgepos(y))走一步棋,退出該函數(shù)。 </p><p>  在調(diào)用onestep(int x,int y)函數(shù)時(shí),程序首先通過(guò)mousePressEven

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論