軟件工程畢業(yè)論文-基于vc++的五子棋程序設計與實現(xiàn)_第1頁
已閱讀1頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  本科畢業(yè)論文</b></p><p><b>  (20 屆)</b></p><p>  基于VC++的五子棋程序設計與實現(xiàn)</p><p><b>  摘 要</b></p><p>  C++語言是一種面向對象的語言,盡管在當前,可視化語

2、言發(fā)展迅速,普及很快,但C++語言作為一種基礎的語言,它的有時依然存在,甚至有時它是不可替代的,特別是和硬件接口技術相聯(lián)系的軟件。五子棋游戲是一種簡單大眾的游戲,自計算機實現(xiàn)以來,深受廣大電腦玩家的喜愛,現(xiàn)在流行的五子棋游戲軟件大多缺乏美觀的界面,和容易的操作方法,電腦的AI值也不是很高。本文通過C++語言在計算機圖形方面的編程,設計了五子棋游戲軟件,使該軟件具有還算美觀和操作簡單的界面,在人機對戰(zhàn)時,分為低級,中級和專家級,加大對游戲

3、的樂趣,當然也可以實行人人對戰(zhàn)。本游戲是以C++語言作為開發(fā)工具,采用搜索算法設計最優(yōu)落子點開發(fā)的游戲軟件。本文就是介紹五子棋軟件設計的全過程。</p><p>  關鍵字 C++語言 面向對象 最優(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)境及運行環(huán)境7</p><p>  1.3.1 開發(fā)環(huán)境7</p><p>  1.3.2 運行環(huán)境7</p><p><b>  2 系統(tǒng)分析8</b>&

8、lt;/p><p><b>  2.1系統(tǒng)調研8</b></p><p>  2.2可行性分析8</p><p>  2.3 技術可行性分析9</p><p><b>  3軟件架構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 對方落子完畢11</p><p>  3.2.6 勝負的判斷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判斷勝負17</p><p>  4.2人機對弈算法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 軟件實現(xiàn)19</b></p><p>  5.1游戲運行19</p>&l

14、t;p><b>  6補充說明23</b></p><p><b>  7結論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>  五子棋不僅能增強思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。五子棋既有現(xiàn)代

16、休閑的明顯特征“短、平、快”,又有古典哲學的高深學問“陰陽易理”;它既有簡單易學的特性,為人民群眾所喜聞樂見,又有深奧的技巧和高水平的國際性比賽;它的棋文化源淵流長,具有東方的神秘和西方的直觀;既有“場”的概念,亦有“點”的連接。它是中西文化的交流點,是古今哲理的結晶。</p><p>  五子棋的娛樂性強、規(guī)則簡單、易學、流行性廣,普通人不需長時間專門訓練即可自如行棋,因此極受大眾喜歡。</p>

17、<p><b>  五子棋規(guī)則為: </b></p><p>  第一:五子棋行棋時,黑棋先下第一子,由天元開始,后白棋在黑棋周圍的交叉點的落子。接著黑方再以天元中心的25個交叉點的范圍內落盤面的第三子,之后黑白雙方相互順序子。</p><p>  第二:最先在棋盤線交點橫向,縱向,斜向形成已方的五個棋子連續(xù)的一方為勝。第三:出現(xiàn)禁手對方指出后將判負,其中包

18、括兩個或兩個以上的活三,活四,長連均稱之為禁手。 </p><p>  第四:禁手只對黑棋有效,白棋無禁手。</p><p>  第五:黑方禁手形成時,白方需立即指出,黑方將被判負。若白方未發(fā)現(xiàn)黑方禁手存在而繼續(xù)應子,其后指出黑方禁手不能判黑方負。</p><p>  第六:黑方連五與禁手同時形成,因黑方已連成五即黑方已獲勝,故禁手規(guī)則失效。 </p>

19、<p>  第七:在對局中,在盤上落下的子又拿起來,此動作稱為拔子,若拔子將被判為負。</p><p>  第八:在對局中棋子掉落在棋盤上將被判負。若推子或蹭子,以盤面第一落點為準。用手將棋子推正不算違犯規(guī)則。</p><p>  第九:在對局中,一方自行中止比賽如:中途退場,將被判負。</p><p>  第十:在對局中對方宣布認輸,本局獲勝。<

