黑白棋游戲設(shè)計與開發(fā)畢業(yè)論文_第1頁
已閱讀1頁,還剩40頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、<p>  分類號: </p><p>  黑白棋游戲設(shè)計與開發(fā)</p><p>  系 院 名 稱 </p><p>  指 導(dǎo) 老 師 </p><p>  學(xué) 生 姓 名 </p><p>  

2、學(xué) 生 學(xué) 號 </p><p>  專 業(yè)、班 級 </p><p>  提 交 時 間 </p><p><b>  畢業(yè)論文任務(wù)書</b></p><p><b>  畢業(yè)論文開題報告</b></p><p>

3、;<b>  黑白棋游戲設(shè)計</b></p><p>  摘要:本次畢業(yè)設(shè)計是基于c++語言,在vs2005平臺上進(jìn)行的單機(jī)版游戲開發(fā),通過本次游戲的開發(fā),有益于進(jìn)一步掌握對c++語言的應(yīng)用,加深對計算機(jī)游戲的制作理念的理解,對我今后參與更加復(fù)雜的游戲項目積累寶貴的經(jīng)驗!</p><p>  黑白棋(Reversi、Othello),也叫蘋果棋,翻轉(zhuǎn)棋,是一個經(jīng)典的策

4、略性游戲。黑白棋是19世紀(jì)末英國人發(fā)明的。直到上個世紀(jì)70年代一個日本人將其發(fā)展,借用莎士比亞名劇奧賽羅(Othello)為這個游戲重新命名,也就是現(xiàn)在大家玩的黑白棋。為何借用莎士比亞名劇呢?是因為奧賽羅是莎士比亞一個名劇的男主角。他是一個黑人,妻子是白人,因受小人挑撥,懷疑妻子不忠一直情海翻波,最終親手把妻子殺死。后來真相大白,奧賽羅懊悔不已,自殺而死。黑白棋就是借用這個黑人白人斗爭的故事而命名。</p><p&g

5、t;  關(guān)鍵詞:c++編程;windows編程;MFC技術(shù)</p><p><b>  論文目錄</b></p><p>  第一章 引言………………………………………………………………………………………1</p><p>  1.1 c++簡介……………………………………………………………………………………… 1</p><

6、;p>  1.2 window編程介紹…………………………………………………………………………… 1</p><p>  1.3 Visual studio開發(fā)平臺簡介……………………………………………………………… 1</p><p>  第二章 畢業(yè)業(yè)設(shè)計的目的及要求………………………………………………………………2</p><p>  2.1畢業(yè)設(shè)計的目

7、的………………………………………………………………………………2</p><p>  2.2畢業(yè)設(shè)計的開發(fā)環(huán)境…………………………………………………………………………2</p><p>  2.3畢業(yè)設(shè)計所需的知識…………………………………………………………………………2</p><p>  2.4畢業(yè)設(shè)計要求…………………………………………………………………………

8、………2</p><p>  畢業(yè)設(shè)計的內(nèi)容…………………………………………………………………………3</p><p>  3.1程序功能介紹…………………………………………………………………………………3</p><p>  3.2程序整體設(shè)計說明……………………………………………………………………………4</p><p>  3.3程序源

9、代碼及注釋……………………………………………………………………………7</p><p>  第四章 結(jié)束語……………………………………………………………………………………23</p><p><b>  第一章 引言</b></p><p>  1.1 c++語言介紹</p><p>  C++這個詞在中國大陸的程序員圈

10、子中通常被讀做“C加加”,而西方的程序員通常讀做“C plus plus”,“CPP”。 它是一種使用非常廣泛的計算機(jī)編程語言。C++是一種靜態(tài)數(shù)據(jù)類型檢查的,支持多重編程范式的通用程序設(shè)計語言。它支持過程化程序設(shè)計、數(shù)據(jù)抽象、面向?qū)ο蟪绦蛟O(shè)計、制作圖標(biāo)等等泛型程序設(shè)計等多種程序設(shè)計風(fēng)格。</p><p>  1.2 windows編程介紹</p><p>  Windows是微軟推出的圖

11、形界面的操作系統(tǒng),有windows2000、XP、Vista、win7等各種版本。是一種搶占式多任務(wù)的操作系統(tǒng),是PC上的主流操作系統(tǒng),在PC操作市場占絕大多數(shù)網(wǎng)絡(luò)游戲的客戶端、服務(wù)器端都可在上運(yùn)行。</p><p>  Windows程序由一個或多個的窗口組成,通常是多個窗口。窗口一般是一個矩形的區(qū)域,由windows對窗口進(jìn)行統(tǒng)一管理。任何的文字、圖形都寫窗口中顯示。</p><p>

