五子棋畢業(yè)課程設(shè)計(jì)報(bào)告_第1頁(yè)
已閱讀1頁(yè),還剩15頁(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>  目 錄</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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論