20、;/p><p>  第十一:超過比賽規(guī)定所用時間限制,將被判為負:正式比賽期間,遲到時間超過比賽容許時間將被判負。 </p><p>  第十二:如下至最終一子仍不分勝負則定為平局。</p><p>  第十三:中盤期間雙方 同意和局提議,判定為平局。</p><p>  1.2 Visual C++的介紹</p><p&g

21、t;  Visual C++ 6.0,簡稱VC或者VC6.0,是微軟推出的一款C++編譯器,將“高級語言”翻譯為“機器語言(低級語言)”的程序。Visual C++是一個功能強大的可視化軟件開發(fā)工 具。自1993年Microsoft公司推出Visual C++1.0后,隨著其新版本的不斷問世,Visual C++已成為專業(yè)程序員進行軟件開發(fā)的首選工具。雖然微軟公司推出了 Visual C++.NET(Visual C++7.0),但它

22、的應用有很大的局限性,只適用于Windows 2000、Windows XP和Windows NT4.0。所以實際中,更多的是以Visual C++6.0為平臺。Visual C++6.0由Microsoft開發(fā), 它不僅是一個C++ 編譯器,而且是一個基于Windows操作系統(tǒng)的可視化集成開發(fā)環(huán)境(integrated development environment,IDE)。Visual C++6.0由許多組件組成,包括編輯器、調試

23、器以及程序向導AppWizard、類向導Class Wizard等開發(fā)工具。 這些組件通過一個名為Developer Studi</p><p>  Visual C++6.0以擁有“語法高亮”,自動編譯功能以及高級除錯功能而著稱。比如,它允許用戶進行遠程調試,單步執(zhí)行等。還有允許用戶在調試期間重新編譯被修改的代碼,而不必重新啟動正在調試的程序。其編譯及創(chuàng)建預編譯頭文件(stdafx.h)、最小重建功能及累加連結

24、(link)著稱。這些特征明顯縮短程序編輯、編譯及連結的時間花費,在大型軟件計劃上尤其顯著。</p><p>  1.3 開發(fā)環(huán)境及運行環(huán)境 </p><p>  1.3.1 開發(fā)環(huán)境</p><p>  Intel® Pentium® 4 2.0GHz,512M內存,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 運行環(huán)境 </p><p>  Intel® Pentium® 2及以上處理器,32M以上內存,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)調研</b></p><p>  正式開發(fā)五子棋游戲之前進行調研是非常必要的,其必要性主要表現(xiàn)在以下幾個方面。</p><p> ?。?)明確用戶的要求,以根據(jù)調查結果進行可行性分析,確認系統(tǒng)的開發(fā)是否可行。</p><

28、;p> ?。?)提出新系統(tǒng)的人員并不都是系統(tǒng)研究人員,有些人對于其功能和處理數(shù)據(jù)的方法沒有明確的認識。它們只是根據(jù)自己業(yè)務工作的需要提出了要求,系統(tǒng)開發(fā)人員要對此進行詳細的調查和分析,確認用戶的要求可以通過現(xiàn)有的計算機技術實現(xiàn),保證開發(fā)的管理信息系統(tǒng)的功能與用戶提出的要求相吻合。總之,必要對現(xiàn)行系統(tǒng)進行詳細的調查,明確用戶需求,保證開發(fā)的新系統(tǒng)的功能與用戶的要求相吻合,避免耗費大量的人力、物力、財力,新系統(tǒng)的開發(fā)卻失敗的悲劇發(fā)生。

29、</p><p><b>  2.2可行性分析</b></p><p>  可行性分析是在用戶的要求和系統(tǒng)調研的基礎上進行的,對新系統(tǒng)的開發(fā)從社會、技術、經濟、管理等方面進行分析,并得出新系統(tǒng)的開發(fā)工作可行、不可行、需要修改、追加投資、暫緩開發(fā)、分步實施等方案和結論,最后完成可行性分析??尚行苑治鲆话憧啥x為:可行性分析是在建設的前期對工程項目的一種考察和鑒定,對擬議

