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