基于visual c++的五子棋游戲畢業(yè)設(shè)計(jì)_第1頁(yè)
已閱讀1頁(yè),還剩18頁(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>  2011屆畢業(yè)論文</b></p><p>  基于Visual C++的五子棋游戲設(shè)計(jì)</p><p>  ——主要算法的設(shè)計(jì)與實(shí)現(xiàn)</p><p>  學(xué) 院: 信息學(xué)院 </p><p>  學(xué)生姓名: XXX </p&g

2、t;<p>  指導(dǎo)教師: </p><p>  專 業(yè): 軟件技術(shù) </p><p>  班 級(jí): 08軟件1班 </p><p>  完成時(shí)間: 2011年6月29日 </p><p><b>  摘 要</b>

3、</p><p>  本論文主要闡述以面向?qū)ο蟮某绦蜷_發(fā)語(yǔ)言VC++為開發(fā)工具,設(shè)計(jì)一個(gè)五子棋游戲。本系統(tǒng)是個(gè)小型游戲,可以單機(jī)使用,也可以網(wǎng)絡(luò)兩個(gè)人游戲,也可以和電腦進(jìn)行游戲。論文首先介紹了開發(fā)背景及開發(fā)語(yǔ)言的介紹。然后介紹設(shè)計(jì)該游戲的框架結(jié)構(gòu),然后介紹了程序的設(shè)計(jì)過(guò)程,以及程序的相關(guān)算法。其中算法是我主要負(fù)責(zé)的,算法(Algorithm)是一系列解決問(wèn)題的清晰指令,算法代表著用系統(tǒng)的方法描述解決問(wèn)題的策略機(jī)制

4、。也就是說(shuō),能夠?qū)σ欢ㄒ?guī)范的輸入,在有限時(shí)間內(nèi)獲得所要求的輸出。如果一個(gè)算法有缺陷,或不適合于某個(gè)問(wèn)題,執(zhí)行這個(gè)算法將不會(huì)解決這個(gè)問(wèn)題。不同的算法可能用不同的時(shí)間、空間或效率來(lái)完成同樣的任務(wù)。</p><p>  關(guān)鍵詞:游戲,系統(tǒng),圖片,算法, Visual C++ </p><p><b>  Abstract</b></p><p> 

5、 This paper mainly expounds on object-oriented programming language for development tools, design of vc + + a renju game. This system is a small game, can use single, also can network two game, can also and computer game

6、s. It firstly introduces the development background and development of language is introduced. And then introduced the design frame structure of the game, then introduces the design process of the program, and the relate

7、d algorithm procedures. Among them is I mainly responsible fo</p><p>  Keywords: The game, the system, pictures,algorithm, Visual C + + </p><p><b>  目 錄</b></p><p><

8、b>  1引言1</b></p><p>  1.1 五子棋介紹1</p><p>  1.2 開發(fā)背景1</p><p>  1.3 開發(fā)環(huán)境及運(yùn)行環(huán)境1</p><p>  1.3.1 開發(fā)環(huán)境1</p><p>  1.3.2 運(yùn)行環(huán)境1</p><p>  

9、2 C++簡(jiǎn)介2</p><p><b>  3 軟件架構(gòu)2</b></p><p><b>  3.1 棋盤類3</b></p><p>  3.2 游戲模式類3</p><p><b>  4 主要算法4</b></p><p>  4.

10、1 判斷勝負(fù)4</p><p>  4.2 人機(jī)對(duì)弈算法6</p><p>  4.2.1 獲勝組合6</p><p>  4.2.2 落子后處理7</p><p>  4.2.3 查找棋盤空位7</p><p>  4.2.4 落子打分8</p><p>  4.2.5 防守策略

11、10</p><p>  4.2.6 選取最佳落子11</p><p>  4.2.7統(tǒng)計(jì)數(shù)據(jù)11</p><p>  5 幾點(diǎn)補(bǔ)充說(shuō)明15</p><p><b>  6 心得體會(huì)15</b></p><p><b>  參考文獻(xiàn)16</b></p>

12、<p><b>  致謝16</b></p><p><b>  1引言</b></p><p><b>  1.1 五子棋介紹</b></p><p>  五子棋是起源于中國(guó)古代的傳統(tǒng)黑白棋種之一?,F(xiàn)代五子棋日文稱之為“連珠”,英譯為“Renju”,英文稱之為“Gobang”或“FIR

13、”(Five in a Row的縮寫),亦有“連五子”、“五子連”、“串珠”、“五目”、“五目碰”、“五格”等多種稱謂。</p><p>  五子棋不僅能增強(qiáng)思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。五子棋既有現(xiàn)代休閑的明顯特征“短、平、快”,又有古典哲學(xué)的高深學(xué)問(wèn)“陰陽(yáng)易理”;它既有簡(jiǎn)單易學(xué)的特性,為人民群眾所喜聞樂(lè)見(jiàn),又有深?yuàn)W的技巧和高水平的國(guó)際性比賽;它的棋文化源淵流長(zhǎng),具有東方的神秘和西方的直觀;