30、中的項目進行全面與綜合的技術、經濟能力的調查,判斷它是否可行。</p><p>  可行性分析階段的主要工作包括以下幾個方面:</p><p> ?。?)新系統(tǒng)目標可行性分析:分析新系統(tǒng)的目標是否符合企業(yè)的現(xiàn)狀和發(fā)展的需要。</p><p> ?。?)社會可行性分析:社會可行性分析主要是指管理信息系統(tǒng)的開發(fā)是否符合國家法律政策,是否,能夠與社會大系統(tǒng)實現(xiàn)良好的對接。

31、</p><p>  (3)技術可行性分析:技術可行性分析是根據(jù)新系統(tǒng)的目標來衡量是否具備所需要的技術,包括系統(tǒng)開發(fā)人員數(shù)量和水平,硬件方面,軟件方面及其它應用技術。 </p><p> ?。?)經濟可行性分析 </p><p>  經濟可行性分析主要是對開發(fā)新系統(tǒng)所投入的資金與系統(tǒng)投入使用后所帶來的經濟效益進行比較,確認新系統(tǒng)是否會給企業(yè)帶來一

32、定的經濟效益。</p><p> ?。?)管理可行性分析:</p><p>  管理可行性分析主要是分析企業(yè)現(xiàn)行的管理體制和企業(yè)領導是否具有現(xiàn)代化的管理意識和管理水平。</p><p>  2.3 技術可行性分析</p><p>  技術可行性分析主要包括四個方面:目前有關的技術能否支持所開發(fā)的新系統(tǒng);新系統(tǒng)開發(fā)人員的數(shù)量和水平,即

33、人力資源;硬件和軟件資源。</p><p><b> ?。?)技術支持:</b></p><p>  首先根據(jù)新系統(tǒng)的目標,考慮目前有關的技術能否支持所開發(fā)的新系統(tǒng)。這里討論的技術必須是已經普遍使用的,而不是待研究的或正在研究的。</p><p>  對于本系統(tǒng),本人是采用C++編寫的。而在開發(fā)五子棋的過程運用到了,圖形的繪制(主要是對棋子的繪

34、制,棋盤的繪制的)。還有C++種對聲音的播放方式(主要是用于下棋的時候的落子聲音,悔棋時的聲音,贏棋時的聲音,輸棋的聲音)。文件的保存和載入(主要用于對棋盤信息的儲存和打開)。</p><p><b>  (2)硬件資源:</b></p><p>  開發(fā)管理信息系統(tǒng)所需的硬件資源包含以下兩個方面:</p><p>  系統(tǒng)開發(fā)人員在管理信息系

35、統(tǒng)的開發(fā)過程中所需要的計算機設備及其有關的外部設備;管理信息系統(tǒng)開發(fā)成功投入使用后,使用單位所應具備的計算機設備及其有關的外圍設備。對硬件資源進行可行性分析時主要考慮計算機的主機內存、類型、功能、聯(lián)網(wǎng)能力、安全保護措施以及輸入/輸出設備,外存儲器和聯(lián)網(wǎng)數(shù)據(jù)通信設備的配置、功能、效率等指標是否符合系統(tǒng)方案設計要求,同時還要考慮計算機的性能/價格比。本系統(tǒng)對計算機的要求不高,一般的硬件配置都能運行此系統(tǒng)。</p><p&

36、gt;<b>  3軟件架構</b></p><p><b>  3.1 棋盤類</b></p><p>  整個架構的核心部分。封裝了棋盤的各種可能用到的功能,如初始化、判斷勝負等。用戶操作主界面,主界面與棋盤類進行交互來完成對游戲的操作。</p><p>  3.1.1主要成員變量</p><p&g

37、t;<b> ?。?)棋盤等待</b></p><p>  由于在玩家落子后需要等待對方落子,例如:黑子先下,白字就處于等待狀態(tài),這時白子是不能落子的。還有就是悔棋,直接發(fā)出悔棋信息就能悔棋了。</p><p><b> ?。?)棋盤數(shù)據(jù)</b></p><p>  這是一個15*15的二位數(shù)組,用來保存當前棋盤的落子數(shù)據(jù)