12、  windows 系統(tǒng)設(shè)計為事件驅(qū)動的操作系統(tǒng),事件在windows定義為消息,消息為應(yīng)用程序和應(yīng)用程序間、應(yīng)用程序和操作系統(tǒng)間提供了信息傳遞的渠道。消息隊列,由Windows維持。</p><p>  1.3 Visual studio開發(fā)平臺簡介</p><p>  Visual Studio是微軟公司推出的開發(fā)環(huán)境,visual Studio可以用來應(yīng)用創(chuàng)建windows平臺下的w

13、indows程序和網(wǎng)絡(luò)應(yīng)用程序,也可以用來創(chuàng)建網(wǎng)絡(luò)服務(wù)、智能設(shè)備應(yīng)用程序和Office插件。目前已經(jīng)開發(fā)到10.0版本,也就是Visual Studio 2010.我們本次畢業(yè)設(shè)計的開發(fā)平臺就是其中的Visual Studio 2005。</p><p>  第二章 畢業(yè)設(shè)計的目的與要求</p><p>  2.1 畢業(yè)設(shè)計的目的</p><p>  通過對黑白棋

14、游戲規(guī)則的研究,做出一款適合在windows系統(tǒng)下進(jìn)行人機(jī)對弈的黑白棋程序出來,是本課題的研究總目標(biāo)。</p><p>  具體需要研究一下幾方面:</p><p>  1.黑白棋游戲規(guī)則;</p><p>  2.黑白棋游戲技巧;</p><p>  3.友好的用戶界面;</p><p>  4.單人模式的人工智能算

15、法;</p><p>  5.黑白棋游戲的常用功能(難度選擇)。</p><p>  2.2 畢業(yè)設(shè)計的開發(fā)環(huán)境</p><p>  開發(fā)語:c++語言;</p><p>  開發(fā)平臺:windows操作系統(tǒng)中的vs2005平臺。</p><p>  2.3 畢業(yè)設(shè)計所需的知識</p><p>

16、  熟悉c++語言及vs2005開發(fā)平臺。</p><p>  2.4 畢業(yè)設(shè)計要求</p><p>  1. 分析畢業(yè)設(shè)計題目的要求</p><p>  2. 寫出詳細(xì)設(shè)計說明</p><p>  3. 編寫程序代碼,調(diào)試程序使其能正確運(yùn)行</p><p>  4. 設(shè)計完成的軟件要便于操作和使用。</p>

17、;<p>  第三章 畢業(yè)設(shè)計的內(nèi)容</p><p><b>  3.1程序功能介紹</b></p><p>  1.顯示游戲的界面功能</p><p>  游戲界面上包括游戲等級選擇、重新開始、游戲幫助的控件對游戲進(jìn)行相應(yīng)的設(shè)置。</p><p>  2.接受鼠標(biāo)輸入功能</p><

18、p>  能夠接受玩家的鼠標(biāo)輸入功能,把棋子放入指定的位置。</p><p>  3.根據(jù)規(guī)則翻轉(zhuǎn)相應(yīng)的棋子</p><p>  無論是電腦或是玩家在棋盤中落下棋子后,能夠根據(jù)游戲的規(guī)則,把橫向、縱向及對角直線上的棋子全部翻轉(zhuǎn)過來,變成最后落下棋子的顏色,并對棋子數(shù)量進(jìn)行增減。</p><p>  4.游戲勝負(fù)判斷功能</p><p> 

19、 雙方都沒有棋子可下時棋局結(jié)束,以棋子數(shù)目來計算勝負(fù),棋子多的一方獲勝。在棋盤還沒下滿時,如果一方的棋子應(yīng)經(jīng)被對方吃光,則棋局結(jié)束。將對手棋子吃光的一方獲勝。</p><p>  5.實現(xiàn)人機(jī)對戰(zhàn)模式</p><p>  支持人工智能,根據(jù)游戲等級的不同,進(jìn)行不同的算法深度搜索,找出最合理的位置進(jìn)行落子操作。</p><p>  6.人工智能的等級設(shè)置</p&

20、gt;<p>  能夠指定當(dāng)前電腦人工智能的等級。根據(jù)不同的等級,其算法搜索深度不同。</p><p>  7.游戲提供幫助說明</p><p>  在游戲界面中,提供一個控件。以方便對本游戲不了解的玩家對游戲進(jìn)行操作和使用。</p><p><b>  黑白棋功能架構(gòu):</b></p><p>  3.2