14、既有“場(chǎng)”的概念,亦有“點(diǎn)”的連接。它是中西文化的交流點(diǎn),是古今哲理的結(jié)晶。</p><p><b>  1.2 開發(fā)背景</b></p><p>  當(dāng)前網(wǎng)絡(luò)上流傳的五子棋游戲功能并不盡善盡美,其中最主要的問(wèn)題就是人機(jī)對(duì)戰(zhàn)和網(wǎng)絡(luò)對(duì)戰(zhàn)不能夠一起實(shí)現(xiàn),所以我決定開發(fā)[1]一個(gè)既能夠人機(jī)對(duì)戰(zhàn),又能夠進(jìn)行網(wǎng)絡(luò)對(duì)戰(zhàn)的五子棋系統(tǒng)。</p><p>  1

15、.3 開發(fā)環(huán)境及運(yùn)行環(huán)境</p><p>  1.3.1 開發(fā)環(huán)境</p><p>  Intel® Pentium® Y450,2G內(nèi)存,320G硬盤</p><p>  Microsoft® Windows? XP Professional</p><p>  Microsoft® Visual C

16、++ 6.0</p><p>  Microsoft® Developer Network for Visual Studio.NET 2003</p><p>  Visual Assist X 10.1.1301.0</p><p>  1.3.2 運(yùn)行環(huán)境</p><p>  Intel® Pentium®

17、 2及以上處理器,32M以上內(nèi)存,4G以上硬盤</p><p>  Microsoft® Windows? 9X/NT操作系統(tǒng)</p><p>  800*600或以上的屏幕分辨率</p><p><b>  2 C++簡(jiǎn)介</b></p><p>  語(yǔ)言之所以要起名為“C”,是因?yàn)樗侵饕獏⒖寄莻€(gè)時(shí)候的一

18、門叫B的語(yǔ)言,它的設(shè)計(jì)者認(rèn)為C語(yǔ)言是B語(yǔ)言的進(jìn)步,所以就起名為C語(yǔ)言;但是B語(yǔ)言并不是因?yàn)橹斑€有個(gè)A語(yǔ)言,而是B語(yǔ)言的作者為了紀(jì)念他的妻子,他的妻子名字的第一個(gè)字母是B; 當(dāng)C語(yǔ)言發(fā)展到頂峰的時(shí)刻,出現(xiàn)了一個(gè)版本叫C with Class,那就是C++最早的版本,在C語(yǔ)言中增加class關(guān)鍵字和類,那個(gè)時(shí)候有很多版本的C都希望在C語(yǔ)言中增加類的概念;后來(lái)C標(biāo)準(zhǔn)委員會(huì)決定為這個(gè)版本的C起個(gè)新的名字,那個(gè)時(shí)候征集了很多種名字,最后采納了其

19、中一個(gè)人的意見(jiàn),以C語(yǔ)言中的++運(yùn)算符來(lái)體現(xiàn)它是C語(yǔ)言的進(jìn)步,故而叫C++,成立了C++標(biāo)準(zhǔn)委員會(huì)。</p><p>  C++是一種語(yǔ)言,僅僅是它的語(yǔ)法、特性、標(biāo)準(zhǔn)類庫(kù)就已經(jīng)是一門非常高深的課程,C++設(shè)計(jì)成靜態(tài)類型、和C同樣高效且可移植的多用途程序設(shè)計(jì)語(yǔ)言。設(shè)計(jì)成直接的和廣泛的支援多種程序設(shè)計(jì)風(fēng)格(程序化程序設(shè)計(jì)、資料抽象化、面向?qū)ο蟪绦蛟O(shè)計(jì)、泛型程序設(shè)計(jì))。設(shè)計(jì)成給程序設(shè)計(jì)者更多的選擇,即使可能導(dǎo)致程序設(shè)計(jì)

20、者選擇錯(cuò)誤。設(shè)計(jì)成盡可能與C兼容,籍此提供一個(gè)從C到C++的平滑過(guò)渡。避免平臺(tái)限定或沒(méi)有普遍用途的特性。不使用會(huì)帶來(lái)額外開銷的特性。設(shè)計(jì)成無(wú)需復(fù)雜的程序設(shè)計(jì)環(huán)境。</p><p>  C++標(biāo)準(zhǔn)演變了許多年。C++模板是近幾年來(lái)對(duì)此語(yǔ)言的一種擴(kuò)展,模板是根據(jù)類型參數(shù)來(lái)產(chǎn)生函數(shù)和類的機(jī)制,有時(shí)也稱模板為“參數(shù)化的類型”。使用模板,可以設(shè)計(jì)一個(gè)對(duì)許多類型的數(shù)據(jù)進(jìn)行操作的類,而不需要為每個(gè)類型的數(shù)據(jù)建立一個(gè)單獨(dú)的類。標(biāo)