38、。其中對于每個成員來說,0表示落黑子,1表示落白子,-1表示無子。</p><p><b>  (3)游戲模式指針</b></p><p>  這個游戲類的對象指針是可行類的核心內容。它所指向的對象實體決定了可行在執(zhí)行一件事情時候的不同行為,具體的內容請參見“游戲模式”一節(jié)。</p><p><b> ?。?)網(wǎng)絡連接</b&g

39、t;</p><p>  用來表示當前網(wǎng)絡連接的情況,在網(wǎng)絡對弈游戲模式下客戶端連接服務器的時候用來判斷是否連接成功;事實上,它也是區(qū)分當前游戲模式的唯一標志。</p><p>  3.2 主要成員函數(shù)說明</p><p>  3.2.1 清空棋盤</p><p>  在每一局游戲開始的時候都需要調用這個函數(shù)將棋盤清空,也就是棋盤的初始化工作

40、。在這個函數(shù)中,主要發(fā)生了這么幾件事情:</p><p> ?。?)將數(shù)據(jù)中的每一個落子位置為無子狀態(tài)(-1)。</p><p> ?。?)按照傳入的參數(shù)設置棋盤等待標志wait,以供先、后手的不同情況之用。</p><p>  (3)使用delete將came的指針所指向的原有游戲模式對象從堆上刪除。</p><p>  3.2.2 繪制棋

41、子</p><p>  這無疑是很重要的一個函數(shù),它根據(jù)參數(shù)給定的坐標和顏色繪制棋子。繪制的詳細過程如下:</p><p>  (1)將給定的棋盤坐標換算為繪圖的像素坐標。</p><p> ?。?)根據(jù)坐標繪制棋子位圖。</p><p> ?。?)如果先前曾下過棋子,則將上一個繪制棋子上的最后落子指示矩形擦除。</p><

42、;p> ?。?)在剛繪制完成的棋子四周繪制最后落子指示矩形。</p><p>  3.2.3 左鍵消息</p><p>  作為棋盤唯一響應的左鍵消息,也需要做工作:</p><p>  (1)如果棋盤等待標志wait為true,則直接發(fā)出警告聲音并返回,即禁止落子。</p><p> ?。?)如果點擊時的鼠標坐標在合法坐標(0,

43、60;0)~(14, 14)之外,亦禁止落子。</p><p> ?。?)如果走的步數(shù)大于1步,方才允許悔棋。</p><p> ?。?)進行勝利判斷,如勝利則修改UI狀態(tài)并增加勝利數(shù)的統(tǒng)計。</p><p> ?。?)如未勝利,則向對方發(fā)送已經落子的消息。</p><p>  (6)落子完畢,將Wait標志置為TRUE,開始等待對

44、方回應。</p><p>  3.2.4 繪制棋盤</p><p>  每當圖像消息觸發(fā)時,都需要對棋盤進行重繪。在圖像上作為響應繪制消息的消息處理函數(shù)使用了雙緩沖技術,減少了多次繪圖可能導致的圖像閃爍問題。這個函數(shù)主要完成了以下工作:</p><p> ?。?)裝載棋盤位圖并進行繪制。</p><p> ?。?)根據(jù)棋盤數(shù)據(jù)繪制棋子。<

45、;/p><p> ?。?)繪制最后落子指示矩形。</p><p>  3.2.5 對方落子完畢</p><p>  在對方落子之后,仍然需要做一些判斷工作,這些工作與左鍵消息中的類似,在此不再贅述。</p><p>  3.2.6 勝負的判斷</p><p>  這是游戲中一個極其重要的算法,用來判斷當前棋盤的形勢是哪一方

46、獲勝。</p><p><b>  3.3 游戲模式類</b></p><p>  這個類負責對游戲模式進行管理,以及在不同的游戲模式下對不同的用戶行為進行不同的響應。由于并不需要CGame本身進行響應,所以將其設計為了一個純虛類。</p><p>  3.3.1主要成員變量</p><p><b> ?。?)

