

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 分類(lèi)號(hào): </p><p> 黑白棋游戲設(shè)計(jì)與開(kāi)發(fā)</p><p> 系 院 名 稱(chēng) </p><p> 指 導(dǎo) 老 師 </p><p> 學(xué) 生 姓 名 </p><p>
2、學(xué) 生 學(xué) 號(hào) </p><p> 專(zhuān) 業(yè)、班 級(jí) </p><p> 提 交 時(shí) 間 </p><p><b> 畢業(yè)論文任務(wù)書(shū)</b></p><p><b> 畢業(yè)論文開(kāi)題報(bào)告</b></p><p>
3、;<b> 黑白棋游戲設(shè)計(jì)</b></p><p> 摘要:本次畢業(yè)設(shè)計(jì)是基于c++語(yǔ)言,在vs2005平臺(tái)上進(jìn)行的單機(jī)版游戲開(kāi)發(fā),通過(guò)本次游戲的開(kāi)發(fā),有益于進(jìn)一步掌握對(duì)c++語(yǔ)言的應(yīng)用,加深對(duì)計(jì)算機(jī)游戲的制作理念的理解,對(duì)我今后參與更加復(fù)雜的游戲項(xiàng)目積累寶貴的經(jīng)驗(yàn)!</p><p> 黑白棋(Reversi、Othello),也叫蘋(píng)果棋,翻轉(zhuǎn)棋,是一個(gè)經(jīng)典的策
4、略性游戲。黑白棋是19世紀(jì)末英國(guó)人發(fā)明的。直到上個(gè)世紀(jì)70年代一個(gè)日本人將其發(fā)展,借用莎士比亞名劇奧賽羅(Othello)為這個(gè)游戲重新命名,也就是現(xiàn)在大家玩的黑白棋。為何借用莎士比亞名劇呢?是因?yàn)閵W賽羅是莎士比亞一個(gè)名劇的男主角。他是一個(gè)黑人,妻子是白人,因受小人挑撥,懷疑妻子不忠一直情海翻波,最終親手把妻子殺死。后來(lái)真相大白,奧賽羅懊悔不已,自殺而死。黑白棋就是借用這個(gè)黑人白人斗爭(zhēng)的故事而命名。</p><p&g
5、t; 關(guān)鍵詞:c++編程;windows編程;MFC技術(shù)</p><p><b> 論文目錄</b></p><p> 第一章 引言………………………………………………………………………………………1</p><p> 1.1 c++簡(jiǎn)介……………………………………………………………………………………… 1</p><
6、;p> 1.2 window編程介紹…………………………………………………………………………… 1</p><p> 1.3 Visual studio開(kāi)發(fā)平臺(tái)簡(jiǎn)介……………………………………………………………… 1</p><p> 第二章 畢業(yè)業(yè)設(shè)計(jì)的目的及要求………………………………………………………………2</p><p> 2.1畢業(yè)設(shè)計(jì)的目
7、的………………………………………………………………………………2</p><p> 2.2畢業(yè)設(shè)計(jì)的開(kāi)發(fā)環(huán)境…………………………………………………………………………2</p><p> 2.3畢業(yè)設(shè)計(jì)所需的知識(shí)…………………………………………………………………………2</p><p> 2.4畢業(yè)設(shè)計(jì)要求…………………………………………………………………………
8、………2</p><p> 畢業(yè)設(shè)計(jì)的內(nèi)容…………………………………………………………………………3</p><p> 3.1程序功能介紹…………………………………………………………………………………3</p><p> 3.2程序整體設(shè)計(jì)說(shuō)明……………………………………………………………………………4</p><p> 3.3程序源
9、代碼及注釋……………………………………………………………………………7</p><p> 第四章 結(jié)束語(yǔ)……………………………………………………………………………………23</p><p><b> 第一章 引言</b></p><p> 1.1 c++語(yǔ)言介紹</p><p> C++這個(gè)詞在中國(guó)大陸的程序員圈
10、子中通常被讀做“C加加”,而西方的程序員通常讀做“C plus plus”,“CPP”。 它是一種使用非常廣泛的計(jì)算機(jī)編程語(yǔ)言。C++是一種靜態(tài)數(shù)據(jù)類(lèi)型檢查的,支持多重編程范式的通用程序設(shè)計(jì)語(yǔ)言。它支持過(guò)程化程序設(shè)計(jì)、數(shù)據(jù)抽象、面向?qū)ο蟪绦蛟O(shè)計(jì)、制作圖標(biāo)等等泛型程序設(shè)計(jì)等多種程序設(shè)計(jì)風(fēng)格。</p><p> 1.2 windows編程介紹</p><p> Windows是微軟推出的圖
11、形界面的操作系統(tǒng),有windows2000、XP、Vista、win7等各種版本。是一種搶占式多任務(wù)的操作系統(tǒng),是PC上的主流操作系統(tǒng),在PC操作市場(chǎng)占絕大多數(shù)網(wǎng)絡(luò)游戲的客戶(hù)端、服務(wù)器端都可在上運(yùn)行。</p><p> Windows程序由一個(gè)或多個(gè)的窗口組成,通常是多個(gè)窗口。窗口一般是一個(gè)矩形的區(qū)域,由windows對(duì)窗口進(jìn)行統(tǒng)一管理。任何的文字、圖形都寫(xiě)窗口中顯示。</p><p>
12、 windows 系統(tǒng)設(shè)計(jì)為事件驅(qū)動(dòng)的操作系統(tǒng),事件在windows定義為消息,消息為應(yīng)用程序和應(yīng)用程序間、應(yīng)用程序和操作系統(tǒng)間提供了信息傳遞的渠道。消息隊(duì)列,由Windows維持。</p><p> 1.3 Visual studio開(kāi)發(fā)平臺(tái)簡(jiǎn)介</p><p> Visual Studio是微軟公司推出的開(kāi)發(fā)環(huán)境,visual Studio可以用來(lái)應(yīng)用創(chuàng)建windows平臺(tái)下的w
13、indows程序和網(wǎng)絡(luò)應(yīng)用程序,也可以用來(lái)創(chuàng)建網(wǎng)絡(luò)服務(wù)、智能設(shè)備應(yīng)用程序和Office插件。目前已經(jīng)開(kāi)發(fā)到10.0版本,也就是Visual Studio 2010.我們本次畢業(yè)設(shè)計(jì)的開(kāi)發(fā)平臺(tái)就是其中的Visual Studio 2005。</p><p> 第二章 畢業(yè)設(shè)計(jì)的目的與要求</p><p> 2.1 畢業(yè)設(shè)計(jì)的目的</p><p> 通過(guò)對(duì)黑白棋
14、游戲規(guī)則的研究,做出一款適合在windows系統(tǒng)下進(jìn)行人機(jī)對(duì)弈的黑白棋程序出來(lái),是本課題的研究總目標(biāo)。</p><p> 具體需要研究一下幾方面:</p><p> 1.黑白棋游戲規(guī)則;</p><p> 2.黑白棋游戲技巧;</p><p> 3.友好的用戶(hù)界面;</p><p> 4.單人模式的人工智能算
15、法;</p><p> 5.黑白棋游戲的常用功能(難度選擇)。</p><p> 2.2 畢業(yè)設(shè)計(jì)的開(kāi)發(fā)環(huán)境</p><p> 開(kāi)發(fā)語(yǔ):c++語(yǔ)言;</p><p> 開(kāi)發(fā)平臺(tái):windows操作系統(tǒng)中的vs2005平臺(tái)。</p><p> 2.3 畢業(yè)設(shè)計(jì)所需的知識(shí)</p><p>
16、 熟悉c++語(yǔ)言及vs2005開(kāi)發(fā)平臺(tái)。</p><p> 2.4 畢業(yè)設(shè)計(jì)要求</p><p> 1. 分析畢業(yè)設(shè)計(jì)題目的要求</p><p> 2. 寫(xiě)出詳細(xì)設(shè)計(jì)說(shuō)明</p><p> 3. 編寫(xiě)程序代碼,調(diào)試程序使其能正確運(yùn)行</p><p> 4. 設(shè)計(jì)完成的軟件要便于操作和使用。</p>
17、;<p> 第三章 畢業(yè)設(shè)計(jì)的內(nèi)容</p><p><b> 3.1程序功能介紹</b></p><p> 1.顯示游戲的界面功能</p><p> 游戲界面上包括游戲等級(jí)選擇、重新開(kāi)始、游戲幫助的控件對(duì)游戲進(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> 無(wú)論是電腦或是玩家在棋盤(pán)中落下棋子后,能夠根據(jù)游戲的規(guī)則,把橫向、縱向及對(duì)角直線(xiàn)上的棋子全部翻轉(zhuǎn)過(guò)來(lái),變成最后落下棋子的顏色,并對(duì)棋子數(shù)量進(jìn)行增減。</p><p> 4.游戲勝負(fù)判斷功能</p><p>
19、 雙方都沒(méi)有棋子可下時(shí)棋局結(jié)束,以棋子數(shù)目來(lái)計(jì)算勝負(fù),棋子多的一方獲勝。在棋盤(pán)還沒(méi)下滿(mǎn)時(shí),如果一方的棋子應(yīng)經(jīng)被對(duì)方吃光,則棋局結(jié)束。將對(duì)手棋子吃光的一方獲勝。</p><p> 5.實(shí)現(xiàn)人機(jī)對(duì)戰(zhàn)模式</p><p> 支持人工智能,根據(jù)游戲等級(jí)的不同,進(jìn)行不同的算法深度搜索,找出最合理的位置進(jìn)行落子操作。</p><p> 6.人工智能的等級(jí)設(shè)置</p&
20、gt;<p> 能夠指定當(dāng)前電腦人工智能的等級(jí)。根據(jù)不同的等級(jí),其算法搜索深度不同。</p><p> 7.游戲提供幫助說(shuō)明</p><p> 在游戲界面中,提供一個(gè)控件。以方便對(duì)本游戲不了解的玩家對(duì)游戲進(jìn)行操作和使用。</p><p><b> 黑白棋功能架構(gòu):</b></p><p> 3.2
21、程序整體設(shè)計(jì)說(shuō)明</p><p><b> 1.設(shè)計(jì)思路</b></p><p> 本游戲設(shè)計(jì)是采用MFC對(duì)話(huà)框模式進(jìn)行設(shè)計(jì)開(kāi)發(fā)。所以從此游戲設(shè)計(jì)采用模塊化思想,即程序整體設(shè)計(jì)分為五個(gè)模塊來(lái)實(shí)現(xiàn)。</p><p> 主界面對(duì)話(huà)框類(lèi):主要負(fù)責(zé)主界面及棋盤(pán)、棋子的顯示及棋盤(pán)窗口對(duì)象的創(chuàng)建和調(diào)用。</p><p> 棋
22、盤(pán)窗口類(lèi):主要負(fù)責(zé)接受玩家鼠標(biāo)輸入的棋子位置及棋子翻轉(zhuǎn)動(dòng)畫(huà)等 處理。</p><p> 人工智能算法類(lèi):主要負(fù)責(zé)電腦的人工智能算法的處理。</p><p> 規(guī)則處理類(lèi):主要負(fù)責(zé)棋子數(shù)據(jù)的統(tǒng)計(jì)、落子位置有效及勝負(fù)判斷等處理。</p><p> 幫助對(duì)話(huà)框類(lèi):主要負(fù)責(zé)幫助提示的顯示及其他輔助消息。</p><p> 2.程序結(jié)構(gòu)(流程
23、圖)</p><p><b> 3.程序結(jié)果</b></p><p> 人執(zhí)黑棋,電腦執(zhí)白棋,輪流走棋,每方都試圖在游戲結(jié)束前讓自己棋子的數(shù)目多于對(duì)方。按鼠標(biāo)左鍵可以擺放棋子。下到最后誰(shuí)的棋子多,誰(shuí)贏。</p><p> 3.3 程序源代碼及注釋</p><p> 1、游戲?qū)υ?huà)框中控件的設(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> 幫助控件的實(shí)現(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> “低”空間的實(shí)現(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> “中”控件的實(shí)現(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> “高”控件的實(shí)現(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> 游戲開(kāi)始控件的實(shí)現(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、棋盤(pán)窗口的設(shè)計(jì)<
35、;/b></p><p> CChessBoard類(lèi)的構(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í)函數(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> 播放棋子翻動(dòng)動(dòng)畫(huà)</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、人工智能的實(shí)現(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; //游戲難度等級(jí)</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> /*計(jì)算棋局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ā)找到一個(gè)可下子的點(diǎn),返回受影響的子的個(gè)數(shù),</p><p> affected_list存放受影響的棋格的指針,第一個(gè)指針為落子的點(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> /*找到一個(gè)空格子*/</p><p> while(*cel_ptr) </p><p> if(++cel_ptr>=stop_
93、ptr)</p><p><b> return 0;</b></p><p> /*檢查在個(gè)方向上是否能吃掉對(duì)方的棋子,并記錄被吃掉棋子的下標(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對(duì)應(yīng)的點(diǎn)可以吃掉對(duì)方的子*/</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> /*從棋盤(pán)的一個(gè)狀態(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但沒(méi)到棋局結(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> /*如果雙方都沒(méi)棋下*/</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> /*遞歸計(jì)算部分回溯值*/</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)中最大的一個(gè)*/</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> /*如果是對(duì)手一方,部分回溯值是子結(jié)點(diǎn)中最小的一個(gè)*
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、的判斷 在考慮輪到棋手下棋的一個(gè)親節(jié)點(diǎn)及輪到對(duì)手下棋的一個(gè)子節(jié)點(diǎn)時(shí),</p><p> 如果該子節(jié)點(diǎn)的數(shù)值已經(jīng)小于或等于其親節(jié)點(diǎn)的回溯值,</p><p> 那么就不需要對(duì)該節(jié)點(diǎn)或者其后續(xù)節(jié)點(diǎn)做更多的處理了。</p><p> 計(jì)算的過(guò)程可以直接返回到親節(jié)點(diǎn)上。</p><p><b> */</b></
117、p><p> /*在考慮輪到對(duì)手下棋的一個(gè)親節(jié)點(diǎn)及輪到棋手下棋的一個(gè)子節(jié)點(diǎn)時(shí),</p><p> 如果該子節(jié)點(diǎn)的部分回溯值已經(jīng)大于或等于其親節(jié)點(diǎn)的部分回溯值,</p><p> 那么就不需要對(duì)該子節(jié)點(diǎn)或者其后裔節(jié)點(diǎn)做更多的處理了。</p><p> 計(jì)算過(guò)程可以直接返回到親節(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> /*找到下一個(gè)可落子的點(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但沒(méi)到棋局結(jié)束,要扣分*/</p><p> node_ptr->v
126、alue = sample_calc_board_status(&node_ptr->board, computer_side);</p><p> /*如果雙方都沒(méi)棋下*/</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> /*遞歸計(jì)算部分回溯值*/</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)中最大的一個(gè)*/&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> /*如果是對(duì)
134、手一方,部分回溯值是子結(jié)點(diǎn)中最小的一個(gè)*/ </p><p><b> else</b></p><p><b> {</b></p><p> if(childnode.value < node_ptr->value)</p><p><b> {</b>
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 黑白棋游戲設(shè)計(jì)與開(kāi)發(fā)畢業(yè)論文
- 黑白棋游戲畢業(yè)論文
- 黑白棋游戲畢業(yè)設(shè)計(jì)
- 基于qt的黑白棋游戲開(kāi)發(fā)(論文)
- 黑白棋游戲課程設(shè)計(jì)
- 基于qt的黑白棋游戲
- vb黑白棋游戲課程設(shè)計(jì)報(bào)告
- c語(yǔ)言課程設(shè)計(jì)---黑白棋游戲
- c語(yǔ)言課程設(shè)計(jì)--黑白棋游戲
- 黑白棋游戲數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 基于Alpha-Btea剪枝算法的黑白棋游戲的設(shè)計(jì)與開(kāi)發(fā).pdf
- 基于java me的黑白棋游戲設(shè)計(jì)及實(shí)現(xiàn)畢業(yè)設(shè)計(jì)
- 基于java me的黑白棋游戲設(shè)計(jì)及實(shí)現(xiàn)畢業(yè)設(shè)計(jì)
- 基于Qt的黑白棋游戲(終稿).doc
- c語(yǔ)言程序設(shè)計(jì)課程設(shè)計(jì)(論文)-黑白棋
- c語(yǔ)言課程設(shè)計(jì)報(bào)告--黑白棋
- 畢業(yè)設(shè)計(jì)----黑白棋子的識(shí)別與分揀輸送裝置的設(shè)計(jì)
- 嵌入式wince課程設(shè)計(jì)報(bào)告(黑白棋)
- 計(jì)算機(jī)技術(shù)基礎(chǔ)課程設(shè)計(jì)---黑白棋
- 黑白棋盤(pán)網(wǎng)格中的直線(xiàn)檢測(cè)方法研究.pdf
評(píng)論
0/150
提交評(píng)論