21、準(zhǔn)模板庫(kù)(Standard Tempalte Library,STL )和微軟的活動(dòng)模板庫(kù)(Active Tempalte Library,ATL )都基于這個(gè)C++語(yǔ)言擴(kuò)展。</p><p>  C++標(biāo)準(zhǔn)可分為兩部分, C++語(yǔ)言本身和C++標(biāo)準(zhǔn)庫(kù)。C++標(biāo)準(zhǔn)庫(kù)對(duì)于Visual C++是相當(dāng)新的,實(shí)際上微軟只是在發(fā)布Visual C++ 5.0時(shí)去除了一些“bug”。標(biāo)準(zhǔn)庫(kù)提供了標(biāo)準(zhǔn)的輸入/輸出、字符串、容器

22、(如矢量、列表和映射等)、非數(shù)值運(yùn)算(如排序、搜索和合并等)和對(duì)數(shù)值計(jì)算的支持。應(yīng)該說(shuō), C/C++包含了相對(duì)少的關(guān)鍵字,而且很多最有用的函數(shù)都來(lái)源于庫(kù),C++標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)容器和算法的部分就是STL。     STL是數(shù)據(jù)結(jié)構(gòu)和算法的一個(gè)框架,數(shù)據(jù)結(jié)構(gòu)包括矢量、列表和映射等,算法包括這些數(shù)據(jù)結(jié)構(gòu)的查找、拷貝和排序等。1994年7月,ANSI/ISO C++標(biāo)準(zhǔn)委員會(huì)投票決定接受STL為C++標(biāo)

23、準(zhǔn)庫(kù)的一部分,這個(gè)建議是根據(jù)Alex Stepanov、Meng Lee和David Musser這三人的編程和軟件庫(kù)研究提出的。STL的產(chǎn)生是為了滿足通用性的設(shè)計(jì)目標(biāo),而不是為了提高性能。</p><p><b>  3 軟件架構(gòu)</b></p><p>  軟件的總體架構(gòu)如圖3.1:</p><p><b>  圖3.1 軟件架構(gòu)

24、</b></p><p>  考慮到整個(gè)的下棋過(guò)程(無(wú)論對(duì)方是電腦抑或其他網(wǎng)絡(luò)玩家)可以分為:己方落子、等待對(duì)方落子、對(duì)方落子、設(shè)置己方棋盤數(shù)據(jù)這一系列過(guò)程,因此一人游戲類、二人游戲類和棋盤類之間的關(guān)系參考了AbstractFactory(抽象工廠)模式,以實(shí)現(xiàn)對(duì)兩個(gè)不同模塊進(jìn)行一般化的控制。[2]</p><p><b>  3.1 棋盤類</b><

25、;/p><p>  整個(gè)架構(gòu)的核心部分,類名為CTable。封裝了棋盤的各種可能用到的功能[3],如保存棋盤數(shù)據(jù)、初始化、判斷勝負(fù)等。用戶操作主界面,主界面與CTable進(jìn)行交互來(lái)完成對(duì)游戲的操作。</p><p><b>  3.2 游戲模式類</b></p><p>  用來(lái)管理人機(jī)對(duì)弈/網(wǎng)絡(luò)對(duì)弈兩種游戲模式,類名為CGame。CGame是一個(gè)

26、抽象類,經(jīng)由它派生出一人游戲類COneGame和網(wǎng)絡(luò)游戲類CTwoGame,如圖3.2:</p><p>  圖3.2 CGame類派生關(guān)系</p><p>  這樣,CTable類就可以通過(guò)一個(gè)CGame類的指針[4],在游戲初始化的時(shí)候根據(jù)具體游戲模式的要求實(shí)例化COneGame或CTwoGame類的對(duì)象;然后利用多態(tài)性[5],使用CGame類提供的公有接口就可以完成不同游戲模式下的不

27、同功能了。</p><p><b>  4 主要算法</b></p><p>  五子棋游戲中,有相當(dāng)?shù)钠撬惴ǖ牟糠?。無(wú)論是人機(jī)對(duì)弈,還是網(wǎng)絡(luò)對(duì)弈,都需要合理算法的支持,本節(jié)中將詳細(xì)介紹五子棋中使用的算法。[13]</p><p><b>  4.1 判斷勝負(fù)</b></p><p>  五子棋

28、的勝負(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ì)的思想上,需要它接受一個(gè)棋子顏色的參數(shù),然后返回一個(gè)布爾值,這個(gè)值來(lái)指示是否勝利,代碼如下:</p><p>  BOOL CTabl