47、棋盤指針</b></p><p>  由于在游戲中需要對棋盤以及棋盤的父窗口——主對話框進行操作及UI狀態(tài)設置,故為CGame類設置了這個成員。</p><p><b> ?。?)落子步驟</b></p><p>  一個好的棋類程序必須要考慮到的功能就是它的悔棋功能,所以需要為游戲類設置一個落子步驟的列表。由于人機對弈和網(wǎng)絡對弈中

48、都需要這個功能,故將這個成員直接設置到基類CGame中。</p><p>  3.3.2主要成員函數(shù)</p><p><b> ?。?)悔棋操作</b></p><p>  在不同的游戲模式下,悔棋的行為是不一樣的。</p><p>  人機對弈模式下,計算機是完全允許玩家悔棋的,但是出于對程序負荷的考慮,只允許玩家悔棋

49、當前的兩步棋(計算機一步,玩家一步)。</p><p>  雙人對弈模式下,悔棋的過程為:首先由玩家向對方說出悔棋請求(悔棋消息),然后由對方決定是否允許玩家悔棋,在玩家得到對方的響應消息(允許或者拒絕)之后,才進行悔棋與否的操作。</p><p><b> ?。?)初始化操作</b></p><p>  對于不同的游戲模式而言,也就有不同的初

50、始化方式。對于人機對弈模式而言,初始化操作包括以下幾個步驟:</p><p>  設置主界面計算機玩家的姓名;</p><p>  初始化所有的獲勝組合;</p><p>  如果是計算機先走,則占據(jù)天元(棋盤正中央)的位置。</p><p><b>  發(fā)送落子消息</b></p><p>  

51、在玩家落子結束后,要向對方發(fā)送自己落子的消息。對于不同的游戲模式,發(fā)送的目標也不同:對于人機對弈游戲模式,將直接把落子的信息(坐標、顏色)發(fā)送給相應的計算函數(shù); 對于雙人對弈游戲模式,將把落子消息發(fā)送給套接字,并由套接字轉發(fā)給對方。</p><p><b> ?。?)勝利后的處理</b></p><p>  這個成員函數(shù)主要針對雙人對弈模式。在玩家贏得棋局后,這個函數(shù)

52、仍然會調用將玩家所下的制勝落子步驟發(fā)送給對方玩家,然后由游戲端來判定自己失敗。</p><p><b>  3.4 資源編輯</b></p><p>  由于我們這個程序出現(xiàn)的關于資源編輯的內容太多,我們具體介紹如下: 見下圖3-1和圖3-2,我們需要添加的有:</p><p><b>  說明: </b><

53、;/p><p>  由于下棋時我們必須把鼠標熱點設置在中間,點擊下圖(圖3-3)最右邊按扭,然后把鼠標移動到圖像中你想設置為熱點的地方,按下鼠標左鍵。</p><p><b>  說明: </b></p><p>  由于我們的圖標支持256色,按下下圖(圖3-4)最右邊按扭,選擇Device里面顯示的選項。</p><

54、;p><b>  說明: </b></p><p>  工具欄一般都是根據(jù)菜單選項而產生的,它的ID一般都能從菜單的ID中找到。</p><p><b>  3.5消息說明</b></p><p>  網(wǎng)絡間傳遞的消息,都遵循以下一個結構體的形式:</p><p>  我們這用SY來

55、表示消息的id。</p><p>  縱軸用x,橫軸用y,x、y表示落子的坐標。</p><p>  Color表示落子的顏色。</p><p>  SSY隨著SY的不同而不同。</p><p><b>  3.5.1落子消息</b></p><p>  表明對方落下了一個棋子,其中x、y和col

56、or成員有效SSY成員無效。在人機對弈游戲模式下,亦會模擬發(fā)送此消息以達到程序模塊一般化的效果。</p><p><b>  3.5.2聲音消息</b></p><p>  你可以選著你想要的,有聲或者無聲。建議有聲,因為有聲音將會提示,如果你快輸時,會發(fā)出一個響聲的。而且有聲音更加的增加了游戲的樂趣。</p><p><b>  3

