版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 本科畢業(yè)論文</b></p><p><b> (20 屆)</b></p><p> 基于VC++的五子棋程序設(shè)計(jì)與實(shí)現(xiàn)</p><p><b> 摘 要</b></p><p> C++語言是一種面向?qū)ο蟮恼Z言,盡管在當(dāng)前,可視化語
2、言發(fā)展迅速,普及很快,但C++語言作為一種基礎(chǔ)的語言,它的有時(shí)依然存在,甚至有時(shí)它是不可替代的,特別是和硬件接口技術(shù)相聯(lián)系的軟件。五子棋游戲是一種簡單大眾的游戲,自計(jì)算機(jī)實(shí)現(xiàn)以來,深受廣大電腦玩家的喜愛,現(xiàn)在流行的五子棋游戲軟件大多缺乏美觀的界面,和容易的操作方法,電腦的AI值也不是很高。本文通過C++語言在計(jì)算機(jī)圖形方面的編程,設(shè)計(jì)了五子棋游戲軟件,使該軟件具有還算美觀和操作簡單的界面,在人機(jī)對(duì)戰(zhàn)時(shí),分為低級(jí),中級(jí)和專家級(jí),加大對(duì)游戲
3、的樂趣,當(dāng)然也可以實(shí)行人人對(duì)戰(zhàn)。本游戲是以C++語言作為開發(fā)工具,采用搜索算法設(shè)計(jì)最優(yōu)落子點(diǎn)開發(fā)的游戲軟件。本文就是介紹五子棋軟件設(shè)計(jì)的全過程。</p><p> 關(guān)鍵字 C++語言 面向?qū)ο?最優(yōu)落子</p><p><b> Abstract</b></p><p> C + + language is an object-orie
4、nted language, although in the current, visual language developed rapidly, spread quickly, but the C + + language as a basic language, it is sometimes still exists, and sometimes it is irreplaceable, especially with hard
5、ware interface technology associated software. Volkswagen backgammon game is a simple game, since the computer to realize, the majority of PC gamers love, now popular backgammon game software lacks most beautiful interfa
6、ce, and easy method of opera</p><p> Keyword C++ language Object-oriented the optimal initial</p><p><b> 目錄</b></p><p><b> 1緒論6</b></p><
7、;p> 1.1五子棋的簡介6</p><p> 1.2 Visual C++的介紹7</p><p> 1.3 開發(fā)環(huán)境及運(yùn)行環(huán)境7</p><p> 1.3.1 開發(fā)環(huán)境7</p><p> 1.3.2 運(yùn)行環(huán)境7</p><p><b> 2 系統(tǒng)分析8</b>&
8、lt;/p><p><b> 2.1系統(tǒng)調(diào)研8</b></p><p> 2.2可行性分析8</p><p> 2.3 技術(shù)可行性分析9</p><p><b> 3軟件架構(gòu)10</b></p><p> 3.1 棋盤類10</p>&
9、lt;p> 3.1.1主要成員變量10</p><p> 3.2 主要成員函數(shù)說明10</p><p> 3.2.1 清空棋盤10</p><p> 3.2.2 繪制棋子10</p><p> 3.2.3 左鍵消息11</p><p> 3.2.4 繪制棋盤11</p>&l
10、t;p> 3.2.5 對(duì)方落子完畢11</p><p> 3.2.6 勝負(fù)的判斷11</p><p> 3.3 游戲模式類11</p><p> 3.3.1主要成員變量11</p><p> 3.3.2主要成員函數(shù)12</p><p> 3.4 資源編輯13</p><
11、p> 3.5消息說明15</p><p> 3.5.1落子消息15</p><p> 3.5.2聲音消息15</p><p> 3.5.3提示消息15</p><p> 3.5.4悔棋消息15</p><p> 3.5.5輸贏消息15</p><p> 3.5.6
12、再次開局消息16</p><p><b> 4主要算法17</b></p><p> 4.1判斷勝負(fù)17</p><p> 4.2人機(jī)對(duì)弈算法17</p><p> 4.2.1獲勝組合18</p><p> 4.2.2落子后處理18</p><p>
13、 4.2.3查找棋盤空位18</p><p> 4.2.4落子打分18</p><p> 4.2.5防守策略18</p><p> 4.2.6選取最佳落子19</p><p><b> 5 軟件實(shí)現(xiàn)19</b></p><p> 5.1游戲運(yùn)行19</p>&l
14、t;p><b> 6補(bǔ)充說明23</b></p><p><b> 7結(jié)論24</b></p><p><b> 致謝24</b></p><p><b> 1緒論</b></p><p><b> 1.1五子棋的簡介<
15、;/b></p><p> 五子棋是起源于中國古代的傳統(tǒng)黑白棋種之一?,F(xiàn)代五子棋日文稱之為“連珠”,英譯為“Renju”,英文稱之為“Gobang”或“FIR”(Five in a Row的縮寫),亦有“連五子”、“五子連”、“串珠”、“五目”、“五目碰”、“五格”等多種稱謂。 </p><p> 五子棋不僅能增強(qiáng)思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。五子棋既有現(xiàn)代
16、休閑的明顯特征“短、平、快”,又有古典哲學(xué)的高深學(xué)問“陰陽易理”;它既有簡單易學(xué)的特性,為人民群眾所喜聞樂見,又有深?yuàn)W的技巧和高水平的國際性比賽;它的棋文化源淵流長,具有東方的神秘和西方的直觀;既有“場”的概念,亦有“點(diǎn)”的連接。它是中西文化的交流點(diǎn),是古今哲理的結(jié)晶。</p><p> 五子棋的娛樂性強(qiáng)、規(guī)則簡單、易學(xué)、流行性廣,普通人不需長時(shí)間專門訓(xùn)練即可自如行棋,因此極受大眾喜歡。</p>
17、<p><b> 五子棋規(guī)則為: </b></p><p> 第一:五子棋行棋時(shí),黑棋先下第一子,由天元開始,后白棋在黑棋周圍的交叉點(diǎn)的落子。接著黑方再以天元中心的25個(gè)交叉點(diǎn)的范圍內(nèi)落盤面的第三子,之后黑白雙方相互順序子。</p><p> 第二:最先在棋盤線交點(diǎn)橫向,縱向,斜向形成已方的五個(gè)棋子連續(xù)的一方為勝。第三:出現(xiàn)禁手對(duì)方指出后將判負(fù),其中包
18、括兩個(gè)或兩個(gè)以上的活三,活四,長連均稱之為禁手。 </p><p> 第四:禁手只對(duì)黑棋有效,白棋無禁手。</p><p> 第五:黑方禁手形成時(shí),白方需立即指出,黑方將被判負(fù)。若白方未發(fā)現(xiàn)黑方禁手存在而繼續(xù)應(yīng)子,其后指出黑方禁手不能判黑方負(fù)。</p><p> 第六:黑方連五與禁手同時(shí)形成,因黑方已連成五即黑方已獲勝,故禁手規(guī)則失效。 </p>
19、<p> 第七:在對(duì)局中,在盤上落下的子又拿起來,此動(dòng)作稱為拔子,若拔子將被判為負(fù)。</p><p> 第八:在對(duì)局中棋子掉落在棋盤上將被判負(fù)。若推子或蹭子,以盤面第一落點(diǎn)為準(zhǔn)。用手將棋子推正不算違犯規(guī)則。</p><p> 第九:在對(duì)局中,一方自行中止比賽如:中途退場,將被判負(fù)。</p><p> 第十:在對(duì)局中對(duì)方宣布認(rèn)輸,本局獲勝。<
20、;/p><p> 第十一:超過比賽規(guī)定所用時(shí)間限制,將被判為負(fù):正式比賽期間,遲到時(shí)間超過比賽容許時(shí)間將被判負(fù)。 </p><p> 第十二:如下至最終一子仍不分勝負(fù)則定為平局。</p><p> 第十三:中盤期間雙方 同意和局提議,判定為平局。</p><p> 1.2 Visual C++的介紹</p><p&g
21、t; Visual C++ 6.0,簡稱VC或者VC6.0,是微軟推出的一款C++編譯器,將“高級(jí)語言”翻譯為“機(jī)器語言(低級(jí)語言)”的程序。Visual C++是一個(gè)功能強(qiáng)大的可視化軟件開發(fā)工 具。自1993年Microsoft公司推出Visual C++1.0后,隨著其新版本的不斷問世,Visual C++已成為專業(yè)程序員進(jìn)行軟件開發(fā)的首選工具。雖然微軟公司推出了 Visual C++.NET(Visual C++7.0),但它
22、的應(yīng)用有很大的局限性,只適用于Windows 2000、Windows XP和Windows NT4.0。所以實(shí)際中,更多的是以Visual C++6.0為平臺(tái)。Visual C++6.0由Microsoft開發(fā), 它不僅是一個(gè)C++ 編譯器,而且是一個(gè)基于Windows操作系統(tǒng)的可視化集成開發(fā)環(huán)境(integrated development environment,IDE)。Visual C++6.0由許多組件組成,包括編輯器、調(diào)試
23、器以及程序向?qū)ppWizard、類向?qū)lass Wizard等開發(fā)工具。 這些組件通過一個(gè)名為Developer Studi</p><p> Visual C++6.0以擁有“語法高亮”,自動(dòng)編譯功能以及高級(jí)除錯(cuò)功能而著稱。比如,它允許用戶進(jìn)行遠(yuǎn)程調(diào)試,單步執(zhí)行等。還有允許用戶在調(diào)試期間重新編譯被修改的代碼,而不必重新啟動(dòng)正在調(diào)試的程序。其編譯及創(chuàng)建預(yù)編譯頭文件(stdafx.h)、最小重建功能及累加連結(jié)
24、(link)著稱。這些特征明顯縮短程序編輯、編譯及連結(jié)的時(shí)間花費(fèi),在大型軟件計(jì)劃上尤其顯著。</p><p> 1.3 開發(fā)環(huán)境及運(yùn)行環(huán)境 </p><p> 1.3.1 開發(fā)環(huán)境</p><p> Intel® Pentium® 4 2.0GHz,512M內(nèi)存,80G硬盤;</p><p> Microsoft&
25、#174; Windows? 2000 Professional;</p><p> Microsoft® Visual C++ 6.0;</p><p> Microsoft® Developer Network for Visual Studio.NET 98; </p><p> Visual Assist X 10.1.1301.0
26、 </p><p> 1.3.2 運(yùn)行環(huán)境 </p><p> Intel® Pentium® 2及以上處理器,32M以上內(nèi)存,4G以上硬盤;</p><p> Microsoft® Windows? 9X/NT操作系統(tǒng); </p><p> 800*600或以上的屏幕分辨率</p>&l
27、t;p><b> 2 系統(tǒng)分析</b></p><p><b> 2.1系統(tǒng)調(diào)研</b></p><p> 正式開發(fā)五子棋游戲之前進(jìn)行調(diào)研是非常必要的,其必要性主要表現(xiàn)在以下幾個(gè)方面。</p><p> ?。?)明確用戶的要求,以根據(jù)調(diào)查結(jié)果進(jìn)行可行性分析,確認(rèn)系統(tǒng)的開發(fā)是否可行。</p><
28、;p> ?。?)提出新系統(tǒng)的人員并不都是系統(tǒng)研究人員,有些人對(duì)于其功能和處理數(shù)據(jù)的方法沒有明確的認(rèn)識(shí)。它們只是根據(jù)自己業(yè)務(wù)工作的需要提出了要求,系統(tǒng)開發(fā)人員要對(duì)此進(jìn)行詳細(xì)的調(diào)查和分析,確認(rèn)用戶的要求可以通過現(xiàn)有的計(jì)算機(jī)技術(shù)實(shí)現(xiàn),保證開發(fā)的管理信息系統(tǒng)的功能與用戶提出的要求相吻合??傊?,必要對(duì)現(xiàn)行系統(tǒng)進(jìn)行詳細(xì)的調(diào)查,明確用戶需求,保證開發(fā)的新系統(tǒng)的功能與用戶的要求相吻合,避免耗費(fèi)大量的人力、物力、財(cái)力,新系統(tǒng)的開發(fā)卻失敗的悲劇發(fā)生。
29、</p><p><b> 2.2可行性分析</b></p><p> 可行性分析是在用戶的要求和系統(tǒng)調(diào)研的基礎(chǔ)上進(jìn)行的,對(duì)新系統(tǒng)的開發(fā)從社會(huì)、技術(shù)、經(jīng)濟(jì)、管理等方面進(jìn)行分析,并得出新系統(tǒng)的開發(fā)工作可行、不可行、需要修改、追加投資、暫緩開發(fā)、分步實(shí)施等方案和結(jié)論,最后完成可行性分析??尚行苑治鲆话憧啥x為:可行性分析是在建設(shè)的前期對(duì)工程項(xiàng)目的一種考察和鑒定,對(duì)擬議
30、中的項(xiàng)目進(jìn)行全面與綜合的技術(shù)、經(jīng)濟(jì)能力的調(diào)查,判斷它是否可行。</p><p> 可行性分析階段的主要工作包括以下幾個(gè)方面:</p><p> ?。?)新系統(tǒng)目標(biāo)可行性分析:分析新系統(tǒng)的目標(biāo)是否符合企業(yè)的現(xiàn)狀和發(fā)展的需要。</p><p> (2)社會(huì)可行性分析:社會(huì)可行性分析主要是指管理信息系統(tǒng)的開發(fā)是否符合國家法律政策,是否,能夠與社會(huì)大系統(tǒng)實(shí)現(xiàn)良好的對(duì)接。
31、</p><p> ?。?)技術(shù)可行性分析:技術(shù)可行性分析是根據(jù)新系統(tǒng)的目標(biāo)來衡量是否具備所需要的技術(shù),包括系統(tǒng)開發(fā)人員數(shù)量和水平,硬件方面,軟件方面及其它應(yīng)用技術(shù)。 </p><p> ?。?)經(jīng)濟(jì)可行性分析 </p><p> 經(jīng)濟(jì)可行性分析主要是對(duì)開發(fā)新系統(tǒng)所投入的資金與系統(tǒng)投入使用后所帶來的經(jīng)濟(jì)效益進(jìn)行比較,確認(rèn)新系統(tǒng)是否會(huì)給企業(yè)帶來一
32、定的經(jīng)濟(jì)效益。</p><p> (5)管理可行性分析:</p><p> 管理可行性分析主要是分析企業(yè)現(xiàn)行的管理體制和企業(yè)領(lǐng)導(dǎo)是否具有現(xiàn)代化的管理意識(shí)和管理水平。</p><p> 2.3 技術(shù)可行性分析</p><p> 技術(shù)可行性分析主要包括四個(gè)方面:目前有關(guān)的技術(shù)能否支持所開發(fā)的新系統(tǒng);新系統(tǒng)開發(fā)人員的數(shù)量和水平,即
33、人力資源;硬件和軟件資源。</p><p><b> (1)技術(shù)支持:</b></p><p> 首先根據(jù)新系統(tǒng)的目標(biāo),考慮目前有關(guān)的技術(shù)能否支持所開發(fā)的新系統(tǒng)。這里討論的技術(shù)必須是已經(jīng)普遍使用的,而不是待研究的或正在研究的。</p><p> 對(duì)于本系統(tǒng),本人是采用C++編寫的。而在開發(fā)五子棋的過程運(yùn)用到了,圖形的繪制(主要是對(duì)棋子的繪
34、制,棋盤的繪制的)。還有C++種對(duì)聲音的播放方式(主要是用于下棋的時(shí)候的落子聲音,悔棋時(shí)的聲音,贏棋時(shí)的聲音,輸棋的聲音)。文件的保存和載入(主要用于對(duì)棋盤信息的儲(chǔ)存和打開)。</p><p><b> ?。?)硬件資源:</b></p><p> 開發(fā)管理信息系統(tǒng)所需的硬件資源包含以下兩個(gè)方面:</p><p> 系統(tǒng)開發(fā)人員在管理信息系
35、統(tǒng)的開發(fā)過程中所需要的計(jì)算機(jī)設(shè)備及其有關(guān)的外部設(shè)備;管理信息系統(tǒng)開發(fā)成功投入使用后,使用單位所應(yīng)具備的計(jì)算機(jī)設(shè)備及其有關(guān)的外圍設(shè)備。對(duì)硬件資源進(jìn)行可行性分析時(shí)主要考慮計(jì)算機(jī)的主機(jī)內(nèi)存、類型、功能、聯(lián)網(wǎng)能力、安全保護(hù)措施以及輸入/輸出設(shè)備,外存儲(chǔ)器和聯(lián)網(wǎng)數(shù)據(jù)通信設(shè)備的配置、功能、效率等指標(biāo)是否符合系統(tǒng)方案設(shè)計(jì)要求,同時(shí)還要考慮計(jì)算機(jī)的性能/價(jià)格比。本系統(tǒng)對(duì)計(jì)算機(jī)的要求不高,一般的硬件配置都能運(yùn)行此系統(tǒng)。</p><p&
36、gt;<b> 3軟件架構(gòu)</b></p><p><b> 3.1 棋盤類</b></p><p> 整個(gè)架構(gòu)的核心部分。封裝了棋盤的各種可能用到的功能,如初始化、判斷勝負(fù)等。用戶操作主界面,主界面與棋盤類進(jìn)行交互來完成對(duì)游戲的操作。</p><p> 3.1.1主要成員變量</p><p&g
37、t;<b> (1)棋盤等待</b></p><p> 由于在玩家落子后需要等待對(duì)方落子,例如:黑子先下,白字就處于等待狀態(tài),這時(shí)白子是不能落子的。還有就是悔棋,直接發(fā)出悔棋信息就能悔棋了。</p><p><b> (2)棋盤數(shù)據(jù)</b></p><p> 這是一個(gè)15*15的二位數(shù)組,用來保存當(dāng)前棋盤的落子數(shù)據(jù)
38、。其中對(duì)于每個(gè)成員來說,0表示落黑子,1表示落白子,-1表示無子。</p><p><b> ?。?)游戲模式指針</b></p><p> 這個(gè)游戲類的對(duì)象指針是可行類的核心內(nèi)容。它所指向的對(duì)象實(shí)體決定了可行在執(zhí)行一件事情時(shí)候的不同行為,具體的內(nèi)容請(qǐng)參見“游戲模式”一節(jié)。</p><p><b> (4)網(wǎng)絡(luò)連接</b&g
39、t;</p><p> 用來表示當(dāng)前網(wǎng)絡(luò)連接的情況,在網(wǎng)絡(luò)對(duì)弈游戲模式下客戶端連接服務(wù)器的時(shí)候用來判斷是否連接成功;事實(shí)上,它也是區(qū)分當(dāng)前游戲模式的唯一標(biāo)志。</p><p> 3.2 主要成員函數(shù)說明</p><p> 3.2.1 清空棋盤</p><p> 在每一局游戲開始的時(shí)候都需要調(diào)用這個(gè)函數(shù)將棋盤清空,也就是棋盤的初始化工作
40、。在這個(gè)函數(shù)中,主要發(fā)生了這么幾件事情:</p><p> (1)將數(shù)據(jù)中的每一個(gè)落子位置為無子狀態(tài)(-1)。</p><p> ?。?)按照傳入的參數(shù)設(shè)置棋盤等待標(biāo)志wait,以供先、后手的不同情況之用。</p><p> ?。?)使用delete將came的指針?biāo)赶虻脑杏螒蚰J綄?duì)象從堆上刪除。</p><p> 3.2.2 繪制棋
41、子</p><p> 這無疑是很重要的一個(gè)函數(shù),它根據(jù)參數(shù)給定的坐標(biāo)和顏色繪制棋子。繪制的詳細(xì)過程如下:</p><p> ?。?)將給定的棋盤坐標(biāo)換算為繪圖的像素坐標(biāo)。</p><p> (2)根據(jù)坐標(biāo)繪制棋子位圖。</p><p> ?。?)如果先前曾下過棋子,則將上一個(gè)繪制棋子上的最后落子指示矩形擦除。</p><
42、;p> ?。?)在剛繪制完成的棋子四周繪制最后落子指示矩形。</p><p> 3.2.3 左鍵消息</p><p> 作為棋盤唯一響應(yīng)的左鍵消息,也需要做工作:</p><p> ?。?)如果棋盤等待標(biāo)志wait為true,則直接發(fā)出警告聲音并返回,即禁止落子。</p><p> ?。?)如果點(diǎn)擊時(shí)的鼠標(biāo)坐標(biāo)在合法坐標(biāo)(0,
43、60;0)~(14, 14)之外,亦禁止落子。</p><p> ?。?)如果走的步數(shù)大于1步,方才允許悔棋。</p><p> ?。?)進(jìn)行勝利判斷,如勝利則修改UI狀態(tài)并增加勝利數(shù)的統(tǒng)計(jì)。</p><p> (5)如未勝利,則向?qū)Ψ桨l(fā)送已經(jīng)落子的消息。</p><p> ?。?)落子完畢,將Wait標(biāo)志置為TRUE,開始等待對(duì)
44、方回應(yīng)。</p><p> 3.2.4 繪制棋盤</p><p> 每當(dāng)圖像消息觸發(fā)時(shí),都需要對(duì)棋盤進(jìn)行重繪。在圖像上作為響應(yīng)繪制消息的消息處理函數(shù)使用了雙緩沖技術(shù),減少了多次繪圖可能導(dǎo)致的圖像閃爍問題。這個(gè)函數(shù)主要完成了以下工作:</p><p> ?。?)裝載棋盤位圖并進(jìn)行繪制。</p><p> ?。?)根據(jù)棋盤數(shù)據(jù)繪制棋子。<
45、;/p><p> (3)繪制最后落子指示矩形。</p><p> 3.2.5 對(duì)方落子完畢</p><p> 在對(duì)方落子之后,仍然需要做一些判斷工作,這些工作與左鍵消息中的類似,在此不再贅述。</p><p> 3.2.6 勝負(fù)的判斷</p><p> 這是游戲中一個(gè)極其重要的算法,用來判斷當(dāng)前棋盤的形勢是哪一方
46、獲勝。</p><p><b> 3.3 游戲模式類</b></p><p> 這個(gè)類負(fù)責(zé)對(duì)游戲模式進(jìn)行管理,以及在不同的游戲模式下對(duì)不同的用戶行為進(jìn)行不同的響應(yīng)。由于并不需要CGame本身進(jìn)行響應(yīng),所以將其設(shè)計(jì)為了一個(gè)純虛類。</p><p> 3.3.1主要成員變量</p><p><b> (1)
47、棋盤指針</b></p><p> 由于在游戲中需要對(duì)棋盤以及棋盤的父窗口——主對(duì)話框進(jìn)行操作及UI狀態(tài)設(shè)置,故為CGame類設(shè)置了這個(gè)成員。</p><p><b> ?。?)落子步驟</b></p><p> 一個(gè)好的棋類程序必須要考慮到的功能就是它的悔棋功能,所以需要為游戲類設(shè)置一個(gè)落子步驟的列表。由于人機(jī)對(duì)弈和網(wǎng)絡(luò)對(duì)弈中
48、都需要這個(gè)功能,故將這個(gè)成員直接設(shè)置到基類CGame中。</p><p> 3.3.2主要成員函數(shù)</p><p><b> ?。?)悔棋操作</b></p><p> 在不同的游戲模式下,悔棋的行為是不一樣的。</p><p> 人機(jī)對(duì)弈模式下,計(jì)算機(jī)是完全允許玩家悔棋的,但是出于對(duì)程序負(fù)荷的考慮,只允許玩家悔棋
49、當(dāng)前的兩步棋(計(jì)算機(jī)一步,玩家一步)。</p><p> 雙人對(duì)弈模式下,悔棋的過程為:首先由玩家向?qū)Ψ秸f出悔棋請(qǐng)求(悔棋消息),然后由對(duì)方?jīng)Q定是否允許玩家悔棋,在玩家得到對(duì)方的響應(yīng)消息(允許或者拒絕)之后,才進(jìn)行悔棋與否的操作。</p><p><b> ?。?)初始化操作</b></p><p> 對(duì)于不同的游戲模式而言,也就有不同的初
50、始化方式。對(duì)于人機(jī)對(duì)弈模式而言,初始化操作包括以下幾個(gè)步驟:</p><p> 設(shè)置主界面計(jì)算機(jī)玩家的姓名;</p><p> 初始化所有的獲勝組合;</p><p> 如果是計(jì)算機(jī)先走,則占據(jù)天元(棋盤正中央)的位置。</p><p><b> 發(fā)送落子消息</b></p><p>
51、在玩家落子結(jié)束后,要向?qū)Ψ桨l(fā)送自己落子的消息。對(duì)于不同的游戲模式,發(fā)送的目標(biāo)也不同:對(duì)于人機(jī)對(duì)弈游戲模式,將直接把落子的信息(坐標(biāo)、顏色)發(fā)送給相應(yīng)的計(jì)算函數(shù); 對(duì)于雙人對(duì)弈游戲模式,將把落子消息發(fā)送給套接字,并由套接字轉(zhuǎn)發(fā)給對(duì)方。</p><p><b> ?。?)勝利后的處理</b></p><p> 這個(gè)成員函數(shù)主要針對(duì)雙人對(duì)弈模式。在玩家贏得棋局后,這個(gè)函數(shù)
52、仍然會(huì)調(diào)用將玩家所下的制勝落子步驟發(fā)送給對(duì)方玩家,然后由游戲端來判定自己失敗。</p><p><b> 3.4 資源編輯</b></p><p> 由于我們這個(gè)程序出現(xiàn)的關(guān)于資源編輯的內(nèi)容太多,我們具體介紹如下: 見下圖3-1和圖3-2,我們需要添加的有:</p><p><b> 說明: </b><
53、;/p><p> 由于下棋時(shí)我們必須把鼠標(biāo)熱點(diǎn)設(shè)置在中間,點(diǎn)擊下圖(圖3-3)最右邊按扭,然后把鼠標(biāo)移動(dòng)到圖像中你想設(shè)置為熱點(diǎn)的地方,按下鼠標(biāo)左鍵。</p><p><b> 說明: </b></p><p> 由于我們的圖標(biāo)支持256色,按下下圖(圖3-4)最右邊按扭,選擇Device里面顯示的選項(xiàng)。</p><
54、;p><b> 說明: </b></p><p> 工具欄一般都是根據(jù)菜單選項(xiàng)而產(chǎn)生的,它的ID一般都能從菜單的ID中找到。</p><p><b> 3.5消息說明</b></p><p> 網(wǎng)絡(luò)間傳遞的消息,都遵循以下一個(gè)結(jié)構(gòu)體的形式:</p><p> 我們這用SY來
55、表示消息的id。</p><p> 縱軸用x,橫軸用y,x、y表示落子的坐標(biāo)。</p><p> Color表示落子的顏色。</p><p> SSY隨著SY的不同而不同。</p><p><b> 3.5.1落子消息</b></p><p> 表明對(duì)方落下了一個(gè)棋子,其中x、y和col
56、or成員有效SSY成員無效。在人機(jī)對(duì)弈游戲模式下,亦會(huì)模擬發(fā)送此消息以達(dá)到程序模塊一般化的效果。</p><p><b> 3.5.2聲音消息</b></p><p> 你可以選著你想要的,有聲或者無聲。建議有聲,因?yàn)橛新曇魧?huì)提示,如果你快輸時(shí),會(huì)發(fā)出一個(gè)響聲的。而且有聲音更加的增加了游戲的樂趣。</p><p><b> 3
57、.5.3提示消息</b></p><p> 當(dāng)你想不到你下一步下那個(gè)位置的時(shí)候,你可以選擇提示選項(xiàng),它將會(huì)為你提示出下一步該如何去落子。</p><p><b> 3.5.4悔棋消息</b></p><p> 表示你想悔棋,那么你就直接發(fā)出消息,直接悔棋一步,而不能悔棋兩步,還有就是,重新下了第二步后,可以重新悔棋,不過還是只
58、能悔棋一步。</p><p><b> 3.5.5輸贏消息</b></p><p> 你贏了,就是顯示你贏,而你輸,就顯示你輸了。其中,還有你共下了多少步而輸或贏了對(duì)手,反之一樣。當(dāng)然也提供了,悔棋多少步的信息出來。還有你的評(píng)語消息。</p><p> 3.5.6再次開局消息</p><p> 表示你想再開一局,
59、那你就直接發(fā)出消息,然后再開一局。當(dāng)然,你可以選著人機(jī)對(duì)戰(zhàn)或者雙人對(duì)戰(zhàn)。當(dāng)你選著人機(jī)對(duì)戰(zhàn)時(shí),你還可以選著你想要的機(jī)器的智能,你選著的級(jí)別越高,智能也就越高。</p><p><b> 4主要算法</b></p><p> 五子棋游戲中,有相當(dāng)?shù)钠撬惴ǖ牟糠?。無論是人機(jī)對(duì)弈,還是網(wǎng)絡(luò)對(duì)弈,都需要合理算法的支持,本節(jié)中將詳細(xì)介紹五子棋中使用的算法。</p&g
60、t;<p><b> 4.1判斷勝負(fù)</b></p><p> 五子棋的勝負(fù),在于判斷棋盤上是否有一個(gè)點(diǎn),從這個(gè)點(diǎn)開始的右、下、右下、左下四個(gè)方向是否有連續(xù)的五個(gè)同色棋子出現(xiàn),如圖4-1所示。</p><p> 圖4-1判斷勝負(fù)方向</p><p> 這個(gè)算法也就是CTable的Win成員函數(shù)。從設(shè)計(jì)的思想上,需要它接受一
61、個(gè)棋子顏色的參數(shù),然后返回一個(gè)布爾值,這個(gè)值來指示是否勝利。流程圖如下圖4-2:</p><p> 圖4-2 判斷勝負(fù)流程圖</p><p> 由于這個(gè)算法所遵循的搜索順序是從左到右、自上而下,因此在每次循環(huán)的時(shí)候,都有一些坐標(biāo)無需納入考慮范圍。例如對(duì)于橫向判斷而言,由于右邊界所限,因而所有橫坐標(biāo)大于等于11的點(diǎn),都構(gòu)不成達(dá)到五子連的條件,所以橫坐標(biāo)的循環(huán)上界也就定為11,這樣也就提高
62、了搜索的速度。</p><p><b> 4.2人機(jī)對(duì)弈算法</b></p><p> 人機(jī)對(duì)弈算法完全按照CGame基類定義的接口標(biāo)準(zhǔn),封裝在了COneGame派生類之中。下面將對(duì)這個(gè)算法進(jìn)行詳細(xì)地介紹。</p><p><b> 4.2.1獲勝組合</b></p><p> 獲勝組合是一
63、個(gè)三維數(shù)組,它記錄了所有取勝的情況。也就是說,參考于CTable::Win中的情況,對(duì)于每一個(gè)落子坐標(biāo),獲勝的組合一共有 </p><p> 15 * 11 * 2 + 11 * 11 * 2 = 572種。 </p><p> 而對(duì)于每個(gè)坐標(biāo)的獲
64、勝組合,應(yīng)該設(shè)置一個(gè)[15][15][572]大小的三維數(shù)組。 在擁有了這些獲勝組合之后,就可以參照每個(gè)坐標(biāo)的572種組合給自己的局面和玩家的局面進(jìn)行打分,也就是根據(jù)當(dāng)前盤面中某一方所擁有的獲勝組合多少進(jìn)行權(quán)值的估算,給出最有利于自己的一步落子坐標(biāo)。 </p><p> 由于是雙方對(duì)弈,所以游戲的雙方都需要一份獲勝組合,也就是: </p><p><b>
65、 電腦獲勝組</b></p><p><b> 玩家獲勝組合 </b></p><p> 在每次游戲初始化的時(shí)候,需要將每個(gè)坐標(biāo)下可能的獲勝組合都置為true。 </p><p> 在初始化的時(shí)候,將每個(gè)棋子數(shù)置為0。</p><p> 4.2.2落子后處理</p>
66、<p> 每當(dāng)一方落子后,都需要作如下處理: </p><p> 如果己方此坐標(biāo)的獲勝組合仍為true,且仍有可能在此獲勝組合處添加棋子,則將此獲勝組合添加棋子數(shù)加1;</p><p> 如果對(duì)方此坐標(biāo)的獲勝組合仍為true,則將對(duì)方此坐標(biāo)的獲勝組合置為false,并將對(duì)方此獲勝組合添加棋子數(shù)置為-1(不可能靠此組合獲勝)。</p><p&g
67、t; 4.2.3查找棋盤空位</p><p> 在計(jì)算機(jī)落子之前,需要查找棋盤的空位,所以需要一個(gè)SearchBlank成員函數(shù)完成此項(xiàng)工作,此函數(shù)需要進(jìn)行不重復(fù)的查找,也就是說,對(duì)已查找過的空位進(jìn)行標(biāo)記,并返回找到空位的坐標(biāo)。</p><p><b> 4.2.4落子打分</b></p><p> 找到空位后,需要對(duì)這個(gè)點(diǎn)的落子進(jìn)行打
68、分,這個(gè)分?jǐn)?shù)也就是這個(gè)坐標(biāo)重要性的體現(xiàn)。</p><p> 考慮到攻守兩方面的需要,所以將玩家落子給的分?jǐn)?shù)置為負(fù)值。</p><p><b> 4.2.5防守策略</b></p><p> 落子的考慮不單單要從進(jìn)攻考慮,還要從防守考慮。這一細(xì)節(jié)的實(shí)現(xiàn)其實(shí)就是讓計(jì)算機(jī)從玩家棋盤布局分析戰(zhàn)況,然后找出對(duì)玩家最有利的落子位置。</p>
69、;<p> 4.2.6選取最佳落子</p><p> 它的實(shí)現(xiàn)原理是:在四個(gè)方向上,各自計(jì)算那個(gè)方向上棋子的狀態(tài),我們的思路是利用原來定義的白棋為1,黑棋為-1,的思想,讓同個(gè)方向上的五個(gè)棋子的值相加,取絕對(duì)值并賦值給為這個(gè)方向定義的局部變量。 </p><p> 為什么要用五個(gè)棋子的值相加呢?因?yàn)?,如果幾個(gè)棋子是同色的,無論黑白,它的絕對(duì)值必然大,而對(duì)于幾個(gè)
70、棋子中有黑棋和白棋的,其值必然相加而抵消變小。所以我們可以利用這種方法來尋找旁邊有多個(gè)同色棋子的空位置。 </p><p> 在每一個(gè)棋盤位置,計(jì)算以它為起點(diǎn)的四個(gè)方向(上、下、右下、左下),再比較這四個(gè)方向中哪個(gè)值最大,然后在這個(gè)方向上尋找落棋點(diǎn)。</p><p><b> 5 軟件實(shí)現(xiàn)</b></p><p><b>
71、; 5.1游戲運(yùn)行</b></p><p><b> (1)游戲開始 </b></p><p> 自主選擇是人機(jī)對(duì)戰(zhàn)亦或是人人對(duì)戰(zhàn),還有先手問題,你先或是計(jì)算機(jī)先,音效是開活關(guān)。如下圖5-1所示</p><p> 圖 5-1 五子棋開始界面</p><p><b> ?。?)游戲界面<
72、;/b></p><p> 如下圖5-2所示為于計(jì)算機(jī)對(duì)弈,你先下</p><p> 圖 5-2 五子棋界面</p><p> (3)游戲的工具欄-上有所需要的選項(xiàng)</p><p> 游戲難度選擇可在游戲【G】上選擇,新開局,英雄榜等等選項(xiàng)。如下圖5-3所示。</p><p> 圖5-3 五子棋游戲工具
73、欄</p><p><b> ?。?)悔棋</b></p><p> 在選項(xiàng)上可以選擇悔棋選項(xiàng)如下圖5-4。</p><p><b> 圖5-4 選項(xiàng)</b></p><p><b> (5)游戲結(jié)束</b></p><p><b>
74、例如下圖5-5所示</b></p><p> 圖 5-5 游戲結(jié)束界面</p><p><b> 6補(bǔ)充說明</b></p><p> 考慮到程序的響應(yīng)速度,人機(jī)對(duì)弈算法只對(duì)玩家的棋子進(jìn)行了一步的推測。</p><p> 由于計(jì)算機(jī)在落子時(shí)選取的是得分最高的一步落子,所以如果玩家在開局的時(shí)候不改變落子
75、步驟,那么將會(huì)獲得從頭至尾相同的棋局。</p><p> 對(duì)于人機(jī)對(duì)弈的悔棋處理,由于這個(gè)算法的開銷相當(dāng)大,每一步落子都會(huì)存在不同的棋盤布局,所以實(shí)現(xiàn)從頭到尾的悔棋不是很現(xiàn)實(shí)(將會(huì)存在過多的空間保存棋盤布局),因而在人機(jī)對(duì)弈模式下,只允許玩家悔最近的兩步落子。</p><p><b> 7結(jié)論</b></p><p> 考慮到程序的響應(yīng)速
76、度,人機(jī)對(duì)弈算法只對(duì)玩家的棋子進(jìn)行了一步的推測。 </p><p> 由于計(jì)算機(jī)在落子時(shí)選取的是得分最高的一步落子,所以如果玩家在開局的時(shí)候不改變落子步驟,那么將會(huì)獲得從頭至尾相同的棋局。 </p><p> 考慮到下棋同時(shí)還要聊天,所以并未對(duì)落子時(shí)間加入任何限制,同樣如果玩家離開游戲也不會(huì)判負(fù)。 </p><p> 對(duì)于人機(jī)對(duì)弈
77、的悔棋處理,由于這個(gè)算法的開銷相當(dāng)大,每一步落子都會(huì)存在不同的棋盤布局,所以實(shí)現(xiàn)從頭到尾的悔棋不是很現(xiàn)實(shí)(將會(huì)存在過多的空間保存棋盤布局),因而在人機(jī)對(duì)弈模式下,只允許玩家悔最近的兩步落子。</p><p> 通過編寫這個(gè)程序,我體會(huì)最為深刻的一點(diǎn)是系統(tǒng)架構(gòu)和設(shè)計(jì)模式的重要性。即使是對(duì)于一個(gè)并不大的程序,代碼的組織都是非常重要的,因?yàn)檫@關(guān)系到日后的維護(hù)以及擴(kuò)展。這個(gè)游戲之中,有關(guān)網(wǎng)絡(luò)Socket編程或者博弈樹算
78、法的知識(shí)都可以直接從無所不包的Internet上獲取,甚至可以直接獲得一個(gè)完整的五子棋人機(jī)對(duì)弈算法的源代碼級(jí)模塊。但是對(duì)于系統(tǒng)的架構(gòu),卻完全是自己的事情,幾千上萬行的代碼需要通過合適的方法組織起來,使程序員編寫代碼更加有條理,更加符合軟件工程的標(biāo)準(zhǔn),這才是最重要的。 </p><p> 在剛開始編寫這個(gè)程序的時(shí)候,我幼稚地認(rèn)為其中最重要的是博弈樹算法。但是頭一個(gè)月編寫程序的時(shí)候卻發(fā)現(xiàn)程序越寫越不容易維
79、護(hù),可見是我走錯(cuò)了方向。后來我向公司真正的軟件設(shè)計(jì)人員及系統(tǒng)架構(gòu)師討教,他們告訴我:我們的先人早已為我們準(zhǔn)備好了各種精良可用的現(xiàn)成算法,我們所要做的就是直接“拿來主義”罷了;但是對(duì)于代碼的組織(也就是軟件的架構(gòu))才是真正軟件工業(yè)的核心部分,因?yàn)檐浖聦?shí)上是直接和經(jīng)濟(jì)掛鉤的,因此我們必須在編寫代碼之前選擇一種最為合適的方法來組織這些代碼,否則我們將會(huì)失去更多的時(shí)間和金錢。</p><p><b> 致謝
80、</b></p><p> 最后在學(xué)校的這幾周,由于找工作和戶籍的原因而無法抽出更多的時(shí)間來做好這畢業(yè)的要求,但在這么短的時(shí)間內(nèi)還是有著現(xiàn)在這論文,最要感謝的還是我們劉博老師,因?yàn)樗谧x博期間還那么用心的幫助我們,還每周讓我們匯報(bào)情況,幫助我們?nèi)バ薷囊恍╁e(cuò)誤。當(dāng)然也要感謝給我?guī)椭暮糜褌?,給予我很多支持。</p><p><b> 參考文獻(xiàn)</b>&l
81、t;/p><p> [1]MSDN for Visual Studio 6.0 </p><p> [2]設(shè)計(jì)模式——可復(fù)用面向?qū)ο筌浖幕A(chǔ),Erich Gamma/Richard Helm/Ralph Johnson/John Vlissides著,李英軍/馬曉星/蔡敏/劉建中 等譯,機(jī)械工業(yè)出版
82、社 </p><p> [3]深入淺出MFC(第2版),侯俊杰著,華中科技大學(xué)出版社 </p><p> [4]Microsoft®VisualC++.NET 技術(shù)內(nèi)幕</p><p> ?。ǖ?版),George Shepherd/David Kruglinski著,潘愛民譯,清華大學(xué)出版社
83、;</p><p> [5]Visual C++網(wǎng)絡(luò)通信協(xié)議分析與應(yīng)用實(shí)現(xiàn),汪曉平/鐘軍 等編著,人民郵電出版社 </p><p> [6]C++編程思想,Bruce Eckel著,劉宗田/邢大紅/孫慧杰等譯,機(jī)械工業(yè)出版社 </p><p> [7]21天學(xué)通C++,Jesse Liberty著,康博創(chuàng)作室譯,人民郵電
84、出版社 </p><p> [8]C++標(biāo)準(zhǔn)程序庫,Nicolai M.Josuttis著,侯捷/孟巖 譯,華中科技大學(xué)出版社 </p><p> [9]Windows程序設(shè)計(jì),Charles Petzold著,北京博彥科技發(fā)展有限公司譯,北京大學(xué)出版社 </p><p> [10]Visual
85、60;C++.NET網(wǎng)絡(luò)編程,易君 編著,中國鐵道出版社 </p><p> [11]博弈樹搜索 </p><p> http://202.113.96.26/wlkc/rengongzhineng/rengongzhineng/kejian/AI/Ai/chapter3/33.htm </p><p> [12]五子棋
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于vc++的五子棋程序設(shè)計(jì)與實(shí)現(xiàn)
- 軟件工程畢業(yè)論文-網(wǎng)絡(luò)五子棋的設(shè)計(jì)與實(shí)現(xiàn)
- 畢業(yè)論文---五子棋人機(jī)對(duì)弈系統(tǒng)(vc++)
- 基于vc的五子棋游戲設(shè)計(jì)與實(shí)現(xiàn)【畢業(yè)論文】
- 軟件工程畢業(yè)論文-網(wǎng)絡(luò)對(duì)戰(zhàn)五子棋平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)
- 軟件工程畢業(yè)論文-五子棋對(duì)戰(zhàn)游戲平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)
- 基于vc++的五子棋游戲設(shè)計(jì)與實(shí)現(xiàn)【開題報(bào)告】
- [vc畢設(shè)]游戲程序設(shè)計(jì)(五子棋)
- 畢業(yè)設(shè)計(jì)--五子棋程序設(shè)計(jì)
- 軟件工程畢業(yè)設(shè)計(jì)(論文)-基于android的五子棋游戲設(shè)計(jì)
- 五子棋畢業(yè)論文-html開發(fā)五子棋的原型設(shè)計(jì)
- java五子棋畢業(yè)設(shè)計(jì)--java五子棋對(duì)弈程序的設(shè)計(jì)與實(shí)現(xiàn)
- 五子棋畢業(yè)論文
- 網(wǎng)絡(luò)五子棋的設(shè)計(jì)與實(shí)現(xiàn)-畢業(yè)論文
- 畢業(yè)設(shè)計(jì)(論文)-五子棋游戲程序設(shè)計(jì)與開發(fā)
- 五子棋游戲程序設(shè)計(jì)報(bào)告
- 網(wǎng)絡(luò)五子棋五子棋設(shè)計(jì)與實(shí)現(xiàn).doc
- 五子棋游戲的設(shè)計(jì)與實(shí)現(xiàn)【畢業(yè)論文】
- 五子棋游戲設(shè)計(jì)畢業(yè)論文
- 畢業(yè)論文 基于android的五子棋設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論