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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

5、t;  關鍵詞:c++編程;windows編程;MFC技術</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è)設計的目的及要求………………………………………………………………2</p><p>  2.1畢業(yè)設計的目

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

23、圖)</p><p><b>  3.程序結果</b></p><p>  人執(zhí)黑棋,電腦執(zhí)白棋,輪流走棋,每方都試圖在游戲結束前讓自己棋子的數目多于對方。按鼠標左鍵可以擺放棋子。下到最后誰的棋子多,誰贏。</p><p>  3.3 程序源代碼及注釋</p><p>  1、游戲對話框中控件的設置</p>

24、<p>  消息與成員函數映射:</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>  幫助控件的實現:</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>  “低”空間的實現:</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>  “中”控件的實現:&

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>  “高”控件的實現:</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>  游戲開始控件的實現:</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、棋盤窗口的設計<

35、;/b></p><p>  CChessBoard類的構造函數:</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>  消息與成員與函數映射:</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>  延時函數:</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>  改變棋子接口函數</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>  窗口建立函數</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>  {//把棋子從白面向黑面翻轉</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>  {//把棋子從黑面向白面翻轉

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>  窗口繪圖函數</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>  鼠標左鍵響應函數</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、人工智能的實現</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ā)找到一個可下子的點,返回受影響的子的個數,</p><p>  affected_list存放受影響的棋格的指針,第一個指針為落子的點*/</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>  /*檢查在個方向上是否能吃掉對方的棋子,并記錄被吃掉棋子的下標*/</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對應的點可以吃掉對方的子*/</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ā),擴展此結點,并返回此結點的部分回溯值*/</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)估值函數的值*/</p><p>  if(++cur_depth == max_depth || num==0 )</p><p><b>  {</b>

105、;</p><p>  /*如果已方PASS但沒到棋局結束,要扣分*/</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>  /*如果此結點是棋手一方,則部分回溯值是子結點中最大的一個*/</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>  /*如果是對手一方,部分回溯值是子結點中最小的一個*

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é)點及輪到對手下棋的一個子節(jié)點時,</p><p>  如果該子節(jié)點的數值已經小于或等于其親節(jié)點的回溯值,</p><p>  那么就不需要對該節(jié)點或者其后續(xù)節(jié)點做更多的處理了。</p><p>  計算的過程可以直接返回到親節(jié)點上。</p><p><b>  */</b></

117、p><p>  /*在考慮輪到對手下棋的一個親節(jié)點及輪到棋手下棋的一個子節(jié)點時,</p><p>  如果該子節(jié)點的部分回溯值已經大于或等于其親節(jié)點的部分回溯值,</p><p>  那么就不需要對該子節(jié)點或者其后裔節(jié)點做更多的處理了。</p><p>  計算過程可以直接返回到親節(jié)點上。*/</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>  /*找到下一個可落子的點*/</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)估值函數的值*/</p><p><b>  if(!num)</b></p><p><b>  {</b></p><p>  /*如果已方PASS但沒到棋局結束,要扣分*/</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>  /*如果此結點是棋手一方,則部分回溯值是子結點中最大的一個*/&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、手一方,部分回溯值是子結點中最小的一個*/ </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)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論