57、.5.3提示消息</b></p><p>  當你想不到你下一步下那個位置的時候,你可以選擇提示選項,它將會為你提示出下一步該如何去落子。</p><p><b>  3.5.4悔棋消息</b></p><p>  表示你想悔棋,那么你就直接發(fā)出消息,直接悔棋一步,而不能悔棋兩步,還有就是,重新下了第二步后,可以重新悔棋,不過還是只

58、能悔棋一步。</p><p><b>  3.5.5輸贏消息</b></p><p>  你贏了,就是顯示你贏,而你輸,就顯示你輸了。其中,還有你共下了多少步而輸或贏了對手,反之一樣。當然也提供了,悔棋多少步的信息出來。還有你的評語消息。</p><p>  3.5.6再次開局消息</p><p>  表示你想再開一局,

59、那你就直接發(fā)出消息,然后再開一局。當然,你可以選著人機對戰(zhàn)或者雙人對戰(zhàn)。當你選著人機對戰(zhàn)時,你還可以選著你想要的機器的智能,你選著的級別越高,智能也就越高。</p><p><b>  4主要算法</b></p><p>  五子棋游戲中,有相當?shù)钠撬惴ǖ牟糠帧o論是人機對弈,還是網(wǎng)絡對弈,都需要合理算法的支持,本節(jié)中將詳細介紹五子棋中使用的算法。</p&g

60、t;<p><b>  4.1判斷勝負</b></p><p>  五子棋的勝負,在于判斷棋盤上是否有一個點,從這個點開始的右、下、右下、左下四個方向是否有連續(xù)的五個同色棋子出現(xiàn),如圖4-1所示。</p><p>  圖4-1判斷勝負方向</p><p>  這個算法也就是CTable的Win成員函數(shù)。從設計的思想上,需要它接受一

61、個棋子顏色的參數(shù),然后返回一個布爾值,這個值來指示是否勝利。流程圖如下圖4-2:</p><p>  圖4-2 判斷勝負流程圖</p><p>  由于這個算法所遵循的搜索順序是從左到右、自上而下,因此在每次循環(huán)的時候,都有一些坐標無需納入考慮范圍。例如對于橫向判斷而言,由于右邊界所限,因而所有橫坐標大于等于11的點,都構不成達到五子連的條件,所以橫坐標的循環(huán)上界也就定為11,這樣也就提高

62、了搜索的速度。</p><p><b>  4.2人機對弈算法</b></p><p>  人機對弈算法完全按照CGame基類定義的接口標準,封裝在了COneGame派生類之中。下面將對這個算法進行詳細地介紹。</p><p><b>  4.2.1獲勝組合</b></p><p>  獲勝組合是一

63、個三維數(shù)組,它記錄了所有取勝的情況。也就是說,參考于CTable::Win中的情況,對于每一個落子坐標,獲勝的組合一共有 </p><p>  15 * 11 * 2 + 11 * 11 * 2 = 572種。 </p><p>  而對于每個坐標的獲

64、勝組合,應該設置一個[15][15][572]大小的三維數(shù)組。 在擁有了這些獲勝組合之后,就可以參照每個坐標的572種組合給自己的局面和玩家的局面進行打分,也就是根據(jù)當前盤面中某一方所擁有的獲勝組合多少進行權值的估算,給出最有利于自己的一步落子坐標。 </p><p>  由于是雙方對弈,所以游戲的雙方都需要一份獲勝組合,也就是: </p><p><b>

65、  電腦獲勝組</b></p><p><b>  玩家獲勝組合 </b></p><p>  在每次游戲初始化的時候,需要將每個坐標下可能的獲勝組合都置為true。 </p><p>  在初始化的時候,將每個棋子數(shù)置為0。</p><p>  4.2.2落子后處理</p>