21、程序整體設(shè)計說明</p><p><b>  1.設(shè)計思路</b></p><p>  本游戲設(shè)計是采用MFC對話框模式進(jìn)行設(shè)計開發(fā)。所以從此游戲設(shè)計采用模塊化思想,即程序整體設(shè)計分為五個模塊來實現(xiàn)。</p><p>  主界面對話框類:主要負(fù)責(zé)主界面及棋盤、棋子的顯示及棋盤窗口對象的創(chuàng)建和調(diào)用。</p><p>  棋

22、盤窗口類:主要負(fù)責(zé)接受玩家鼠標(biāo)輸入的棋子位置及棋子翻轉(zhuǎn)動畫等 處理。</p><p>  人工智能算法類:主要負(fù)責(zé)電腦的人工智能算法的處理。</p><p>  規(guī)則處理類:主要負(fù)責(zé)棋子數(shù)據(jù)的統(tǒng)計、落子位置有效及勝負(fù)判斷等處理。</p><p>  幫助對話框類:主要負(fù)責(zé)幫助提示的顯示及其他輔助消息。</p><p>  2.程序結(jié)構(gòu)(流程

23、圖)</p><p><b>  3.程序結(jié)果</b></p><p>  人執(zhí)黑棋,電腦執(zhí)白棋,輪流走棋,每方都試圖在游戲結(jié)束前讓自己棋子的數(shù)目多于對方。按鼠標(biāo)左鍵可以擺放棋子。下到最后誰的棋子多,誰贏。</p><p>  3.3 程序源代碼及注釋</p><p>  1、游戲?qū)υ捒蛑锌丶脑O(shè)置</p>

24、<p>  消息與成員函數(shù)映射:</p><p>  BEGIN_MESSAGE_MAP(COthelloDlg, CDialog)</p><p>  ON_WM_SYSCOMMAND()</p><p>  ON_WM_PAINT()</p><p>  ON_BN_CLICKED(IDC_HELP, &COthell

25、oDlg::OnBnClickedButtonHelp)</p><p>  ON_WM_QUERYDRAGICON()</p><p>  //}}AFX_MSG_MAP</p><p>  ON_BN_CLICKED(IDC_RADIO1, &COthelloDlg::OnBnClickedRadio1)</p><p>  ON

26、_BN_CLICKED(IDC_RADIO2, &COthelloDlg::OnBnClickedRadio2)</p><p>  ON_BN_CLICKED(IDC_RADIO3, &COthelloDlg::OnBnClickedRadio3)</p><p>  ON_BN_CLICKED(IDC_START, &COthelloDlg::OnGameSta

27、rt)</p><p>  END_MESSAGE_MAP()</p><p><b>  幫助控件的實現(xiàn):</b></p><p>  void COthelloDlg::OnBnClickedButtonHelp(){</p><p>  // TODO: 在此添加控件通知處理程序代碼</p><

28、p>  HelpDlg helpDlg;</p><p>  helpDlg.DoModal();</p><p><b>  }</b></p><p><b>  “低”空間的實現(xiàn):</b></p><p>  void COthelloDlg::OnBnClickedRadio1()&l

