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