66、<p>  每當一方落子后,都需要作如下處理: </p><p>  如果己方此坐標的獲勝組合仍為true,且仍有可能在此獲勝組合處添加棋子,則將此獲勝組合添加棋子數(shù)加1;</p><p>  如果對方此坐標的獲勝組合仍為true,則將對方此坐標的獲勝組合置為false,并將對方此獲勝組合添加棋子數(shù)置為-1(不可能靠此組合獲勝)。</p><p&g

67、t;  4.2.3查找棋盤空位</p><p>  在計算機落子之前,需要查找棋盤的空位,所以需要一個SearchBlank成員函數(shù)完成此項工作,此函數(shù)需要進行不重復的查找,也就是說,對已查找過的空位進行標記,并返回找到空位的坐標。</p><p><b>  4.2.4落子打分</b></p><p>  找到空位后,需要對這個點的落子進行打

68、分,這個分數(shù)也就是這個坐標重要性的體現(xiàn)。</p><p>  考慮到攻守兩方面的需要,所以將玩家落子給的分數(shù)置為負值。</p><p><b>  4.2.5防守策略</b></p><p>  落子的考慮不單單要從進攻考慮,還要從防守考慮。這一細節(jié)的實現(xiàn)其實就是讓計算機從玩家棋盤布局分析戰(zhàn)況,然后找出對玩家最有利的落子位置。</p>

69、;<p>  4.2.6選取最佳落子</p><p>  它的實現(xiàn)原理是:在四個方向上,各自計算那個方向上棋子的狀態(tài),我們的思路是利用原來定義的白棋為1,黑棋為-1,的思想,讓同個方向上的五個棋子的值相加,取絕對值并賦值給為這個方向定義的局部變量。 </p><p>  為什么要用五個棋子的值相加呢?因為,如果幾個棋子是同色的,無論黑白,它的絕對值必然大,而對于幾個

70、棋子中有黑棋和白棋的,其值必然相加而抵消變小。所以我們可以利用這種方法來尋找旁邊有多個同色棋子的空位置。 </p><p>  在每一個棋盤位置,計算以它為起點的四個方向(上、下、右下、左下),再比較這四個方向中哪個值最大,然后在這個方向上尋找落棋點。</p><p><b>  5 軟件實現(xiàn)</b></p><p><b>

71、;  5.1游戲運行</b></p><p><b> ?。?)游戲開始 </b></p><p>  自主選擇是人機對戰(zhàn)亦或是人人對戰(zhàn),還有先手問題,你先或是計算機先,音效是開活關。如下圖5-1所示</p><p>  圖 5-1 五子棋開始界面</p><p><b>  (2)游戲界面<

72、;/b></p><p>  如下圖5-2所示為于計算機對弈,你先下</p><p>  圖 5-2 五子棋界面</p><p> ?。?)游戲的工具欄-上有所需要的選項</p><p>  游戲難度選擇可在游戲【G】上選擇,新開局,英雄榜等等選項。如下圖5-3所示。</p><p>  圖5-3 五子棋游戲工具

73、欄</p><p><b>  (4)悔棋</b></p><p>  在選項上可以選擇悔棋選項如下圖5-4。</p><p><b>  圖5-4 選項</b></p><p><b> ?。?)游戲結束</b></p><p><b>  

74、例如下圖5-5所示</b></p><p>  圖 5-5 游戲結束界面</p><p><b>  6補充說明</b></p><p>  考慮到程序的響應速度,人機對弈算法只對玩家的棋子進行了一步的推測。</p><p>  由于計算機在落子時選取的是得分最高的一步落子,所以如果玩家在開局的時候不改變落子

75、步驟,那么將會獲得從頭至尾相同的棋局。</p><p>  對于人機對弈的悔棋處理,由于這個算法的開銷相當大,每一步落子都會存在不同的棋盤布局,所以實現(xiàn)從頭到尾的悔棋不是很現(xiàn)實(將會存在過多的空間保存棋盤布局),因而在人機對弈模式下,只允許玩家悔最近的兩步落子。</p><p><b>  7結論</b></p><p>  考慮到程序的響應速