29、t;/p><p><b>  {</b></p><p>  // TODO: 在此添加控件通知處理程序代碼</p><p>  g_iGameLevel = LEVEL_LOW;</p><p><b>  }</b></p><p><b>  “中”控件的實現(xiàn):&

30、lt;/b></p><p>  void COthelloDlg::OnBnClickedRadio2()</p><p><b>  {</b></p><p>  // TODO: 在此添加控件通知處理程序代碼</p><p>  g_iGameLevel = LEVEL_NOR;</p>&l

31、t;p><b>  }</b></p><p><b>  “高”控件的實現(xiàn):</b></p><p>  void COthelloDlg::OnBnClickedRadio3()</p><p><b>  {</b></p><p>  // TODO: 在此添加控

32、件通知處理程序代碼</p><p>  g_iGameLevel = LEVEL_HIGH;</p><p><b>  }</b></p><p>  游戲開始控件的實現(xiàn):</p><p>  void COthelloDlg::OnGameStart()</p><p><b>  

33、{</b></p><p>  // TODO: 在此添加控件通知處理程序代碼</p><p>  GameStart();</p><p><b>  }</b></p><p>  void COthelloDlg::GameStart()</p><p><b>  {

34、</b></p><p>  m_nBlackCount = 2;</p><p>  m_nWhiteCount = 2;</p><p>  m_chess.NewGame();</p><p><b>  }</b></p><p><b>  2、棋盤窗口的設(shè)計<

35、;/b></p><p>  CChessBoard類的構(gòu)造函數(shù):</p><p>  CChessBoard::CChessBoard()</p><p><b>  {</b></p><p>  m_iMotiveNumber=0;</p><p>  m_iMotivex = m_i

36、Motivey=0;</p><p>  m_bPlayMotive = FALSE; </p><p>  init_board(&m_oChessBoard);</p><p><b>  }</b></p><p>  CChessBoard::~CChessBoard()</p><p

37、><b>  {</b></p><p><b>  }</b></p><p>  消息與成員與函數(shù)映射:</p><p>  BEGIN_MESSAGE_MAP(CChessBoard, CWnd)</p><p>  ON_WM_PAINT()</p><p> 

38、 ON_WM_LBUTTONDOWN()</p><p>  ON_WM_CREATE()</p><p>  ON_MESSAGE(UM_COMRUN, OnComRun)</p><p>  ON_MESSAGE(WM_TRANCHESS, OnTranChess)</p><p>  END_MESSAGE_MAP()</p>

39、;<p><b>  延時函數(shù):</b></p><p>  void delay(INT32 millisecond)</p><p><b>  {</b></p><p>  clock_t start = clock();</p><p><b>  do</b

40、></p><p><b>  { </b></p><p><b>  MSG msg;</b></p><p>  if (::PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) </p><p><b>  { </b&g

41、t;</p><p>  if ( !AfxGetApp()->PumpMessage()) </p><p><b>  { </b></p><p>  ::PostQuitMessage(0); </p><p><b>  return;</b></p><p>

42、;<b>  } </b></p><p><b>  } </b></p><p>  }while(clock()<start+millisecond);</p><p><b>  }</b></p><p><b>  改變棋子接口函數(shù)</b>

43、;</p><p>  LRESULT CChessBoard::OnTranChess(WPARAM wParam, LPARAM lParam)</p><p><b>  {</b></p><p>  int row = wParam/10-1;</p><p>  int col = wParam%10-1;&

44、lt;/p><p>  CRect r(col*COL_WIDTH+22, row*ROW_WIDTH+22,</p><p>  col*COL_WIDTH+COL_WIDTH+22, row*ROW_WIDTH+ROW_WIDTH+22);</p><p>  m_bPlayMotive = FALSE; </p><p>  OnPaint

45、(); </p><p>  InvalidateRect(&r);</p><p>  if((lParam>>16) !=0)</p><p>  PlayMotive(row, col, UINT8(lParam));</p><p><b>  return 0;</b></p>

46、<p><b>  }</b></p><p><b>  由電腦人工智能下棋</b></p><p>  LRESULT CChessBoard::OnComRun(WPARAM wParam, LPARAM lParam)</p><p><b>  {</b></p>

47、<p>  computer_play(&m_oChessBoard, m_hWnd); </p><p>  UINT16 wscore, bscore;</p><p>  get_chess_score(&m_oChessBoard, wscore, bscore);</p><p>  GetParent()->SendMes

48、sage(UM_RECALC, WPARAM(wscore|0x80000000), LPARAM(bscore));</p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  新游戲</b></p><p> 

49、 void CChessBoard::NewGame()</p><p><b>  {</b></p><p>  if(cur_step >0)</p><p><b>  {</b></p><p>  g_bStart = 1;</p><p>  init_b

50、oard(&m_oChessBoard);</p><p>  Invalidate(); </p><p><b>  }</b></p><p><b>  }</b></p><p><b>  窗口建立函數(shù)</b></p><p>  B

51、OOL CChessBoard::Create(RECT &rect, CWnd *pParentWnd, UINT nID)</p><p><b>  {</b></p><p>  CString szClassName = AfxRegisterWndClass(CS_CLASSDC|CS_SAVEBITS|</p><p> 

52、 CS_HREDRAW|CS_VREDRAW,</p><p>  0, (HBRUSH)CBrush(RGB(0,0,255)), 0);</p><p>  rect.right = rect.left + 380+3;</p><p>  rect.bottom = rect.top +380+3;</p><p>  if(!CWnd

53、::CreateEx(WS_EX_CLIENTEDGE, szClassName, _T(""),</p><p>  WS_CHILD|WS_VISIBLE|WS_TABSTOP, rect, </p><p>  pParentWnd, nID, NULL)) //WS_EX_CLIENTEDGE</p><p>  return FALSE

54、;</p><p>  UpdateWindow();</p><p>  m_bitBlackChess.LoadBitmap(IDB_BLACKCHESS);</p><p>  m_bitChessBoard.LoadBitmap(IDB_CHESSBOARD);</p><p>  m_bitWhiteChess.LoadBitmap

55、(IDB_WHITECHESS);</p><p>  m_motive[0].LoadBitmap(IDB_WHITECHESS); </p><p>  m_motive[1].LoadBitmap(IDB_TURN1);</p><p>  m_motive[2].LoadBitmap(IDB_TURN2); </p><p>  m_

56、motive[3].LoadBitmap(IDB_TURN3); </p><p>  m_motive[4].LoadBitmap(IDB_TURN4); </p><p>  m_motive[5].LoadBitmap(IDB_TURN5); </p><p>  m_motive[6].LoadBitmap(IDB_TURN6); </p>&

57、lt;p>  m_motive[7].LoadBitmap(IDB_BLACKCHESS); </p><p>  return TRUE;</p><p><b>  }</b></p><p><b>  播放棋子翻動動畫</b></p><p>  void CChessBoard::P

58、layMotive(int row, int col, UINT8 obcolor)</p><p><b>  {</b></p><p>  m_iMotivex = col*COL_WIDTH+24;</p><p>  m_iMotivey = row*COL_WIDTH+24;</p><p>  CRect

59、r(m_iMotivex, m_iMotivey, </p><p>  m_iMotivex+COL_WIDTH, </p><p>  m_iMotivey +ROW_WIDTH);</p><p>  m_bPlayMotive = TRUE; </p><p>  if(obcolor == CHESS_BLACK)</p>

60、;<p>  {//把棋子從白面向黑面翻轉(zhuǎn)</p><p>  for(m_iMotiveNumber =0; m_iMotiveNumber<8; m_iMotiveNumber++)</p><p><b>  {</b></p><p>  OnPaint();</p><p>  Invali

61、dateRect(&r); </p><p>  delay(50);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p><p>  {//把棋子從黑面向白面翻轉(zhuǎn)

62、</p><p>  for(m_iMotiveNumber =7; m_iMotiveNumber>=0; m_iMotiveNumber--)</p><p><b>  {</b></p><p>  OnPaint();</p><p>  InvalidateRect(&r); </p>

63、;<p>  delay(50);</p><p><b>  }</b></p><p><b>  }</b></p><p>  m_bPlayMotive = FALSE;</p><p><b>  }</b></p><p>&

64、lt;b>  窗口繪圖函數(shù)</b></p><p>  void CChessBoard::OnPaint() </p><p><b>  {</b></p><p>  CPaintDC dc(this); </p><p>  CDC imgdc;</p><p>  im

65、gdc.CreateCompatibleDC(&dc);</p><p>  imgdc.SelectObject(&m_bitChessBoard); </p><p>  dc.BitBlt(0, 0, 380, 380, &imgdc,0,0,SRCCOPY); </p><p>  if(m_bPlayMotive)</p&

66、gt;<p><b>  {</b></p><p>  imgdc.SelectObject(&m_motive[m_iMotiveNumber]); </p><p>  dc.BitBlt(m_iMotivex, m_iMotivey, 39, 39, &imgdc, 0, 0, SRCCOPY);</p><

67、p><b>  return;</b></p><p><b>  }</b></p><p>  for(int i=0; i<BOARD_ROWS; i++)</p><p><b>  {</b></p><p>  for(int j=0; j<BOA

68、RD_COLS; j++)</p><p><b>  {</b></p><p>  if(m_oChessBoard.board[i+1][j+1] == CHESS_BLACK)</p><p><b>  {</b></p><p>  imgdc.SelectObject(&m_b

69、itBlackChess); </p><p>  dc.BitBlt(j*COL_WIDTH+24, i*ROW_WIDTH+24, 39, 39, &imgdc,0,0,SRCCOPY);</p><p><b>  }</b></p><p>  else if(m_oChessBoard.board[i+1][j+1] == C

70、HESS_WHITE)</p><p><b>  {</b></p><p>  imgdc.SelectObject(&m_bitWhiteChess); </p><p>  dc.BitBlt(j*COL_WIDTH+24, i*ROW_WIDTH+24, 39, 39, &imgdc,0,0,SRCCOPY);<

71、/p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  鼠標(biāo)左鍵響應(yīng)函數(shù)</b>&l

72、t;/p><p>  void CChessBoard::OnLButtonDown(UINT nFlags, CPoint point) </p><p><b>  {</b></p><p>  BYTE row = (point.y-22)/ROW_WIDTH+1;</p><p>  BYTE col = (poi

73、nt.x-22)/COL_WIDTH+1;</p><p>  if(do_move_chess(&m_oChessBoard, row*10+col, ~computer_side&3, m_hWnd))</p><p><b>  {</b></p><p>  UINT16 wscore, bscore;</p>

74、;<p>  get_chess_score(&m_oChessBoard, wscore, bscore);</p><p>  GetParent()->SendMessage(UM_RECALC, WPARAM(wscore), LPARAM(bscore)); </p><p>  PostMessage(UM_COMRUN);</p>&

75、lt;p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  MessageBeep(MB_OK);</p><p><b>  }</b></p><

76、p>  CWnd::OnLButtonDown(nFlags, point);</p><p><b>  }</b></p><p>  int CChessBoard::OnCreate(LPCREATESTRUCT lpCreateStruct) </p><p><b>  {</b></p>

77、<p>  if (CWnd::OnCreate(lpCreateStruct) == -1)</p><p>  return -1;</p><p>  EndWaitCursor();</p><p><b>  return 0;</b></p><p><b>  }</b>&l

78、t;/p><p><b>  3、人工智能的實現(xiàn)</b></p><p>  #include "stdafx.h"</p><p>  #include "dataStruct.h"</p><p>  UINT8 computer_side = CHESS_BLACK;<

79、/p><p>  UINT8 max_depth = 4;</p><p>  UINT8 cur_depth = 0;</p><p>  UINT8 cur_step =0;</p><p>  UINT16 step_array[64];</p><p>  UINT8 g_iGameLevel

80、= LEVEL_LOW; //游戲難度等級</p><p>  const UINT8 depth1[]={6, 7, 8};</p><p>  const UINT8 depth2[]={5, 6, 7};</p><p>  INT16 sample_calc_board_status(board_type *board_ptr, UINT8 obcolo

81、r)</p><p><b>  {</b></p><p>  INT16 score=0;</p><p>  UINT8 *ptr = &board_ptr->board[1][1];</p><p>  UINT8 *stop = &board_ptr->board[8][9]; &l

82、t;/p><p>  UINT8 tmpcol = ~obcolor &0x03;</p><p>  while(ptr<stop)</p><p><b>  {</b></p><p>  if(*ptr == obcolor)</p><p><b>  score++

83、;</b></p><p>  else if(*ptr == tmpcol)</p><p><b>  score--;</b></p><p><b>  ptr++;</b></p><p><b>  }</b></p><p> 

84、 return score;</p><p><b>  }</b></p><p>  /*計算棋局board_ptr的狀態(tài)分*/</p><p>  INT16 calc_board_status(board_type *board_ptr, UINT8 obcolor)</p><p><b>  {&l

85、t;/b></p><p>  INT16 score=0;</p><p>  score += scan_horiz_aixes(board_ptr, obcolor);</p><p>  score += scan_vertical_aixes(board_ptr, obcolor);</p><p>  score += s

86、can_bd_aixes(board_ptr, obcolor);</p><p>  score += scan_fd_aixes(board_ptr, obcolor);</p><p>  UINT8 tmpcol = ~obcolor & 0x03 ;</p><p>  if(board_ptr->board[1][1] == tmpcol)

87、</p><p>  score -= 44;</p><p>  if(board_ptr->board[8][8] == tmpcol)</p><p>  score -= 44;</p><p>  if(board_ptr->board[1][8] == tmpcol)</p><p>  sco

88、re -= 44;</p><p>  if(board_ptr->board[8][1] == tmpcol)</p><p>  score -= 44;</p><p>  return score;</p><p><b>  }</b></p><p>  /*從start_pos

89、出發(fā)找到一個可下子的點(diǎn),返回受影響的子的個數(shù),</p><p>  affected_list存放受影響的棋格的指針,第一個指針為落子的點(diǎn)*/</p><p>  const INT16 delta_array[8] = {-11, 11, -9, 9, -1, 1, -10, 10};</p><p>  INT16 find_move(board_type *b

90、oard_ptr, INT16 start_pos, </p><p>  UINT8 obcolor, INT16 *affected_list)</p><p><b>  {</b></p><p>  UINT8 *cel_ptr = board_ptr->board[0] + start_pos;</p><

91、p>  UINT8 *stop_ptr = &board_ptr->board[8][9], *p;</p><p>  INT16 *aff_ptr = affected_list+1, *hold_aff;</p><p>  UINT8 aixes;</p><p>  UINT8 thithercolor = THITHER_COLOR(

92、obcolor);</p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  /*找到一個空格子*/</p><p>  while(*cel_ptr) </p><p>  if(++cel_ptr>=stop_

93、ptr)</p><p><b>  return 0;</b></p><p>  /*檢查在個方向上是否能吃掉對方的棋子,并記錄被吃掉棋子的下標(biāo)*/</p><p>  for(aixes =0;aixes<8; aixes++)</p><p><b>  {</b></p>

94、<p>  hold_aff = aff_ptr;</p><p>  p = cel_ptr + delta_array[aixes];</p><p>  while(*p == thithercolor)</p><p><b>  {</b></p><p>  *aff_ptr++ = p - b

95、oard_ptr->board[0];</p><p>  p+= delta_array[aixes];</p><p><b>  }</b></p><p>  if(*p != obcolor)</p><p>  aff_ptr = hold_aff;</p><p><b&

96、gt;  }</b></p><p>  /*如果cel_ptr對應(yīng)的點(diǎn)可以吃掉對方的子*/</p><p>  if(aff_ptr - affected_list > 1) </p><p><b>  {</b></p><p>  *affected_list = cel_ptr - board

97、_ptr->board[0];</p><p>  return (aff_ptr - affected_list);</p><p><b>  }</b></p><p>  cel_ptr++;</p><p><b>  }</b></p><p><b&

98、gt;  }</b></p><p>  void init_board(board_type *board_ptr)</p><p><b>  {</b></p><p>  memset(board_ptr, 0, sizeof(board_type));</p><p>  /*init boarde

99、r*/</p><p>  memset(board_ptr->board[0], 0xff, 10);</p><p>  memset(board_ptr->board[9], 0xff, 10);</p><p>  for(int i=0; i<9; i++)</p><p><b>  {</b&g

100、t;</p><p>  board_ptr->board[i][0] = board_ptr->board[i][9] =0xff;</p><p><b>  }</b></p><p>  /*init chess*/</p><p>  board_ptr->board[4][4] = boar

101、d_ptr->board[5][5] = CHESS_WHITE;</p><p>  board_ptr->board[4][5] = board_ptr->board[5][4] = CHESS_BLACK;</p><p>  cur_step = 0;</p><p>  computer_side = CHESS_WHITE;</p

102、><p><b>  } </b></p><p>  /*從棋盤的一個狀態(tài)出發(fā),擴(kuò)展此結(jié)點(diǎn),并返回此結(jié)點(diǎn)的部分回溯值*/</p><p>  void extend_node_one(tree_node_type *node_ptr, tree_node_type *parent_ptr,UINT8 obcolor)</p>&

103、lt;p><b>  {</b></p><p>  tree_node_type childnode;</p><p>  INT16 affected_list[MAX_AFFECTED_PIECES];</p><p>  INT16 start_pos = 11, num;</p><p>  num =

104、find_move(&node_ptr->board, start_pos, obcolor, affected_list);</p><p>  /*如果是終局狀態(tài),則返回狀態(tài)估值函數(shù)的值*/</p><p>  if(++cur_depth == max_depth || num==0 )</p><p><b>  {</b>

105、;</p><p>  /*如果已方PASS但沒到棋局結(jié)束,要扣分*/</p><p>  node_ptr->value = calc_board_status(&node_ptr->board, computer_side);</p><p><b>  if(!num)</b></p><p>

106、<b>  {</b></p><p>  /*如果雙方都沒棋下*/</p><p>  if(!find_move(&node_ptr->board, 11, ~obcolor&0x03, affected_list)) </p><p><b>  return;</b></p>&

107、lt;p>  if(obcolor == computer_side)</p><p><b>  {</b></p><p>  node_ptr->value -= 15;</p><p><b>  return ;</b></p><p><b>  }</b&g

108、t;</p><p>  node_ptr->value += 15;</p><p><b>  }</b></p><p>  return; </p><p><b>  }</b></p><p>  /*初始化回溯值*/ </p><

109、;p>  node_ptr->value = (obcolor == computer_side)? -INITIAL_VALUE : INITIAL_VALUE;</p><p>  memcpy(&childnode.board, &node_ptr->board, sizeof(board_type));</p><p>  while(num)&l

110、t;/p><p><b>  {</b></p><p>  while(num--)</p><p>  childnode.board.board[0][affected_list[num]] = obcolor;</p><p>  /*遞歸計算部分回溯值*/</p><p>  UINT8 d

111、epth = cur_depth;</p><p>  extend_node_one(&childnode, node_ptr, (~obcolor)&0x03);</p><p>  cur_depth = depth;</p><p>  /*如果此結(jié)點(diǎn)是棋手一方,則部分回溯值是子結(jié)點(diǎn)中最大的一個*/</p><p> 

112、 if(obcolor == computer_side)</p><p><b>  {</b></p><p>  if(childnode.value > node_ptr->value)</p><p><b>  {</b></p><p>  node_ptr->val

113、ue = childnode.value; </p><p>  node_ptr->movepos = affected_list[0];</p><p><b>  }</b></p><p><b>  }</b></p><p>  /*如果是對手一方,部分回溯值是子結(jié)點(diǎn)中最小的一個*

114、/ </p><p><b>  else</b></p><p><b>  {</b></p><p>  if(childnode.value < node_ptr->value)</p><p><b>  {</b></p><p>

115、;  node_ptr->value = childnode.value;</p><p>  node_ptr->movepos = affected_list[0];</p><p><b>  }</b></p><p><b>  }</b></p><p>  /* α-β裁減

116、的判斷 在考慮輪到棋手下棋的一個親節(jié)點(diǎn)及輪到對手下棋的一個子節(jié)點(diǎn)時,</p><p>  如果該子節(jié)點(diǎn)的數(shù)值已經(jīng)小于或等于其親節(jié)點(diǎn)的回溯值,</p><p>  那么就不需要對該節(jié)點(diǎn)或者其后續(xù)節(jié)點(diǎn)做更多的處理了。</p><p>  計算的過程可以直接返回到親節(jié)點(diǎn)上。</p><p><b>  */</b></

117、p><p>  /*在考慮輪到對手下棋的一個親節(jié)點(diǎn)及輪到棋手下棋的一個子節(jié)點(diǎn)時,</p><p>  如果該子節(jié)點(diǎn)的部分回溯值已經(jīng)大于或等于其親節(jié)點(diǎn)的部分回溯值,</p><p>  那么就不需要對該子節(jié)點(diǎn)或者其后裔節(jié)點(diǎn)做更多的處理了。</p><p>  計算過程可以直接返回到親節(jié)點(diǎn)上。*/</p><p>  if(p

118、arent_ptr)</p><p><b>  {</b></p><p>  if(obcolor != computer_side)</p><p><b>  {</b></p><p><b>  /*α裁減*/</b></p><p>  i

119、f(node_ptr->value <= parent_ptr->value)</p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {&

120、lt;/b></p><p><b>  /*β裁減*/</b></p><p>  if(node_ptr->value >= parent_ptr->value)</p><p><b>  return;</b></p><p><b>  }</b&g

121、t;</p><p><b>  }</b></p><p>  /*找到下一個可落子的點(diǎn)*/</p><p>  start_pos = affected_list[0]+1;</p><p>  memcpy(&childnode.board, &node_ptr->board, sizeof(

122、board_type));</p><p>  num = find_move(&childnode.board, start_pos, obcolor, affected_list);</p><p><b>  }</b></p><p><b>  return;</b></p><p&g

123、t;<b>  }</b></p><p>  void extend_node_two(tree_node_type *node_ptr, tree_node_type *parent_ptr,UINT8 obcolor)</p><p><b>  {</b></p><p>  tree_node_type chil

124、dnode;</p><p>  INT16 affected_list[MAX_AFFECTED_PIECES];</p><p>  INT16 start_pos = 11, num;</p><p>  num = find_move(&node_ptr->board, start_pos, obcolor, affected_list);&l

125、t;/p><p>  /*如果是終局狀態(tài),則返回狀態(tài)估值函數(shù)的值*/</p><p><b>  if(!num)</b></p><p><b>  {</b></p><p>  /*如果已方PASS但沒到棋局結(jié)束,要扣分*/</p><p>  node_ptr->v

126、alue = sample_calc_board_status(&node_ptr->board, computer_side);</p><p>  /*如果雙方都沒棋下*/</p><p>  if(!find_move(&node_ptr->board, 11, ~obcolor&0x03, affected_list)) </p>

127、<p><b>  return;</b></p><p>  if(obcolor == computer_side)</p><p><b>  {</b></p><p>  node_ptr->value -= 10;</p><p><b>  return;&l

128、t;/b></p><p><b>  }</b></p><p>  node_ptr->value += 10;</p><p><b>  return;</b></p><p><b>  }</b></p><p>  /*初始化回

129、溯值*/ </p><p>  node_ptr->value = (obcolor == computer_side)? -INITIAL_VALUE : INITIAL_VALUE;</p><p>  memcpy(&childnode.board, &node_ptr->board, sizeof(board_type));</p><

130、;p>  while(num)</p><p><b>  {</b></p><p>  while(num--)</p><p>  childnode.board.board[0][affected_list[num]] = obcolor;</p><p>  /*遞歸計算部分回溯值*/</p>

131、<p>  UINT8 depth = cur_depth;</p><p>  extend_node_two(&childnode, node_ptr, (~obcolor)&0x03);</p><p>  cur_depth = depth;</p><p>  /*如果此結(jié)點(diǎn)是棋手一方,則部分回溯值是子結(jié)點(diǎn)中最大的一個*/&l

132、t;/p><p>  if(obcolor == computer_side)</p><p><b>  {</b></p><p>  if(childnode.value > node_ptr->value)</p><p><b>  {</b></p><p&g

133、t;  node_ptr->value = childnode.value; </p><p>  node_ptr->movepos = affected_list[0];</p><p><b>  }</b></p><p><b>  }</b></p><p>  /*如果是對

134、手一方,部分回溯值是子結(jié)點(diǎn)中最小的一個*/ </p><p><b>  else</b></p><p><b>  {</b></p><p>  if(childnode.value < node_ptr->value)</p><p><b>  {</b>

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論