版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 2011屆畢業(yè)論文</b></p><p> 基于Visual C++的五子棋游戲設計</p><p> ——主要算法的設計與實現(xiàn)</p><p> 學 院: 信息學院 </p><p> 學生姓名: XXX </p&g
2、t;<p> 指導教師: </p><p> 專 業(yè): 軟件技術 </p><p> 班 級: 08軟件1班 </p><p> 完成時間: 2011年6月29日 </p><p><b> 摘 要</b>
3、</p><p> 本論文主要闡述以面向對象的程序開發(fā)語言VC++為開發(fā)工具,設計一個五子棋游戲。本系統(tǒng)是個小型游戲,可以單機使用,也可以網(wǎng)絡兩個人游戲,也可以和電腦進行游戲。論文首先介紹了開發(fā)背景及開發(fā)語言的介紹。然后介紹設計該游戲的框架結構,然后介紹了程序的設計過程,以及程序的相關算法。其中算法是我主要負責的,算法(Algorithm)是一系列解決問題的清晰指令,算法代表著用系統(tǒng)的方法描述解決問題的策略機制
4、。也就是說,能夠對一定規(guī)范的輸入,在有限時間內獲得所要求的輸出。如果一個算法有缺陷,或不適合于某個問題,執(zhí)行這個算法將不會解決這個問題。不同的算法可能用不同的時間、空間或效率來完成同樣的任務。</p><p> 關鍵詞:游戲,系統(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)境及運行環(huán)境1</p><p> 1.3.1 開發(fā)環(huán)境1</p><p> 1.3.2 運行環(huán)境1</p><p>
9、2 C++簡介2</p><p><b> 3 軟件架構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 判斷勝負4</p><p> 4.2 人機對弈算法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)計數(shù)據(jù)11</p><p> 5 幾點補充說明15</p><p><b> 6 心得體會15</b></p><p><b> 參考文獻16</b></p>
12、<p><b> 致謝16</b></p><p><b> 1引言</b></p><p><b> 1.1 五子棋介紹</b></p><p> 五子棋是起源于中國古代的傳統(tǒng)黑白棋種之一。現(xiàn)代五子棋日文稱之為“連珠”,英譯為“Renju”,英文稱之為“Gobang”或“FIR
13、”(Five in a Row的縮寫),亦有“連五子”、“五子連”、“串珠”、“五目”、“五目碰”、“五格”等多種稱謂。</p><p> 五子棋不僅能增強思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。五子棋既有現(xiàn)代休閑的明顯特征“短、平、快”,又有古典哲學的高深學問“陰陽易理”;它既有簡單易學的特性,為人民群眾所喜聞樂見,又有深奧的技巧和高水平的國際性比賽;它的棋文化源淵流長,具有東方的神秘和西方的直觀;
14、既有“場”的概念,亦有“點”的連接。它是中西文化的交流點,是古今哲理的結晶。</p><p><b> 1.2 開發(fā)背景</b></p><p> 當前網(wǎng)絡上流傳的五子棋游戲功能并不盡善盡美,其中最主要的問題就是人機對戰(zhàn)和網(wǎng)絡對戰(zhàn)不能夠一起實現(xiàn),所以我決定開發(fā)[1]一個既能夠人機對戰(zhàn),又能夠進行網(wǎng)絡對戰(zhàn)的五子棋系統(tǒng)。</p><p> 1
15、.3 開發(fā)環(huán)境及運行環(huán)境</p><p> 1.3.1 開發(fā)環(huán)境</p><p> Intel® Pentium® Y450,2G內存,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 運行環(huán)境</p><p> Intel® Pentium®
17、 2及以上處理器,32M以上內存,4G以上硬盤</p><p> Microsoft® Windows? 9X/NT操作系統(tǒng)</p><p> 800*600或以上的屏幕分辨率</p><p><b> 2 C++簡介</b></p><p> 語言之所以要起名為“C”,是因為它是主要參考那個時候的一
18、門叫B的語言,它的設計者認為C語言是B語言的進步,所以就起名為C語言;但是B語言并不是因為之前還有個A語言,而是B語言的作者為了紀念他的妻子,他的妻子名字的第一個字母是B; 當C語言發(fā)展到頂峰的時刻,出現(xiàn)了一個版本叫C with Class,那就是C++最早的版本,在C語言中增加class關鍵字和類,那個時候有很多版本的C都希望在C語言中增加類的概念;后來C標準委員會決定為這個版本的C起個新的名字,那個時候征集了很多種名字,最后采納了其
19、中一個人的意見,以C語言中的++運算符來體現(xiàn)它是C語言的進步,故而叫C++,成立了C++標準委員會。</p><p> C++是一種語言,僅僅是它的語法、特性、標準類庫就已經(jīng)是一門非常高深的課程,C++設計成靜態(tài)類型、和C同樣高效且可移植的多用途程序設計語言。設計成直接的和廣泛的支援多種程序設計風格(程序化程序設計、資料抽象化、面向對象程序設計、泛型程序設計)。設計成給程序設計者更多的選擇,即使可能導致程序設計
20、者選擇錯誤。設計成盡可能與C兼容,籍此提供一個從C到C++的平滑過渡。避免平臺限定或沒有普遍用途的特性。不使用會帶來額外開銷的特性。設計成無需復雜的程序設計環(huán)境。</p><p> C++標準演變了許多年。C++模板是近幾年來對此語言的一種擴展,模板是根據(jù)類型參數(shù)來產(chǎn)生函數(shù)和類的機制,有時也稱模板為“參數(shù)化的類型”。使用模板,可以設計一個對許多類型的數(shù)據(jù)進行操作的類,而不需要為每個類型的數(shù)據(jù)建立一個單獨的類。標
21、準模板庫(Standard Tempalte Library,STL )和微軟的活動模板庫(Active Tempalte Library,ATL )都基于這個C++語言擴展。</p><p> C++標準可分為兩部分, C++語言本身和C++標準庫。C++標準庫對于Visual C++是相當新的,實際上微軟只是在發(fā)布Visual C++ 5.0時去除了一些“bug”。標準庫提供了標準的輸入/輸出、字符串、容器
22、(如矢量、列表和映射等)、非數(shù)值運算(如排序、搜索和合并等)和對數(shù)值計算的支持。應該說, C/C++包含了相對少的關鍵字,而且很多最有用的函數(shù)都來源于庫,C++標準庫實現(xiàn)容器和算法的部分就是STL。 STL是數(shù)據(jù)結構和算法的一個框架,數(shù)據(jù)結構包括矢量、列表和映射等,算法包括這些數(shù)據(jù)結構的查找、拷貝和排序等。1994年7月,ANSI/ISO C++標準委員會投票決定接受STL為C++標
23、準庫的一部分,這個建議是根據(jù)Alex Stepanov、Meng Lee和David Musser這三人的編程和軟件庫研究提出的。STL的產(chǎn)生是為了滿足通用性的設計目標,而不是為了提高性能。</p><p><b> 3 軟件架構</b></p><p> 軟件的總體架構如圖3.1:</p><p><b> 圖3.1 軟件架構
24、</b></p><p> 考慮到整個的下棋過程(無論對方是電腦抑或其他網(wǎng)絡玩家)可以分為:己方落子、等待對方落子、對方落子、設置己方棋盤數(shù)據(jù)這一系列過程,因此一人游戲類、二人游戲類和棋盤類之間的關系參考了AbstractFactory(抽象工廠)模式,以實現(xiàn)對兩個不同模塊進行一般化的控制。[2]</p><p><b> 3.1 棋盤類</b><
25、;/p><p> 整個架構的核心部分,類名為CTable。封裝了棋盤的各種可能用到的功能[3],如保存棋盤數(shù)據(jù)、初始化、判斷勝負等。用戶操作主界面,主界面與CTable進行交互來完成對游戲的操作。</p><p><b> 3.2 游戲模式類</b></p><p> 用來管理人機對弈/網(wǎng)絡對弈兩種游戲模式,類名為CGame。CGame是一個
26、抽象類,經(jīng)由它派生出一人游戲類COneGame和網(wǎng)絡游戲類CTwoGame,如圖3.2:</p><p> 圖3.2 CGame類派生關系</p><p> 這樣,CTable類就可以通過一個CGame類的指針[4],在游戲初始化的時候根據(jù)具體游戲模式的要求實例化COneGame或CTwoGame類的對象;然后利用多態(tài)性[5],使用CGame類提供的公有接口就可以完成不同游戲模式下的不
27、同功能了。</p><p><b> 4 主要算法</b></p><p> 五子棋游戲中,有相當?shù)钠撬惴ǖ牟糠帧o論是人機對弈,還是網(wǎng)絡對弈,都需要合理算法的支持,本節(jié)中將詳細介紹五子棋中使用的算法。[13]</p><p><b> 4.1 判斷勝負</b></p><p> 五子棋
28、的勝負,在于判斷棋盤上是否有一個點,從這個點開始的右、下、右下、左下四個方向是否有連續(xù)的五個同色棋子出現(xiàn),如圖4.1:</p><p> 圖4.1 判斷勝負方向</p><p> 這個算法也就是CTable的Win成員函數(shù)。從設計的思想上,需要它接受一個棋子顏色的參數(shù),然后返回一個布爾值,這個值來指示是否勝利,代碼如下:</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> 需要說明的一點是,由于這個算法所遵循的搜索順序是從左到右、自上而下,因此在每次循環(huán)的時候,都有一些坐標無需納入考慮范圍。例如對于橫向判斷而言,由于右邊界所限,因而所有橫坐標大于等于11的點,都構不成達到五子連的條件,所以橫坐標的
44、循環(huán)上界也就定為11,這樣也就提高了搜索的速度。</p><p> 4.2 人機對弈算法</p><p> 人機對弈算法完全按照CGame基類定義的接口標準,封裝在了COneGame派生類之中。下面將對這個算法進行詳細地介紹。[14]</p><p> 4.2.1 獲勝組合</p><p> 獲勝組合是一個三維數(shù)組,它記錄了所有取勝的
45、情況。也就是說,參考于CTable::Win中的情況,對于每一個落子坐標,獲勝的組合一共有</p><p> 15 * 11 * 2 + 11 * 11 * 2 = 572種。</p><p> 而對于每個坐標的獲勝組合,應該設置一個[15][15][572]大小的三維數(shù)組。</p><p> 在擁有了這些獲勝組合之后,就可以參照每個坐標的572種組合給自己的
46、局面和玩家的局面進行打分,也就是根據(jù)當前盤面中某一方所擁有的獲勝組合多少進行權值的估算,給出最有利于自己的一步落子坐標。</p><p> 由于是雙方對弈,所以游戲的雙方都需要一份獲勝組合,也就是:</p><p> bool m_Computer[15][15][572]; // 電腦獲勝組合</p><p> bool m_Player[15][15][5
47、72]; // 玩家獲勝組合</p><p> 在每次游戲初始化(COneGame::Init)的時候,需要將每個坐標下可能的獲勝組合都置為true。</p><p> 此外,還需要設置計算機和玩家在各個獲勝組合中所填入的棋子數(shù):</p><p> int m_Win[2][572];</p><p> 在初始化的時候,將每個棋子數(shù)置
48、為0。</p><p> 4.2.2 落子后處理</p><p> 每當一方落子后,都需要作如下處理:</p><p> 如果己方此坐標的獲勝組合仍為true,且仍有可能在此獲勝組合處添加棋子,則將此獲勝組合添加棋子數(shù)加1;</p><p> 如果對方此坐標的獲勝組合仍為true,則將對方此坐標的獲勝組合置為false,并將對方此獲勝
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> 在計算機落子之前,需要查找棋盤的空位,所以需要一個SearchBlank成員函數(shù)完成此項工作,此函數(shù)需要進行不重復的查找,也就是說,對已查找過的空位進行標記,并返回找到空位的坐標,其代碼如下:</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> 找到空位后,需要對這個點的落子進行打分,這個分數(shù)也就是這個
57、坐標重要性的體現(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> // 計算機下</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、需要,所以將玩家落子給的分數(shù)置為負值。</p><p> 4.2.5 防守策略</p><p> 落子的考慮不單單要從進攻考慮,還要從防守考慮。這一細節(jié)的實現(xiàn)其實就是讓計算機從玩家棋盤布局分析戰(zhàn)況,然后找出對玩家最有利的落子位置。整個過程如下:</p><p> for ( m = 0; m < 572; m++ )</p><p&g
70、t;<b> {</b></p><p> // 暫時更改玩家信息</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; // 標記已被查找</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 ) // 此時為玩家下子,運用極小極大法時應選取最小值</p><p> pscore = ptemp;</p><p><b> }</b></p><
75、;p> for ( m = 0; m < n; m++ )</p><p><b> {</b></p><p><b> // 恢復玩家信息</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)結束的時候,就可以根據(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)計數(shù)據(jù)</b></p><p> 在對戰(zhàn)結束的時候我們可以查詢一下我們的勝率和一些別的戰(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)績統(tǒng)計</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> // 計算勝率</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 幾點補充說明</b></p><p> 考慮到程序的響應速度,人機對弈算法只對玩家的棋子進行了一步的推測。</p><p> 由于計算機在落子時選取的是得分最高的一步落子,所以如果玩家在開局的時候不改變落子步驟,那么將會獲得從頭至尾相同的棋局。</p><p> 考慮到下棋同時還要聊天,所以
100、并未對落子時間加入任何限制,同樣如果玩家離開游戲也不會判負。</p><p> 對于人機對弈的悔棋處理,由于這個算法的開銷相當大,每一步落子都會存在不同的棋盤布局,所以實現(xiàn)從頭到尾的悔棋不是很現(xiàn)實(將會存在過多的空間保存棋盤布局),因而在人機對弈模式下,只允許玩家悔最近的兩步落子。</p><p><b> 6 心得體會</b></p><p&
101、gt; 經(jīng)過這段時間的緊張忙碌,這次的畢業(yè)設計已制作了一個較完整的五子棋游戲,從各方面來講,都有比較大的收獲,同時也大大提高了實際操作的能力,當然,期間遇到的困難也是層出不窮。由于對游戲的概念比較模糊,在前期的編程設計過程中腦海中僅僅有一個框架,而很多卻細節(jié)沒有考慮到,結果一度走入一邊編程,一邊改模版的尷尬境地,進度緩慢,思路不清。后來,在艱難進展的過程中漸漸領悟到了一些編程的方法和系統(tǒng)設計的思想,所謂眼過千遍不如手過一遍,在自己實際
102、操作中暴露出來的問題自己的體會最深刻,也就更有想法去克服他。在困境中摸索,總結,轉變思路,繼續(xù)前進,這是對我制作本游戲過程的一個概括。</p><p> 在不斷的學習與改進中我體會到:</p><p> 1.做畢業(yè)設計本身也是一個學習新鮮事物的過程,從設計初的不懂到最后順利完成設計,我體會到在實踐中學習的重要性,我想這對于我以后的工作受益匪淺。</p><p>
103、 2.設計的過程是漫長而困難重重的,設計過程中需要理論與實際的結合,這就要求有扎實的理論知識,靈活的頭腦,我本身所做的設計并不算十分復雜,但由于以前沒有獨立做過系統(tǒng)所以剛開始時有點亂,好在有老師的幫助,我很快理清了思路,找到了自己的出發(fā)點。</p><p> 3.由于前期工作的不徹底,對系統(tǒng)的需求分析的要求認識不夠清楚,使得后續(xù)的工作不得不經(jīng)常返回去修改個別代碼。使我體會到在設計中的每一步的重要性,如果上一個
104、步驟不能很好的完成,在后續(xù)的設計將會付出幾倍的代價。</p><p> 總之,經(jīng)過這么長時間的設計,我與我的同學完成了這個一個功能比較完善的五子棋游戲。我深刻體會到要做好一個完整的事情,需要有系統(tǒng)的思維方式和方法,還要有一個團隊合作的精神。對待一個新的問題,要耐心、要細心,也要有很好的團結,共同努力的團隊協(xié)作精神。</p><p><b> 參考文獻</b><
105、;/p><p> MSDN for Visual Studio 6.0</p><p> 設計模式——可復用面向對象軟件的基礎,Erich Gamma/Richard Helm/Ralph Johnson/John Vlissides著,李英軍/馬曉星/蔡敏/劉建中 等譯,機械工業(yè)出版社</p><p> 深入淺出MFC(第2版),侯俊杰著,華中科技大學出版社&l
106、t;/p><p> Microsoft® Visual C++.NET 技術內幕(第6版),George Shepherd/David Kruglinski著,潘愛民譯,清華大學出版社</p><p> Visual C++網(wǎng)絡通信協(xié)議分析與應用實現(xiàn),汪曉平/鐘軍 等編著,人民郵電出版社</p><p> C++編程思想,Bruce Eckel著,劉宗田
107、/邢大紅/孫慧杰 等譯,機械工業(yè)出版社</p><p> 21天學通C++,Jesse Liberty著,康博創(chuàng)作室譯,人民郵電出版社</p><p> C++標準程序庫,Nicolai M.Josuttis著,侯捷/孟巖 譯,華中科技大學出版社</p><p> Windows程序設計,Charles Petzold著,北京博彥科技發(fā)展有限公司譯,北京大學出
108、版社</p><p> Visual C++.NET網(wǎng)絡編程,易君 編著,中國鐵道出版社</p><p><b> 致謝</b></p><p> 本設計的完成是在我們的導師xx老師的細心指導下進行的。在每次設計遇到問題時老師不辭辛苦的講解才使得我的設計順利的進行。從設計的選題到資料的搜集直至最后設計的修改的整個過程中,花費了張老師很多的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- c++課程設計--五子棋游戲
- 五子棋游戲畢業(yè)設計
- 畢業(yè)設計---網(wǎng)絡五子棋游戲
- 網(wǎng)絡五子棋游戲畢業(yè)設計
- 五子棋c++課程設計
- 五子棋c++課程設計
- 畢業(yè)設計(論文)-基于visual_c++的五子棋設計與實現(xiàn)
- c++課程設計——五子棋
- 畢業(yè)設計---基于labview設計的五子棋游戲
- 人機對弈五子棋游戲畢業(yè)設計
- c++五子棋課程設計報告
- (畢業(yè)設計)c++五子棋源代碼及畢業(yè)論文
- 基于java的五子棋游戲設計
- 五子棋游戲設計報告
- 五子棋游戲設計畢業(yè)論文
- 基于android的五子棋游戲設計
- 畢業(yè)論文——五子棋游戲設計
- linux環(huán)境下五子棋游戲設計畢業(yè)設計
- 五子棋對戰(zhàn)游戲
- c++五子棋源代碼及畢業(yè)論文
評論
0/150
提交評論