29、e::Win( int color ) const</p><p><b>  {</b></p><p><b>  int x, y;</b></p><p><b>  // 判斷橫向</b></p><p>  for ( y = 0; y < 15; y++ )

30、</p><p><b>  {</b></p><p>  for ( x = 0; x < 11; x++ )</p><p><b>  {</b></p><p>  if ( color == m_data[x][y] &&</p><p> 

31、 color == m_data[x + 1][y] &&</p><p>  color == m_data[x + 2][y] &&</p><p>  color == m_data[x + 3][y] &&</p><p>  color == m_data[x + 4][y] )</p><

32、;p><b>  {</b></p><p>  return TRUE;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b&g

33、t;  // 判斷縱向</b></p><p>  for ( y = 0; y < 11; y++ )</p><p><b>  {</b></p><p>  for ( x = 0; x < 15; x++ )</p><p><b>  {</b></p>

34、;<p>  if ( color == m_data[x][y] &&</p><p>  color == m_data[x][y + 1] &&</p><p>  color == m_data[x][y + 2] &&</p><p>  color == m_data[x][y + 3] &a

35、mp;&</p><p>  color == m_data[x][y + 4] )</p><p><b>  {</b></p><p>  return TRUE;</p><p><b>  }</b></p><p><b>  }</b&g

36、t;</p><p><b>  }</b></p><p>  // 判斷“\”方向</p><p>  for ( y = 0; y < 11; y++ )</p><p><b>  {</b></p><p>  for ( x = 0; x < 11;

37、x++ )</p><p><b>  {</b></p><p>  if ( color == m_data[x][y] &&</p><p>  color == m_data[x + 1][y + 1] &&</p><p>  color == m_data[x + 2][y +

38、 2] &&</p><p>  color == m_data[x + 3][y + 3] &&</p><p>  color == m_data[x + 4][y + 4] )</p><p><b>  {</b></p><p>  return TRUE;</p>

39、<p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  // 判斷“/”方向</p><p>  for ( y = 0; y < 11; y++ )</p><p

40、><b>  {</b></p><p>  for ( x = 4; x < 15; x++ )</p><p><b>  {</b></p><p>  if ( color == m_data[x][y] &&</p><p>  color == m_data[

41、x - 1][y + 1] &&</p><p>  color == m_data[x - 2][y + 2] &&</p><p>  color == m_data[x - 3][y + 3] &&</p><p>  color == m_data[x - 4][y + 4] )</p><

42、p><b>  {</b></p><p>  return TRUE;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  // 不滿足

43、勝利條件</p><p>  return FALSE;</p><p><b>  }</b></p><p>  需要說(shuō)明的一點(diǎn)是,由于這個(gè)算法所遵循的搜索順序是從左到右、自上而下,因此在每次循環(huán)的時(shí)候,都有一些坐標(biāo)無(wú)需納入考慮范圍。例如對(duì)于橫向判斷而言,由于右邊界所限,因而所有橫坐標(biāo)大于等于11的點(diǎn),都構(gòu)不成達(dá)到五子連的條件,所以橫坐標(biāo)的

44、循環(huán)上界也就定為11,這樣也就提高了搜索的速度。</p><p>  4.2 人機(jī)對(duì)弈算法</p><p>  人機(jī)對(duì)弈算法完全按照CGame基類定義的接口標(biāo)準(zhǔn),封裝在了COneGame派生類之中。下面將對(duì)這個(gè)算法進(jìn)行詳細(xì)地介紹。[14]</p><p>  4.2.1 獲勝組合</p><p>  獲勝組合是一個(gè)三維數(shù)組,它記錄了所有取勝的

45、情況。也就是說(shuō),參考于CTable::Win中的情況,對(duì)于每一個(gè)落子坐標(biāo),獲勝的組合一共有</p><p>  15 * 11 * 2 + 11 * 11 * 2 = 572種。</p><p>  而對(duì)于每個(gè)坐標(biāo)的獲勝組合,應(yīng)該設(shè)置一個(gè)[15][15][572]大小的三維數(shù)組。</p><p>  在擁有了這些獲勝組合之后,就可以參照每個(gè)坐標(biāo)的572種組合給自己的

46、局面和玩家的局面進(jìn)行打分,也就是根據(jù)當(dāng)前盤面中某一方所擁有的獲勝組合多少進(jìn)行權(quán)值的估算,給出最有利于自己的一步落子坐標(biāo)。</p><p>  由于是雙方對(duì)弈,所以游戲的雙方都需要一份獲勝組合,也就是:</p><p>  bool m_Computer[15][15][572]; // 電腦獲勝組合</p><p>  bool m_Player[15][15][5

47、72]; // 玩家獲勝組合</p><p>  在每次游戲初始化(COneGame::Init)的時(shí)候,需要將每個(gè)坐標(biāo)下可能的獲勝組合都置為true。</p><p>  此外,還需要設(shè)置計(jì)算機(jī)和玩家在各個(gè)獲勝組合中所填入的棋子數(shù):</p><p>  int m_Win[2][572];</p><p>  在初始化的時(shí)候,將每個(gè)棋子數(shù)置

48、為0。</p><p>  4.2.2 落子后處理</p><p>  每當(dāng)一方落子后,都需要作如下處理:</p><p>  如果己方此坐標(biāo)的獲勝組合仍為true,且仍有可能在此獲勝組合處添加棋子,則將此獲勝組合添加棋子數(shù)加1;</p><p>  如果對(duì)方此坐標(biāo)的獲勝組合仍為true,則將對(duì)方此坐標(biāo)的獲勝組合置為false,并將對(duì)方此獲勝

49、組合添加棋子數(shù)置為-1(不可能靠此組合獲勝)。</p><p>  以玩家落子為例,代碼為:</p><p>  for ( i = 0; i < 572; i++ )</p><p><b>  {</b></p><p><b>  // 修改狀態(tài)變化</b></p><

50、;p>  if ( m_Player[stepPut.x][stepPut.y][i] &&</p><p>  m_Win[0][i] != -1 )</p><p>  m_Win[0][i]++;</p><p>  if ( m_Computer[stepPut.x][stepPut.y][i] )</p><p&g

51、t;<b>  {</b></p><p>  m_Computer[stepPut.x][stepPut.y][i] = false;</p><p>  m_Win[1][i] = -1;</p><p><b>  }</b></p><p><b>  }</b><

52、;/p><p>  4.2.3 查找棋盤空位</p><p>  在計(jì)算機(jī)落子之前,需要查找棋盤的空位,所以需要一個(gè)SearchBlank成員函數(shù)完成此項(xiàng)工作,此函數(shù)需要進(jìn)行不重復(fù)的查找,也就是說(shuō),對(duì)已查找過(guò)的空位進(jìn)行標(biāo)記,并返回找到空位的坐標(biāo),其代碼如下:</p><p>  bool COneGame::SearchBlank( int &i, int &a

53、mp;j,</p><p>  int nowTable[][15] )</p><p><b>  {</b></p><p><b>  int x, y;</b></p><p>  for ( x = 0; x < 15; x++ )</p><p><b

54、>  {</b></p><p>  for ( y = 0; y < 15; y++ )</p><p><b>  {</b></p><p>  if ( nowTable[x][y] == -1 && nowTable[x][y] != 2 )</p><p><b&

55、gt;  {</b></p><p><b>  i = x;</b></p><p><b>  j = y;</b></p><p>  return true;</p><p><b>  }</b></p><p><b>

56、  }</b></p><p><b>  }</b></p><p>  return false;</p><p><b>  }</b></p><p>  4.2.4 落子打分</p><p>  找到空位后,需要對(duì)這個(gè)點(diǎn)的落子進(jìn)行打分,這個(gè)分?jǐn)?shù)也就是這個(gè)

57、坐標(biāo)重要性的體現(xiàn),代碼如下:</p><p>  int COneGame::GiveScore( const STEP& stepPut )</p><p><b>  {</b></p><p>  int i, nScore = 0;</p><p>  for ( i = 0; i < 572; i

58、++ )</p><p><b>  {</b></p><p>  if ( m_pTable->GetColor() == stepPut.color )</p><p><b>  {</b></p><p><b>  // 玩家下</b></p>

59、<p>  if ( m_Player[stepPut.x][stepPut.y][i] )</p><p><b>  {</b></p><p>  switch ( m_Win[0][i] )</p><p><b>  {</b></p><p><b>  case 1

60、:</b></p><p>  nScore -= 5;</p><p><b>  break;</b></p><p><b>  case 2:</b></p><p>  nScore -= 50;</p><p><b>  break;<

61、;/b></p><p><b>  case 3:</b></p><p>  nScore -= 500;</p><p><b>  break;</b></p><p><b>  case 4:</b></p><p>  nScore

62、-= 5000;</p><p><b>  break;</b></p><p><b>  default:</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>&l

63、t;b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  // 計(jì)算機(jī)下</b></p><p&g

64、t;  if ( m_Computer[stepPut.x][stepPut.y][i] )</p><p><b>  {</b></p><p>  switch ( m_Win[1][i] )</p><p><b>  {</b></p><p><b>  case 1:<

65、/b></p><p>  nScore += 5;</p><p><b>  break;</b></p><p><b>  case 2:</b></p><p>  nScore += 50;</p><p><b>  break;</b&g

66、t;</p><p><b>  case 3:</b></p><p>  nScore += 100;</p><p><b>  break;</b></p><p><b>  case 4:</b></p><p>  nScore += 10

67、000;</p><p><b>  break;</b></p><p><b>  default:</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b&

68、gt;  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  return nScore;</p><p><b>  }</b></p><p>  如代碼所示,考慮到攻守兩方面的

69、需要,所以將玩家落子給的分?jǐn)?shù)置為負(fù)值。</p><p>  4.2.5 防守策略</p><p>  落子的考慮不單單要從進(jìn)攻考慮,還要從防守考慮。這一細(xì)節(jié)的實(shí)現(xiàn)其實(shí)就是讓計(jì)算機(jī)從玩家棋盤布局分析戰(zhàn)況,然后找出對(duì)玩家最有利的落子位置。整個(gè)過(guò)程如下:</p><p>  for ( m = 0; m < 572; m++ )</p><p&g

70、t;<b>  {</b></p><p>  // 暫時(shí)更改玩家信息</p><p>  if ( m_Player[i][j][m] )</p><p><b>  {</b></p><p>  temp1[n] = m;</p><p>  m_Player[i][j

71、][m] = false;</p><p>  temp2[n] = m_Win[0][m];</p><p>  m_Win[0][m] = -1;</p><p><b>  n++;</b></p><p><b>  }</b></p><p><b>  

72、}</b></p><p>  ptempTable[i][j] = 0;</p><p><b>  pi = i;</b></p><p><b>  pj = j;</b></p><p>  while ( SearchBlank( i, j, ptempTable ) )<

73、;/p><p><b>  {</b></p><p>  ptempTable[i][j] = 2; // 標(biāo)記已被查找</p><p>  step.color = m_pTable->GetColor();</p><p>  step.x = i;</p><p>  step.y =

74、j;</p><p>  ptemp = GiveScore( step );</p><p>  if ( pscore > ptemp ) // 此時(shí)為玩家下子,運(yùn)用極小極大法時(shí)應(yīng)選取最小值</p><p>  pscore = ptemp;</p><p><b>  }</b></p><

75、;p>  for ( m = 0; m < n; m++ )</p><p><b>  {</b></p><p><b>  // 恢復(fù)玩家信息</b></p><p>  m_Player[pi][pj][temp1[m]] = true;</p><p>  m_Win[0][t

76、emp1[m]] = temp2[m];</p><p><b>  }</b></p><p>  4.2.6 選取最佳落子</p><p>  在循環(huán)結(jié)束的時(shí)候,就可以根據(jù)攻、守兩方面的打分綜合地考慮落子位置了。代碼如下:</p><p>  if ( ctemp + pscore > cscore )<

77、/p><p><b>  {</b></p><p>  cscore = ctemp + pscore;</p><p>  bestx = pi;</p><p>  besty = pj;</p><p><b>  }</b></p><p>  

78、在這之后,重新改變一下棋盤的狀態(tài)(4.2.2)即可。</p><p><b>  4.2.7統(tǒng)計(jì)數(shù)據(jù)</b></p><p>  在對(duì)戰(zhàn)結(jié)束的時(shí)候我們可以查詢一下我們的勝率和一些別的戰(zhàn)斗情況。</p><p><b>  代碼如下:</b></p><p>  CStatDlg::CStatDlg(

79、CWnd* pParent /*=NULL*/)</p><p>  : CDialog(CStatDlg::IDD, pParent)</p><p><b>  {</b></p><p>  //{{AFX_DATA_INIT(CStatDlg)</p><p>  // NOTE: the ClassWizard

80、 will add member initialization here</p><p>  //}}AFX_DATA_INIT</p><p><b>  }</b></p><p>  void CStatDlg::DoDataExchange(CDataExchange* pDX)</p><p><b>

81、;  {</b></p><p>  CDialog::DoDataExchange(pDX);</p><p>  //{{AFX_DATA_MAP(CStatDlg)</p><p>  // NOTE: the ClassWizard will add DDX and DDV calls here</p><p>  //}

82、}AFX_DATA_MAP</p><p><b>  }</b></p><p>  BEGIN_MESSAGE_MAP(CStatDlg, CDialog)</p><p>  //{{AFX_MSG_MAP(CStatDlg)</p><p>  ON_BN_CLICKED(IDC_BTN_RESET, OnBtn

83、Reset)</p><p>  //}}AFX_MSG_MAP</p><p>  END_MESSAGE_MAP()</p><p>  // CStatDlg message handlers</p><p>  BOOL CStatDlg::OnInitDialog() </p><p><b>  

84、{</b></p><p>  CDialog::OnInitDialog();</p><p>  // TODO: Add extra initialization here</p><p><b>  // 讀取姓名</b></p><p>  CTable *pTable = (CTable *)Ge

85、tParent()->GetDlgItem( IDC_TABLE );</p><p>  SetDlgItemText( IDC_ST_NAME, pTable->m_strMe );</p><p>  ShowStat();</p><p>  return TRUE; </p><p>  // return TRUE u

86、nless you set the focus to a control</p><p>  // EXCEPTION: OCX Property Pages should return FALSE</p><p><b>  }</b></p><p>  void CStatDlg::OnOK() </p><p>

87、<b>  {</b></p><p>  // TODO: Add extra validation here</p><p>  CFiveApp *pApp = (CFiveApp *)AfxGetApp();</p><p><b>  // 寫入戰(zhàn)績(jī)統(tǒng)計(jì)</b></p><p>  TCH

88、AR str[10];</p><p>  wsprintf( str, _T("%d"), pApp->m_nWin );</p><p>  ::WritePrivateProfileString( _T("Stats"), _T("Win"), str, pApp->m_szIni );</p>&

89、lt;p>  wsprintf( str, _T("%d"), pApp->m_nDraw );</p><p>  ::WritePrivateProfileString( _T("Stats"), _T("Draw"), str, pApp->m_szIni );</p><p>  wsprintf( st

90、r, _T("%d"), pApp->m_nLost );</p><p>  ::WritePrivateProfileString( _T("Stats"), _T("Lost"), str, pApp->m_szIni );</p><p>  CDialog::OnOK();</p><p&

91、gt;<b>  }</b></p><p>  void CStatDlg::OnBtnReset() </p><p><b>  {</b></p><p>  // TODO: Add your control notification handler code here</p><p> 

92、 CFiveApp *pApp = (CFiveApp *)AfxGetApp();</p><p>  pApp->m_nWin = 0;</p><p>  pApp->m_nDraw = 0;</p><p>  pApp->m_nLost = 0;</p><p>  ShowStat();</p>&

93、lt;p><b>  }</b></p><p>  void CStatDlg::ShowStat()</p><p><b>  {</b></p><p>  CFiveApp *pApp = (CFiveApp *)AfxGetApp();</p><p>  CString str;

94、</p><p>  str.Format( _T("%d"), pApp->m_nWin );</p><p>  SetDlgItemText( IDC_ST_WIN, str );</p><p>  str.Format( _T("%d"), pApp->m_nDraw );</p><

95、p>  SetDlgItemText( IDC_ST_DRAW, str );</p><p>  str.Format( _T("%d"), pApp->m_nLost );</p><p>  SetDlgItemText( IDC_ST_LOST, str );</p><p><b>  // 計(jì)算勝率</b&

96、gt;</p><p>  if ( 0 == pApp->m_nWin )</p><p><b>  {</b></p><p>  str = _T("勝率:0%");</p><p><b>  }</b></p><p><b>

97、  else</b></p><p><b>  {</b></p><p>  str.Format( _T("勝率:%d%%"), pApp->m_nWin * 100 / ( pApp->m_nWin + pApp->m_nDraw + pApp->m_nLost ) );</p><p

98、><b>  }</b></p><p>  SetDlgItemText( IDC_ST_PERCENT, str );</p><p><b>  }</b></p><p>  代碼執(zhí)行后的效果圖如下:</p><p><b>  圖4.2 效果圖</b></

99、p><p><b>  5 幾點(diǎn)補(bǔ)充說(shuō)明</b></p><p>  考慮到程序的響應(yīng)速度,人機(jī)對(duì)弈算法只對(duì)玩家的棋子進(jìn)行了一步的推測(cè)。</p><p>  由于計(jì)算機(jī)在落子時(shí)選取的是得分最高的一步落子,所以如果玩家在開局的時(shí)候不改變落子步驟,那么將會(huì)獲得從頭至尾相同的棋局。</p><p>  考慮到下棋同時(shí)還要聊天,所以

100、并未對(duì)落子時(shí)間加入任何限制,同樣如果玩家離開游戲也不會(huì)判負(fù)。</p><p>  對(duì)于人機(jī)對(duì)弈的悔棋處理,由于這個(gè)算法的開銷相當(dāng)大,每一步落子都會(huì)存在不同的棋盤布局,所以實(shí)現(xiàn)從頭到尾的悔棋不是很現(xiàn)實(shí)(將會(huì)存在過(guò)多的空間保存棋盤布局),因而在人機(jī)對(duì)弈模式下,只允許玩家悔最近的兩步落子。</p><p><b>  6 心得體會(huì)</b></p><p&

101、gt;  經(jīng)過(guò)這段時(shí)間的緊張忙碌,這次的畢業(yè)設(shè)計(jì)已制作了一個(gè)較完整的五子棋游戲,從各方面來(lái)講,都有比較大的收獲,同時(shí)也大大提高了實(shí)際操作的能力,當(dāng)然,期間遇到的困難也是層出不窮。由于對(duì)游戲的概念比較模糊,在前期的編程設(shè)計(jì)過(guò)程中腦海中僅僅有一個(gè)框架,而很多卻細(xì)節(jié)沒(méi)有考慮到,結(jié)果一度走入一邊編程,一邊改模版的尷尬境地,進(jìn)度緩慢,思路不清。后來(lái),在艱難進(jìn)展的過(guò)程中漸漸領(lǐng)悟到了一些編程的方法和系統(tǒng)設(shè)計(jì)的思想,所謂眼過(guò)千遍不如手過(guò)一遍,在自己實(shí)際

102、操作中暴露出來(lái)的問(wèn)題自己的體會(huì)最深刻,也就更有想法去克服他。在困境中摸索,總結(jié),轉(zhuǎn)變思路,繼續(xù)前進(jìn),這是對(duì)我制作本游戲過(guò)程的一個(gè)概括。</p><p>  在不斷的學(xué)習(xí)與改進(jìn)中我體會(huì)到:</p><p>  1.做畢業(yè)設(shè)計(jì)本身也是一個(gè)學(xué)習(xí)新鮮事物的過(guò)程,從設(shè)計(jì)初的不懂到最后順利完成設(shè)計(jì),我體會(huì)到在實(shí)踐中學(xué)習(xí)的重要性,我想這對(duì)于我以后的工作受益匪淺。</p><p>

103、  2.設(shè)計(jì)的過(guò)程是漫長(zhǎng)而困難重重的,設(shè)計(jì)過(guò)程中需要理論與實(shí)際的結(jié)合,這就要求有扎實(shí)的理論知識(shí),靈活的頭腦,我本身所做的設(shè)計(jì)并不算十分復(fù)雜,但由于以前沒(méi)有獨(dú)立做過(guò)系統(tǒng)所以剛開始時(shí)有點(diǎn)亂,好在有老師的幫助,我很快理清了思路,找到了自己的出發(fā)點(diǎn)。</p><p>  3.由于前期工作的不徹底,對(duì)系統(tǒng)的需求分析的要求認(rèn)識(shí)不夠清楚,使得后續(xù)的工作不得不經(jīng)常返回去修改個(gè)別代碼。使我體會(huì)到在設(shè)計(jì)中的每一步的重要性,如果上一個(gè)

104、步驟不能很好的完成,在后續(xù)的設(shè)計(jì)將會(huì)付出幾倍的代價(jià)。</p><p>  總之,經(jīng)過(guò)這么長(zhǎng)時(shí)間的設(shè)計(jì),我與我的同學(xué)完成了這個(gè)一個(gè)功能比較完善的五子棋游戲。我深刻體會(huì)到要做好一個(gè)完整的事情,需要有系統(tǒng)的思維方式和方法,還要有一個(gè)團(tuán)隊(duì)合作的精神。對(duì)待一個(gè)新的問(wèn)題,要耐心、要細(xì)心,也要有很好的團(tuán)結(jié),共同努力的團(tuán)隊(duì)協(xié)作精神。</p><p><b>  參考文獻(xiàn)</b><

105、;/p><p>  MSDN for Visual Studio 6.0</p><p>  設(shè)計(jì)模式——可復(fù)用面向?qū)ο筌浖幕A(chǔ),Erich Gamma/Richard Helm/Ralph Johnson/John Vlissides著,李英軍/馬曉星/蔡敏/劉建中 等譯,機(jī)械工業(yè)出版社</p><p>  深入淺出MFC(第2版),侯俊杰著,華中科技大學(xué)出版社&l

106、t;/p><p>  Microsoft® Visual C++.NET 技術(shù)內(nèi)幕(第6版),George Shepherd/David Kruglinski著,潘愛(ài)民譯,清華大學(xué)出版社</p><p>  Visual C++網(wǎng)絡(luò)通信協(xié)議分析與應(yīng)用實(shí)現(xiàn),汪曉平/鐘軍 等編著,人民郵電出版社</p><p>  C++編程思想,Bruce Eckel著,劉宗田

107、/邢大紅/孫慧杰 等譯,機(jī)械工業(yè)出版社</p><p>  21天學(xué)通C++,Jesse Liberty著,康博創(chuàng)作室譯,人民郵電出版社</p><p>  C++標(biāo)準(zhǔn)程序庫(kù),Nicolai M.Josuttis著,侯捷/孟巖 譯,華中科技大學(xué)出版社</p><p>  Windows程序設(shè)計(jì),Charles Petzold著,北京博彥科技發(fā)展有限公司譯,北京大學(xué)出

108、版社</p><p>  Visual C++.NET網(wǎng)絡(luò)編程,易君 編著,中國(guó)鐵道出版社</p><p><b>  致謝</b></p><p>  本設(shè)計(jì)的完成是在我們的導(dǎo)師xx老師的細(xì)心指導(dǎo)下進(jìn)行的。在每次設(shè)計(jì)遇到問(wèn)題時(shí)老師不辭辛苦的講解才使得我的設(shè)計(jì)順利的進(jìn)行。從設(shè)計(jì)的選題到資料的搜集直至最后設(shè)計(jì)的修改的整個(gè)過(guò)程中,花費(fèi)了張老師很多的

溫馨提示

  • 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)論