版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 目 錄</b></p><p><b> 1 引言3</b></p><p> 1.1五子棋介紹3</p><p> 1.2選題背景和動(dòng)機(jī)3</p><p> 1.3系統(tǒng)所要解決的問(wèn)題3</p><p><b> 2
2、系統(tǒng)框架5</b></p><p><b> 2.1 棋盤類6</b></p><p> 2.1.1 主要成員變量說(shuō)明:6</p><p> 2.1.2 清空棋盤——Clear6</p><p> 2.1.3 繪制棋子——Draw6</p><p> 2.1.4
3、左鍵消息——OnLButtonUp7</p><p> 2.1.5載入棋盤7</p><p> 2.1.6 對(duì)方落子完畢——Over7</p><p> 2.1.7 設(shè)置游戲模式——SetGameMode7</p><p> 2.1.8 勝負(fù)的判斷——Win7</p><p> 2.2 游戲模式類
4、8</p><p><b> 3關(guān)鍵技術(shù)9</b></p><p> 3.1 棋盤對(duì)話框的制作9</p><p> 3.1.1 對(duì)話框機(jī)制9</p><p> 3.1.3 棋子10</p><p> 3.2 人機(jī)對(duì)弈10</p><p> 3.2.1
5、 難度的選擇10</p><p> 3.2.2 機(jī)器的落子判斷11</p><p><b> 4運(yùn)行結(jié)果15</b></p><p> 4.1開(kāi)發(fā)環(huán)境及運(yùn)行環(huán)境15</p><p> 4.1.1開(kāi)發(fā)環(huán)境15</p><p> 4.1.2運(yùn)行環(huán)境15</p>&l
6、t;p> 4.2運(yùn)行圖示15</p><p> 4.2.1 棋盤顯示15</p><p> 4.2.2 開(kāi)始的選擇對(duì)話框16</p><p> 4.2.3 主界面中的游戲難度選項(xiàng)16</p><p> 4.2.4 電腦的應(yīng)對(duì)17</p><p><b> 5調(diào)試分析19</
7、b></p><p><b> 6總結(jié)21</b></p><p><b> 參考文獻(xiàn)22</b></p><p><b> 1 引言</b></p><p><b> 1.1 五子棋介紹</b></p><p>
8、 五子棋是起源于中國(guó)古代的傳統(tǒng)黑白棋種之一。現(xiàn)代五子棋日文稱之為“連珠”,英譯為“Renju”,英文稱之為“Gobang”或“FIR”(Five in a Row的縮寫),亦有“連五子”、“五子連”、“串珠”、“五目”、“五目碰”、“五格”等多種稱謂。</p><p> 五子棋不僅能增強(qiáng)思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。五子棋既有現(xiàn)代休閑的明顯特征“短、平、快”,又有古典哲學(xué)的高深學(xué)問(wèn)“陰陽(yáng)易
9、理”;它既有簡(jiǎn)單易學(xué)的特性,為人民群眾所喜聞樂(lè)見(jiàn),又有深?yuàn)W的技巧和高水平的國(guó)際性比賽;它的棋文化源淵流長(zhǎng),具有東方的神秘和西方的直觀;既有“場(chǎng)”的概念,亦有“點(diǎn)”的連接。它是中西文化的交流點(diǎn),是古今哲理的結(jié)晶。</p><p> 1.2選題背景和動(dòng)機(jī)</p><p> 隨著社會(huì)的發(fā)展,越來(lái)越多人接觸和使用計(jì)算機(jī),網(wǎng)上進(jìn)行的棋類運(yùn)動(dòng)也隨之普及。許多人喜歡上了下棋,但有時(shí)又苦于沒(méi)有對(duì)手。作
10、為一個(gè)計(jì)算機(jī)專業(yè)的學(xué)生,我對(duì)五子棋有很濃厚的興趣,平時(shí)也一直和同學(xué)下棋,有時(shí)也和電腦下棋,我對(duì)計(jì)算機(jī)人機(jī)對(duì)弈智能算法如何與人腦對(duì)抗產(chǎn)生了極大的興趣,當(dāng)然人機(jī)對(duì)弈的算法有很多種,許多人也對(duì)此有所研究。有些算法的智能程度甚至已經(jīng)與人腦不相上下。這類程序的開(kāi)發(fā)最重要的莫過(guò)于智能算法的實(shí)現(xiàn),然后就是判斷勝負(fù)的方法。當(dāng)前網(wǎng)絡(luò)上流傳的五子棋游戲功能并不盡善盡美,其中最主要的問(wèn)題就是人機(jī)對(duì)戰(zhàn)和網(wǎng)絡(luò)對(duì)戰(zhàn)不能夠一起實(shí)現(xiàn),所以我決定開(kāi)發(fā)[1]一個(gè)既能夠人機(jī)
11、對(duì)戰(zhàn),又能夠進(jìn)行網(wǎng)絡(luò)對(duì)戰(zhàn)的五子棋系統(tǒng)。</p><p> 1.3系統(tǒng)所要解決的問(wèn)題</p><p> 1)棋盤和棋子的繪制。</p><p> 2)計(jì)算機(jī)對(duì)下一步落棋的計(jì)算</p><p><b> 3) 棋盤的載入</b></p><p><b> 4)難度的模式選擇<
12、/b></p><p><b> 5)棋盤狀態(tài)的判定</b></p><p><b> 2 系統(tǒng)框架</b></p><p><b> 五子棋系統(tǒng)框架:</b></p><p><b> 圖2 系統(tǒng)框架圖</b></p><
13、;p> 考慮到整個(gè)的下棋過(guò)程(無(wú)論對(duì)方是電腦或是其他網(wǎng)絡(luò)玩家)可以分為:己方落子、等待對(duì)方落子、對(duì)方落子、設(shè)置己方棋盤數(shù)據(jù)這一系列過(guò)程,因此一人游戲類、二人游戲類和棋盤類之間的關(guān)系是不同的。</p><p><b> 2.1 棋盤類 </b></p><p> 整個(gè)架構(gòu)的核心部分,類名為CTable。封裝了棋盤的各種可能用到的功能,如保存棋盤數(shù)據(jù)、初始化、
14、判斷勝負(fù)等。用戶操作主界面,主界面與CTable進(jìn)行交互來(lái)完成對(duì)游戲的操作。</p><p> 2.1.1主要成員變量說(shuō)明:</p><p> 棋盤等待標(biāo)志——m_bWait與m_bOldWait</p><p> 由于在玩家落子后需要等待對(duì)方落子,m_bWait標(biāo)志就用來(lái)標(biāo)識(shí)棋盤的等待狀態(tài)。當(dāng)m_bWait為TRUE時(shí),是不允許玩家落子的。</p>
15、;<p> 在人人對(duì)弈模式下,玩家之間需要互相發(fā)送諸如悔棋、和棋這一類的請(qǐng)求消息,在發(fā)送請(qǐng)求后等待對(duì)方回應(yīng)時(shí),也是不允許落子的,所以需要將m_bWait標(biāo)志置為TRUE。在收到對(duì)方回應(yīng)后,需要恢復(fù)原有的棋盤等待狀態(tài),所以需要另外一個(gè)變量在發(fā)送請(qǐng)求之前保存棋盤的等待狀態(tài)做恢復(fù)之用,也就是m_bOldWait。</p><p> 等待標(biāo)志的設(shè)置,由成員函數(shù)SetWait和RestoreWait完成。
16、</p><p> 2.1.2 清空棋盤——Clear</p><p> 在每一局游戲開(kāi)始的時(shí)候都需要調(diào)用這個(gè)函數(shù)將棋盤清空,也就是棋盤的初始化工作。在這個(gè)函數(shù)中,主要發(fā)生了這么幾件事情:</p><p> 將m_data中每一個(gè)落子位都置為無(wú)子狀態(tài)(-1)。</p><p> 按照傳入的參數(shù)設(shè)置棋盤等待標(biāo)志m_bWait,以供先、后
17、手的不同情況之用。</p><p> 2.1.3 繪制棋子——Draw</p><p> 這無(wú)疑是很重要的一個(gè)函數(shù),它根據(jù)參數(shù)給定的坐標(biāo)和顏色繪制棋子。繪制的詳細(xì)過(guò)程如下:</p><p> 將給定的棋盤坐標(biāo)換算為繪圖的像素坐標(biāo)。</p><p> 根據(jù)坐標(biāo)繪制棋子位圖。</p><p> 在剛繪制完成的棋子
18、四周繪制最后落子指示矩形。</p><p> 2.1.4 左鍵消息——OnLButtonUp</p><p> 作為棋盤唯一響應(yīng)的左鍵消息,也需要做不少的工作:</p><p> 如果棋盤等待標(biāo)志m_bWait為TRUE,則直接發(fā)出警告聲音并返回,即禁止落子。</p><p> 如果點(diǎn)擊時(shí)的鼠標(biāo)坐標(biāo)在合法坐標(biāo)(0, 0)~(14, 1
19、4)之外,亦禁止落子。</p><p> 如果走的步數(shù)大于1步,方才允許悔棋。</p><p> 進(jìn)行勝利判斷,如勝利則修改UI狀態(tài)并增加勝利數(shù)的統(tǒng)計(jì)。</p><p> 如未勝利,則向?qū)Ψ桨l(fā)送已經(jīng)落子的消息。</p><p> 落子完畢,將m_bWait標(biāo)志置為TRUE,開(kāi)始等待對(duì)方回應(yīng)。</p><p>&
20、lt;b> 載入棋盤</b></p><p> 尋找棋盤位圖,通過(guò)簡(jiǎn)單的代碼載入位圖,直接完成繪制棋盤工作,免去</p><p> 了大量繪制棋盤的多余操作。</p><p> 2.1.6 對(duì)方落子完畢——Over</p><p> 在對(duì)方落子之后,仍然需要做一些判斷工作,這些工作與OnLButtonUp中的類似。
21、 </p><p> 2.1.7 設(shè)置游戲模式——SetGameMode</p><p> 這個(gè)函數(shù)通過(guò)傳入的游戲模式參數(shù)對(duì)m_pGame指針進(jìn)行了初始化,,就可以利用繼承和多態(tài)特點(diǎn)來(lái)使m_pGame指針使用相同的調(diào)用來(lái)完成不同的工作了,事實(shí)上,COneGame::Init和CTwoGame::Init都是不同的。</p><p> 2.1.8 勝負(fù)的判斷——
22、Win</p><p> 這是游戲中一個(gè)極其重要的算法,用來(lái)判斷當(dāng)前棋盤的形勢(shì)是哪一方獲勝。</p><p> 其詳細(xì)內(nèi)容在關(guān)鍵技術(shù)一節(jié)。</p><p><b> 2.2 游戲模式類</b></p><p> 用來(lái)管理人機(jī)對(duì)弈人人對(duì)弈兩種游戲模式,類名為CGame。CGame是一個(gè)抽象類,經(jīng)由它派生出一人游戲類
23、COneGame和網(wǎng)絡(luò)游戲類CTwoGame,如圖2.2:</p><p> 圖2.2 CGame類派生關(guān)系</p><p> 這樣,CTable類就可以通過(guò)一個(gè)CGame類的指針在游戲初始化的時(shí)候根據(jù)具體游戲模式的要求實(shí)例化COneGame或CTwoGame類的對(duì)象來(lái)區(qū)分人機(jī)對(duì)弈還是人人對(duì)弈;然后利用多態(tài)性,使用CGame類提供的公有接口就可以完成不同游戲模式下的不同功能了。<
24、/p><p><b> 3關(guān)鍵技術(shù)</b></p><p> 3.1 棋盤對(duì)話框的制作</p><p> 3.1.1 對(duì)話框機(jī)制</p><p> 顯示對(duì)話框供人選擇下棋模式</p><p> BOOL CBestDlg::OnInitDialog() //初始化對(duì)話框</p>
25、<p><b> {</b></p><p> CDialog::OnInitDialog();</p><p> m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);</p><p> SetIcon(m_hIcon, TRUE);//設(shè)置大圖標(biāo)</p>
26、<p> SetIcon(m_hIcon, FALSE);//設(shè)置小圖標(biāo)</p><p> Name1Edit().SetWindowText(g_strName1);//載入用戶名1 </p><p> Name2Edit().SetWindowText(g_strName2);//載入用戶名2</p><p> Name3Edit().Se
27、tWindowText(g_strName3);//載入用戶名3</p><p> char str[4]; //定義4個(gè)字符的字符串</p><p> wsprintf(str,"%d",g_nTime1);// wsprintf(緩沖區(qū),格式,要格式化的值);</p><p> Time1Edit().SetWindowText(str
28、)// 設(shè)置主窗口中空間(ID)的文字或標(biāo)題;</p><p> wsprintf(str,"%d",g_nTime2);//用來(lái)格式化字符串</p><p> Time2Edit().SetWindowText(str);</p><p> wsprintf(str,"%d",g_nTime3);</p>
29、<p> Time3Edit().SetWindowText(str);</p><p> return TRUE;</p><p><b> }</b></p><p><b> 3.1.2 棋盤</b></p><p><b> 用于載入棋盤</b>&
30、lt;/p><p> m_pDibBoard->LoadDib(IDDIB_BOARD);//載入棋盤位圖,</p><p> m_pDibBoard->MakeBitmap(pDC);//繪制棋盤上的坐標(biāo),方便下子</p><p><b> 3.1.3 棋子</b></p><p><b>
31、用于畫(huà)棋子</b></p><p> CRect CPenteDlg::GetCurStoneArea(CPoint point)//獲得棋子的坐標(biāo)</p><p><b> {</b></p><p> int nXd = point.x-m_wStoneWidth/2; //棋子橫坐標(biāo)
32、 </p><p> int nYd = point.y-m_wStoneHeight/2;//棋子縱坐標(biāo)</p><p> return CRect(nXd, nYd, nXd+m_wStoneWidth, nYd+m_wStoneHeight);//返回棋子的寬度高度</p><p><b> } </b>&
33、lt;/p><p><b> 3.2 人機(jī)對(duì)弈</b></p><p> 3.2.1 難度的選擇</p><p> 它能讓玩家選擇適合自己的難度</p><p><b> 設(shè)置電腦難易程度:</b></p><p> BOOL CRecordDlg::OnInitDia
34、log() //初始化對(duì)話框</p><p><b> {</b></p><p> CDialog::OnInitDialog();</p><p> m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);//載入主框架圖標(biāo)</p><p> SetIcon(m_h
35、Icon, TRUE);// 設(shè)置大圖標(biāo)</p><p> SetIcon(m_hIcon, FALSE);// 設(shè)置小圖標(biāo)</p><p> CString str;//聲明字符串</p><p> if (g_nSkill == 1)//如果技術(shù)為1</p><p><b> {</b></p
36、><p> str.LoadString(g_bChineseIDS_BEGINNER_CHINESE:IDS_BEGINNER_ENGLISH);//載入顯示初學(xué)者難度位圖,并用中文或者英文顯示說(shuō)明</p><p> SkillEdit().SetWindowText(str);//設(shè)置難度窗口</p><p> NameEdit().SetWindowText
37、(g_strName1);//設(shè)置窗口,用于輸入姓名</p><p><b> }</b></p><p> else if (g_nSkill == 2)//如果技術(shù)為2</p><p><b> {</b></p><p> str.LoadString(g_bChineseIDS_IN
38、TERMEDIATE_CHINESE:IDS_INTERMEDIATE_ENGLISH); 載入中級(jí)難度位圖,并顯示</p><p> SkillEdit().SetWindowText(str);</p><p> NameEdit().SetWindowText(g_strName2);</p><p><b> }</b><
39、;/p><p> if (g_nSkill == 3)//如果難度為3</p><p><b> {</b></p><p> str.LoadString(g_bChineseIDS_EXPERT_CHINESE:IDS_EXPERT_ENGLISH); //載入專家級(jí)難度位圖,并顯示</p>&l
40、t;p> SkillEdit().SetWindowText(str);</p><p> NameEdit().SetWindowText(g_strName3);</p><p><b> }</b></p><p> NameEdit().SetFocus();對(duì)之前設(shè)置的窗口設(shè)置鍵盤焦點(diǎn)</p><p&
41、gt; return TRUE;</p><p><b> FALSE</b></p><p><b> }</b></p><p> 3.2.2 機(jī)器的落子判斷</p><p> 它使電腦能夠根據(jù)人的走棋加以應(yīng)對(duì)</p><p> 人與機(jī)器對(duì)弈,機(jī)器是如何判斷的
42、呢?</p><p> 此時(shí)就需要引入人機(jī)對(duì)弈智能算法:</p><p><b> 算法如下:</b></p><p> CPoint CPenteDlg::UrgentPoint(BYTE byColor)//聲明緊迫度函數(shù)</p><p> { </p><p>
43、int i, i0, j, j0; </p><p> BeginWaitCursor();///是建立等待光標(biāo)</p><p> CPoint ptUrgent[2025], ptInit(-1,-1);//建立最大緊迫度2025</p><p> for (i=0; i<2025; ++i)//初始化i</p>
44、<p> ptUrgent[i] = ptInit;初始化i點(diǎn)的緊迫度</p><p> nGrade1 = Judge(i, j, (char)(byColor+1));//獲取對(duì)方緊迫度 </p><p> nGrade2 = Judge(i,
45、j, (char)(!byColor+1)); //不同緊迫度,賦予不同度權(quán)值 </p><p> if (g_nSkill == 1) //初學(xué)者難度</p><p><b> { </b></p><p&g
46、t; switch (nGrade1) //轉(zhuǎn)向等級(jí)1,并對(duì)它賦權(quán)值,用于判斷電腦下棋位子</p><p><b> { </b></p><p> case 0 : nUrgent1 = 0; break;//在情況0下對(duì)緊迫度為1的點(diǎn)賦
47、予權(quán)值0</p><p> case 1 : nUrgent1 = 2; break;//在情況1下對(duì)緊迫度為1的點(diǎn)賦予權(quán)值4</p><p> case 2 : nUrgent1 = 4; break;//以下的以此類
48、推,直到賦予40</p><p> case 3 : nUrgent1 = 5; break; </p><p> case 4 : nUrgent1 = 8; break; <
49、/p><p> case 5 : nUrgent1 = 10; break; </p><p> case 6 : nUrgent1 = 11; break; </p><p><b
50、> …… </b></p><p> case 16 : nUrgent1 = 32; break; </p><p> case 17 : nUrgent
51、1 = 34; break; </p><p> case 18 : nUrgent1 = 36; break; </p><p> case 19 : nUrgent1
52、0; = 38; break; </p><p> case 20 : nUrgent1 = 40; break; </p><p> default : nUrgent1 = 4
53、0; break; </p><p> } </p><p> switch (nGrade2)//轉(zhuǎn)向等級(jí)2</p><p><b> {</b></p><p> case 0 : nUrgent2 = 1; break;/
54、/在情況0時(shí)對(duì)緊迫度未2的點(diǎn)賦予權(quán)值1,</p><p> case 1 : nUrgent2 = 3; break;//以下的以此類推直到賦予41為止</p><p> case 2 : nUrgent2 = 6; break;</p><p> case 3 : nUrgent2 = 7; break;</p><p
55、> case 4 : nUrgent2 = 9; break;</p><p> case 5 : nUrgent2 = 21; break;//對(duì)緊迫度為2的點(diǎn)賦予在不同的情況下賦予不同的權(quán)值</p><p> case 6 : nUrgent2 = 22; break;</p><p> case 7 : nUrgent2 =
56、23; break;</p><p> case 8 : nUrgent2 = 24; break;</p><p> case 9 : nUrgent2 = 25; break;</p><p> case 10 : nUrgent2 = 26; break;</p><p> case 11
57、 : nUrgent2 = 27; break;</p><p> case 12 : nUrgent2 = 28; break;</p><p> case 13 : nUrgent2 = 29; break;</p><p> case 14 : nUrgent2 = 30; break;</p>&l
58、t;p> case 15 : nUrgent2 = 31; break;</p><p> case 16 : nUrgent2 = 33; break; </p><p> case 17 : nUrgent2 = 35; break;</p><p> case 18 : nUrgent2 = 37; break;
59、</p><p> case 19 : nUrgent2 = 39; break;</p><p> case 20 : nUrgent2 = 41; break;</p><p> default : nUrgent2 = 41; break;</p><p><b> }</
60、b></p><p> }nUrgent = min(nUrgent1,nUrgent2)*45 + max(nUrgent1, nUrgent2);// 如上算法既考慮了對(duì)手的權(quán)值,也考慮了自己緊迫點(diǎn)的權(quán)值,通過(guò)賦予不同緊迫點(diǎn)不同的權(quán)值,綜合起來(lái)且根據(jù)總和最大的來(lái)確定自己的下子點(diǎn),由此而實(shí)現(xiàn)了人機(jī)的對(duì)弈。通過(guò)如下計(jì)算公式求出了最緊急的
61、下子點(diǎn):</p><p> ptUrgent[nUrgent] = ptCurrent; //獲取具有最小緊迫度的點(diǎn)</p><p><b> }</b></p><p><b> } </b></p><p> for (i=0;
62、160; i<2025; ++i) // 初始化i</p><p> if (ptUrgent[i] != ptInit) //如果緊迫點(diǎn)權(quán)值i不等于初始值 break; </p><p> EndWaitCursor();//結(jié)束等待光標(biāo)
63、; </p><p> if (ptUrgent[i] == ptInit)//如果緊迫點(diǎn)權(quán)值i等于初始值 &
64、#160;</p><p><b> { </b></p><p> CString str1, str2; 聲明2個(gè)字符串</p><p> str1.LoadString(IDS_DRAW_CHINESE);//載入中文圖片</p><p> str2.Lo
65、adString(IDS_TITLE_CHINESE);//載入中文標(biāo)題 </p><p> MessageBox(str1, str2);//出現(xiàn)顯示平局的對(duì)話框 </p><p><b> } </b></p><p> return ptUrgent[i];//返回最小的
66、點(diǎn) }</p><p><b> 4運(yùn)行結(jié)果</b></p><p> 4.1開(kāi)發(fā)環(huán)境及運(yùn)行環(huán)境</p><p> 4.1.1 開(kāi)發(fā)環(huán)境</p><p> Intel® Pentium® 4 2.0GHz,512M內(nèi)存,80G硬盤</p><p> Mic
67、rosoft® Windows? XP</p><p> Microsoft® Visual C++ 6.0</p><p><b> 4.1.2運(yùn)行環(huán)境</b></p><p> Intel® Pentium® 2及以上處理器,32M以上內(nèi)存,4G以上硬盤</p><p>
68、 Microsoft® Windows? 9X/NT操作系統(tǒng)</p><p> 800*600或以上的屏幕分辨率</p><p> 4.2運(yùn)行圖示 </p><p> 4.2.1 棋盤顯示</p><p> 通過(guò)載入棋盤位圖達(dá)到了如下效果:</p><p> 圖4.2.1. 五子棋棋盤&l
69、t;/p><p> 4.2.2 開(kāi)始的選擇對(duì)話框</p><p> 開(kāi)始的選擇對(duì)話框能讓你選擇與電腦下棋還是與人下棋,以及誰(shuí)執(zhí)黑先手。</p><p> 圖4.2.2 選擇對(duì)話框</p><p> 4.2.3 主界面中的游戲難度選項(xiàng)</p><p> 通過(guò)主界面中的游戲難度選項(xiàng),能選擇適合自己的難度等級(jí),與電腦
70、對(duì)弈。</p><p> 圖4.2.3 游戲難度選擇</p><p> 4.2.4 電腦的應(yīng)對(duì)</p><p> 圖4.2.4.1 沖3的情況</p><p> 沖3這點(diǎn)的權(quán)值最大,電腦選擇此點(diǎn)。</p><p> 圖4.2.4.2 沖4的情況</p><p> 這時(shí)沖4權(quán)值經(jīng)
71、計(jì)算最大,故電腦選擇此點(diǎn)。</p><p> 圖4.2.4.3 防守的情況</p><p><b> 5調(diào)試分析</b></p><p> 在調(diào)試過(guò)程出我的算法出了點(diǎn)問(wèn)題,特別是對(duì)于緊迫點(diǎn)權(quán)值的計(jì)算,之后同學(xué)求助于CSDN上面的帖子,我修改了自己的算法。并理解了算法實(shí)現(xiàn)要領(lǐng):</p><p> 電腦下子實(shí)際上是分
72、兩個(gè)步驟的,第一個(gè)步驟是盡可能的收集棋盤格局的信息,并且使這些信息以一定的格式存放再內(nèi)存中,以便于第二步的處理。第二個(gè)步驟就是,對(duì)收集到的信息進(jìn)行分析處理,即要給出一個(gè)規(guī)則,用窮舉搜索的辦法遍歷所有收集到的信息,搜索的過(guò)程實(shí)際上是用所定下的規(guī)則去衡量每一點(diǎn)的權(quán)值,搜索的目的是為了找到一個(gè)權(quán)值最大的點(diǎn),這個(gè)點(diǎn)就是當(dāng)前的最優(yōu)解,也就是應(yīng)該下的子。 </p><p> 舉個(gè)例子來(lái)說(shuō):如果在第一步中,先遍歷棋盤上的每一
73、個(gè)點(diǎn),即對(duì)于每一個(gè)點(diǎn),我們假定這個(gè)點(diǎn)放上黑子,這時(shí)候就判斷這個(gè)黑子放上去后,會(huì)形成多少個(gè)活2、活3、活4和5子連珠,然后把對(duì)應(yīng)的數(shù)值記下,然后再假定這個(gè)點(diǎn)放白棋,又會(huì)形成多少個(gè)活2、活3、活4和五,當(dāng)然你也可以用兩個(gè)</p><p> 下面就是如何利用所得到的信息去下棋了:</p><p> 這個(gè)過(guò)程也是遍歷分析所得的信息的過(guò)程。對(duì)上面的信息,我們可以很好的處理。比如,假定四三是必勝的
74、,則我們給他的權(quán)值就很大比如100吧,而活二給的權(quán)值應(yīng)該比較小,就給1吧。然后你可以得到一個(gè)權(quán)值的計(jì)算公式,</p><p><b> 舉例說(shuō):</b></p><p> 權(quán)值=活二的個(gè)數(shù)×1+活三的個(gè)數(shù)×5+活四的個(gè)數(shù)×10+四三的個(gè)數(shù)×100</p><p> 就是類似這樣的公式,只要得出權(quán)值最
75、大點(diǎn),并判斷己方下個(gè)子的權(quán)值大于對(duì)手的URGENTPOINT的權(quán)值的話,這個(gè)位置就是你下一步所要下子的點(diǎn)。</p><p> 下棋是就是遍歷每一個(gè)點(diǎn)的信息,對(duì)每一個(gè)點(diǎn)計(jì)算權(quán)值,找到權(quán)值最大的就是要下的點(diǎn)了。上面說(shuō)了用兩個(gè)數(shù)組分別保存黑子和白子的信息也是有必要的,因?yàn)榭梢杂?jì)算出某一點(diǎn)對(duì)黑白雙方的重要程度。就是說(shuō)如果輪到你下白子了,你光看哪一點(diǎn)對(duì)白子有利也不行呀,還要看哪些點(diǎn)對(duì)黑子有利,并且要比較這種有利的程度。如
76、果你放某一點(diǎn)能成活3,而別人放另一點(diǎn)就是四三了,你就要搶先吧那一點(diǎn)占了。</p><p> 如上算法既考慮了對(duì)手的權(quán)值,也考慮了自己緊迫點(diǎn)的權(quán)值,通過(guò)賦予不同緊迫點(diǎn)不同的權(quán)值,綜合起來(lái)且根據(jù)總和來(lái)確定自己的下子點(diǎn),由此而實(shí)現(xiàn)了人機(jī)的對(duì)弈。通過(guò)如下計(jì)算公式求出了最緊急的下子點(diǎn):</p><p> 當(dāng)遇到問(wèn)題時(shí),我求助于論壇,與許多人交流了有關(guān)人工智能算法的思想,許多程序員回了帖子,并教了
77、我許多技巧,我很感謝他們。這個(gè)五子棋本來(lái)是沒(méi)有聲音的,我覺(jué)得缺乏趣味,于是便添加了一些聲音文件,當(dāng)出現(xiàn)重復(fù)地點(diǎn)下子的ERROR,獲勝以及重新開(kāi)始游戲時(shí),都會(huì)有一小段音效,我想這也許也會(huì)是一點(diǎn)小小的改變吧。</p><p><b> 6總結(jié)</b></p><p> 為期1個(gè)學(xué)期的程序設(shè)計(jì)課,學(xué)到的是我大學(xué)中最受益的東西。</p><p>
78、 首先,在知識(shí)方面,我了解了許多C++MFC的知識(shí)以及相關(guān)應(yīng)用。對(duì)系統(tǒng)的完成五子棋這個(gè)小游戲有了深刻的認(rèn)識(shí)。這次的課程設(shè)計(jì),不僅令我掌握了五子棋的人工智能算法,同時(shí)也培養(yǎng)了我的動(dòng)手和實(shí)踐創(chuàng)新能力。我學(xué)會(huì)了如何把理論用于實(shí)際應(yīng)用中去。我深深的感到獨(dú)立思考,與他們探討,一起研究一個(gè)項(xiàng)目是多么快樂(lè)的事情。當(dāng)我在設(shè)計(jì)過(guò)程中出現(xiàn)困難,并出現(xiàn)疑惑時(shí),我求助于老師,并且通過(guò)GOOGLE獲取了許多有助于我程序設(shè)計(jì)課題的相關(guān)知識(shí)。谷歌為我們中國(guó)乃至全世界
79、學(xué)生提供了一個(gè)良好的索取知識(shí)的平臺(tái),通過(guò)這個(gè)媒介,我們學(xué)到了許多,而當(dāng)我們充分利用起網(wǎng)絡(luò)資源時(shí),我們會(huì)受益匪淺。</p><p> 其次,通過(guò)這次課程設(shè)計(jì),我把理論與實(shí)際結(jié)合了起來(lái),平時(shí)的我只去網(wǎng)上與別人下五子棋或者在自己的電腦上與電腦下,可是,我現(xiàn)在已經(jīng)能夠和自己所編寫的人工智能的對(duì)手進(jìn)行下棋,我感到無(wú)比幸福。我從一個(gè)被動(dòng)的知識(shí)接受者,正在慢慢轉(zhuǎn)變?yōu)橐粋€(gè)敢于主動(dòng)發(fā)現(xiàn)問(wèn)題,并主動(dòng)去實(shí)踐嘗試的人,我想這對(duì)我來(lái)說(shuō)是
80、一大進(jìn)步。</p><p> 我想我的五子棋可以在把英雄榜做的更輝煌些,讓人盡情享受到勝利的喜悅,并增加一些挑戰(zhàn)功能,比如說(shuō)誰(shuí)能在動(dòng)用最少棋子的情況下戰(zhàn)勝專家級(jí)電腦,就把此人名字加入英雄榜速勝一欄。</p><p> 最后我要感謝我程序設(shè)計(jì)的指導(dǎo)老師**老師,她在我最初做這項(xiàng)目的時(shí)候給與了幫助,提供了指導(dǎo)。同時(shí)我也要感謝GOOGLE,他也是我解決困惑的最好的老師。</p>
81、<p> 這次的課程設(shè)計(jì)會(huì)令我很難忘。</p><p><b> 參考文獻(xiàn)</b></p><p> [01]設(shè)計(jì)模式——可復(fù)用面向?qū)ο筌浖幕A(chǔ),Erich Gamma/Richard Helm/Ralph Johnson/John Vlissides著,李英軍/馬曉星/蔡敏/劉建中 等譯,機(jī)械工業(yè)出版社</p><p>
82、 [02] 深入淺出MFC(第2版),侯俊杰著,華中科技大學(xué)出版社</p><p> [03] A Beginner 's Guide to Pointers,Andrew Peace</p><p> [04] Microsoft® Visual C++.NET 技術(shù)內(nèi)幕(第6版),George Shepherd/David Kruglinski著,潘愛(ài)民譯,清華大
83、學(xué)出版社</p><p> [05] Visual C++網(wǎng)絡(luò)通信協(xié)議分析與應(yīng)用實(shí)現(xiàn),汪曉平/鐘軍 等編著,人民郵電出版社</p><p> [06] C++編程思想,Bruce Eckel著,劉宗田/邢大紅/孫慧杰 等譯,機(jī)械工業(yè)出版社</p><p> [07] 21天學(xué)通C++,Jesse Liberty著,康博創(chuàng)作室譯,人民郵電出版社</p>
84、;<p> [08] C++標(biāo)準(zhǔn)程序庫(kù),Nicolai M.Josuttis著,侯捷/孟巖 譯,華中科技大學(xué)出版社</p><p> [09] Windows程序設(shè)計(jì),Charles Petzold著,北京博彥科技發(fā)展有限公司譯,北京大學(xué)出版社</p><p> [10] Visual C++.NET網(wǎng)絡(luò)編程,易君 編著,中國(guó)鐵道出版社</p><p
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 五子棋-課程設(shè)計(jì)報(bào)告
- 五子棋課程設(shè)計(jì)
- java課程設(shè)計(jì)報(bào)告-五子棋
- 五子棋游戲課程設(shè)計(jì)報(bào)告
- java五子棋課程設(shè)計(jì)
- java課程設(shè)計(jì)--五子棋
- 五子棋java課程設(shè)計(jì)
- 五子棋java課程設(shè)計(jì)
- 五子棋java語(yǔ)言課程設(shè)計(jì)報(bào)告
- c++五子棋課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)--五子棋游戲
- java課程設(shè)計(jì)--對(duì)戰(zhàn)五子棋
- 五子棋c++課程設(shè)計(jì)
- 五子棋c++課程設(shè)計(jì)
- 五子棋小游戲課程設(shè)計(jì)
- c語(yǔ)言五子棋課程設(shè)計(jì)
- c語(yǔ)言圖形五子棋課程設(shè)計(jì)報(bào)告
- c語(yǔ)言圖形五子棋課程設(shè)計(jì)報(bào)告
- 人工智能課程設(shè)計(jì)報(bào)告-五子棋
- java課程設(shè)計(jì)-五子棋游戲
評(píng)論
0/150
提交評(píng)論