76、度,人機對弈算法只對玩家的棋子進行了一步的推測。 </p><p>  由于計算機在落子時選取的是得分最高的一步落子,所以如果玩家在開局的時候不改變落子步驟,那么將會獲得從頭至尾相同的棋局。 </p><p>  考慮到下棋同時還要聊天,所以并未對落子時間加入任何限制,同樣如果玩家離開游戲也不會判負。 </p><p>  對于人機對弈

77、的悔棋處理,由于這個算法的開銷相當大,每一步落子都會存在不同的棋盤布局,所以實現(xiàn)從頭到尾的悔棋不是很現(xiàn)實(將會存在過多的空間保存棋盤布局),因而在人機對弈模式下,只允許玩家悔最近的兩步落子。</p><p>  通過編寫這個程序,我體會最為深刻的一點是系統(tǒng)架構和設計模式的重要性。即使是對于一個并不大的程序,代碼的組織都是非常重要的,因為這關系到日后的維護以及擴展。這個游戲之中,有關網(wǎng)絡Socket編程或者博弈樹算

78、法的知識都可以直接從無所不包的Internet上獲取,甚至可以直接獲得一個完整的五子棋人機對弈算法的源代碼級模塊。但是對于系統(tǒng)的架構,卻完全是自己的事情,幾千上萬行的代碼需要通過合適的方法組織起來,使程序員編寫代碼更加有條理,更加符合軟件工程的標準,這才是最重要的。 </p><p>  在剛開始編寫這個程序的時候,我幼稚地認為其中最重要的是博弈樹算法。但是頭一個月編寫程序的時候卻發(fā)現(xiàn)程序越寫越不容易維

79、護,可見是我走錯了方向。后來我向公司真正的軟件設計人員及系統(tǒng)架構師討教,他們告訴我:我們的先人早已為我們準備好了各種精良可用的現(xiàn)成算法,我們所要做的就是直接“拿來主義”罷了;但是對于代碼的組織(也就是軟件的架構)才是真正軟件工業(yè)的核心部分,因為軟件事實上是直接和經濟掛鉤的,因此我們必須在編寫代碼之前選擇一種最為合適的方法來組織這些代碼,否則我們將會失去更多的時間和金錢。</p><p><b>  致謝

80、</b></p><p>  最后在學校的這幾周,由于找工作和戶籍的原因而無法抽出更多的時間來做好這畢業(yè)的要求,但在這么短的時間內還是有著現(xiàn)在這論文,最要感謝的還是我們劉博老師,因為他在讀博期間還那么用心的幫助我們,還每周讓我們匯報情況,幫助我們去修改一些錯誤。當然也要感謝給我?guī)椭暮糜褌?,給予我很多支持。</p><p><b>  參考文獻</b>&l

81、t;/p><p>  [1]MSDN for Visual Studio 6.0 </p><p>  [2]設計模式——可復用面向對象軟件的基礎,Erich Gamma/Richard Helm/Ralph Johnson/John Vlissides著,李英軍/馬曉星/蔡敏/劉建中 等譯,機械工業(yè)出版

82、社 </p><p>  [3]深入淺出MFC(第2版),侯俊杰著,華中科技大學出版社 </p><p>  [4]Microsoft®VisualC++.NET 技術內幕</p><p> ?。ǖ?版),George Shepherd/David Kruglinski著,潘愛民譯,清華大學出版社 

83、;</p><p>  [5]Visual C++網(wǎng)絡通信協(xié)議分析與應用實現(xiàn),汪曉平/鐘軍 等編著,人民郵電出版社 </p><p>  [6]C++編程思想,Bruce Eckel著,劉宗田/邢大紅/孫慧杰等譯,機械工業(yè)出版社 </p><p>  [7]21天學通C++,Jesse Liberty著,康博創(chuàng)作室譯,人民郵電

84、出版社 </p><p>  [8]C++標準程序庫,Nicolai M.Josuttis著,侯捷/孟巖 譯,華中科技大學出版社 </p><p>  [9]Windows程序設計,Charles Petzold著,北京博彥科技發(fā)展有限公司譯,北京大學出版社 </p><p>  [10]Visual

85、60;C++.NET網(wǎng)絡編程,易君 編著,中國鐵道出版社 </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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論