具有人工智能的黑白棋對戰(zhàn)平臺設(shè)計與開發(fā)_第1頁
具有人工智能的黑白棋對戰(zhàn)平臺設(shè)計與開發(fā)_第2頁
具有人工智能的黑白棋對戰(zhàn)平臺設(shè)計與開發(fā)_第3頁
具有人工智能的黑白棋對戰(zhàn)平臺設(shè)計與開發(fā)_第4頁
具有人工智能的黑白棋對戰(zhàn)平臺設(shè)計與開發(fā)_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

題目具有人工智能的黑白棋對戰(zhàn)平臺設(shè)計與開發(fā)摘要本程序采用微軟基礎(chǔ)類MFC庫及其開發(fā)工具VisualC++開發(fā),能運行于Windows系統(tǒng)環(huán)境下的黑白棋對戰(zhàn)平臺。該程序帶有人機(jī)對弈功能,其中人工智能的等級可以調(diào)節(jié)。本論文首先指出了黑白棋游戲的規(guī)則簡介、Windows桌面環(huán)境、VisualC++集成開發(fā)工具的使用、黑白棋程序的需求分析。然后寫了黑白棋程序的界面設(shè)計、規(guī)則設(shè)計、算法設(shè)計等,重點放在人工智慧模塊的實現(xiàn)上。最后介紹了人工智能的未來。本設(shè)計通過一個黑白棋游戲的開發(fā),闡述人工智能的實現(xiàn)方法,也介紹了Windows圖形用戶界面的設(shè)計和利用MFC開發(fā)軟件的方法。關(guān)鍵詞人工智能黑白棋人機(jī)對弈C++TitleOthelloBattlePlatformDesignAndDevelopmentOfArtificialIntelligenceTitleAbstractThisprogramusestheMicrosoftFoundationClasseslibraryanditsdevelopmenttools,VisualC++,abletorunintheWindowssystemenvironment.Theprogramhaveatheman-machinechessmodule,inwhichthelevelofartificialintelligencecanbeadjusted.ThispaperfirstpointsouttheOthellogamerules,Windowsdesktopenvironment,theuseofVisualC++integrateddevelopmenttool,theanalysisofOthelloprogramneeds.AndthenwriteOthelloprograminterfacedesign,designofrules,algorithmdesign,andfocusontherealizationoftheartificialintelligencemodule.Finally,wewilllookforwardtothefutureoftheartificialintelligence.ThispaperillustratetheimplementationoftheartificialintelligencethroughthedevelopmentofanOthellogame,andalsointroducedtheWindowsgraphicaluserinterfacedesignandtheuseofMFC.KeywordsartificialintelligenceOthelloman-machinechessC++目錄TOC\o"1-5"\h\z\o"CurrentDocument"前言1\o"CurrentDocument"1.1黑白棋開發(fā)背景1\o"CurrentDocument"1.2黑白棋游戲簡介1\o"CurrentDocument"1.2.1黑白棋規(guī)則1\o"CurrentDocument"1.2.2黑白棋戰(zhàn)術(shù)分析2\o"CurrentDocument"1.3相關(guān)實現(xiàn)環(huán)境21.3.1開發(fā)環(huán)境21.3.2運行環(huán)境21.3.3硬件環(huán)境2\o"CurrentDocument"1.4主要研究內(nèi)容2\o"CurrentDocument"1.5系統(tǒng)開發(fā)的現(xiàn)實意義3\o"CurrentDocument"VISUALC++集成開發(fā)環(huán)境4\o"CurrentDocument"VisualC++簡介4\o"CurrentDocument"VisualC++開發(fā)工具的特點4\o"CurrentDocument"VisualC++開發(fā)工具與MFC4\o"CurrentDocument"2.2使用VisualC++開發(fā)工具5\o"CurrentDocument"2.2.1VisualC++開發(fā)工具的主界面52.2.2使用向?qū)?chuàng)建項目5創(chuàng)建一個HelloWorld程序6\o"CurrentDocument"2.3總結(jié)9\o"CurrentDocument"黑白棋需求分析10\o"CurrentDocument"3.1項目需求分析103.1.1黑白棋操作方法103.1.2黑白棋的基本規(guī)則103.1.3游戲應(yīng)具有的功能10\o"CurrentDocument"3.2項目可行性分析11\o"CurrentDocument"黑白棋程序設(shè)計12\o"CurrentDocument"4.1總體設(shè)計124.1.1黑白棋的功能框架124.1.2類結(jié)構(gòu)設(shè)計12\o"CurrentDocument"4.2界面設(shè)計134.2.1游戲主界面設(shè)計134.2.2游戲菜單結(jié)構(gòu)設(shè)計13\o"CurrentDocument"黑白棋程序?qū)崿F(xiàn)15\o"CurrentDocument"5.1黑白棋游戲界面的實現(xiàn)155.1.1游戲菜單的實現(xiàn)15\o"CurrentDocument"5.1.2游戲幫助對話框的實現(xiàn)17\o"CurrentDocument"5.2黑白棋游戲的核心算法的設(shè)計與實現(xiàn)195.2.1黑白棋游戲的核心算法的設(shè)計195.2.2黑白棋游戲的核心算法的實現(xiàn)19\o"CurrentDocument"人工智能模塊25\o"CurrentDocument"6.1人工智能模塊法的設(shè)計256.1.1終局狀態(tài)256.1.2博弈樹的構(gòu)造方法256.1.3構(gòu)造過程的a-6裁減256.1.4棋局的狀態(tài)估值函數(shù)266.1.5判斷棋子是否受保護(hù)266.1.6狀態(tài)分的計分方法266.1.7棋盤的數(shù)據(jù)結(jié)構(gòu)27\o"CurrentDocument"6.2人工智能模塊法的實現(xiàn)27\o"CurrentDocument"系統(tǒng)測試367.1主菜單和界面顯示功能的測試367.2悔棋功能的測試367.3棋子翻轉(zhuǎn)功能的測試377.4游戲勝負(fù)判斷功能的測試377.5幫助功能的測試38\o"CurrentDocument"總結(jié)39\o"CurrentDocument"參考文獻(xiàn)411.前言1.1黑白棋開發(fā)背景隨著計算機(jī)技術(shù)的日新月異,計算機(jī)的運算速度不僅變得更加的快,也變得更加的智能。利用計算機(jī)資源來實現(xiàn)原本人類才有的思考過程已經(jīng)成為現(xiàn)實。在過去的30多年中,已經(jīng)建立了一些具有一定“智能”的計算機(jī)程序,例如下棋程序、定理證明系統(tǒng)、集成電路設(shè)計與分析系統(tǒng)、自然語言翻譯系統(tǒng)、智能信息檢索系統(tǒng)、疾病診斷系統(tǒng)等。這些“人工智能”(ArtificialIntelligence,簡稱AI)被運用在人們生活的各個方面。1997年5月11日,超級計算機(jī)深藍(lán)以3勝2負(fù)1平擊敗世界國際象棋棋王卡斯帕羅夫,這標(biāo)志著人工智能已經(jīng)達(dá)到新的高度。通過設(shè)計開發(fā)一套玩棋盤游戲可以研究人工智能的實現(xiàn)過程。而黑白棋是一種常見的適合兩人對弈的棋類游戲,它具有規(guī)則簡單、對弈時間短、趣味性強(qiáng)的特點十分適合本課題研究。因此,本課題選擇開發(fā)一套具有人工智能的黑白棋對戰(zhàn)平臺。1.2黑白棋游戲簡介黑白棋是19世紀(jì)末英國人發(fā)明的。直到上個世紀(jì)70年代一個日本人將其發(fā)展,借用莎士比亞名劇奧賽羅(othello)為這個游戲重新命名,也就是現(xiàn)在大家玩的黑白棋。游戲通過相互翻轉(zhuǎn)對方的棋子,最后以棋盤上誰的棋子多來判斷勝負(fù)。它的游戲規(guī)則簡單,因此上手很容易,但是它的變化又非常復(fù)雜。有一種說法是:只需要幾分鐘學(xué)會它,卻需要一生的時間去精通它。1.2.1黑白棋規(guī)則棋盤共有8行8列共64格。開局時,棋盤正中央的4格先置放黑白相隔的4枚棋子(亦有求變化相鄰放置)。通常黑子先行。雙方輪流落子。只要落子和棋盤上任一枚己方的棋子在一條線上(橫、直、斜線皆可)夾著對方棋子,就能將對方的這些棋子轉(zhuǎn)變?yōu)槲壹悍剑ǚ婕纯桑?。如果在任一位置落子都不能夾住對手的任一顆棋子,就要讓對手下子。當(dāng)雙方皆不能下子時,游戲就結(jié)束,子多的一方勝。1.2.2黑白棋戰(zhàn)術(shù)分析因為黑白棋獨特的規(guī)則,很容易出現(xiàn)雙方比分的劇烈變化,在游戲后期可能僅用幾個回合就將大量對方棋子變成己方,從而扭轉(zhuǎn)局勢。因此,太著眼于比分是沒有必要的,更重要的是占據(jù)有利位置。中間位置的棋子最容易受到夾擊,有橫、直、斜線共四個方向的可能。而邊緣的棋子則只有一個可能被夾擊的方向,四個角落上的位置被占據(jù)后,則完全不可能被攻擊。游戲的后期是關(guān)鍵位置的爭奪,而前期的布局,就是為搶占關(guān)鍵位置作準(zhǔn)備。比如,若不想讓對方占據(jù)棋盤邊緣的有利位置,那么自己就應(yīng)避免在靠近邊緣的那一排落子。1.3相關(guān)實現(xiàn)環(huán)境本程序采用MFC庫及其開發(fā)工具VisualC++,使用C++語言開發(fā)運行于Windows系統(tǒng)環(huán)境下的黑白棋游戲。1.3.1開發(fā)環(huán)境Microsoft?VisualC++6.0(SP6)1.3.2運行環(huán)境Microsoft?Windows7Ultimate1.3.3硬件環(huán)境Intel?Pentium?Mprocessor1.60GHz,1.25G內(nèi)存,40G硬盤1.4主要研究內(nèi)容本課題將對計算機(jī)下黑白棋做一個全面研究,介紹計算機(jī)對黑白棋戰(zhàn)術(shù)分析的全過程,包括對圖形和動畫的處理、對棋盤搜索的算法、對棋局做出正確的估計、并生成最佳走法,并將介紹其中各個流程的研究狀況及實用技術(shù)。本文的重點放在計算機(jī)人工智能(AI)在黑白棋上的運用上,即計算機(jī)對當(dāng)前棋局的分析,并做出最佳的選擇。1.5系統(tǒng)開發(fā)的現(xiàn)實意義利用這次畢業(yè)設(shè)計的機(jī)會可以熟悉c++語言的各種特性,鍛煉程序設(shè)計的實踐能力,熟悉c++語言Windows下的開發(fā)環(huán)境VisualC++,熟悉Windows圖形用戶界面的開發(fā),以及鞏固數(shù)據(jù)結(jié)構(gòu)和算法等課程的學(xué)習(xí)成果,并深入理解數(shù)據(jù)結(jié)構(gòu)和算法在程序設(shè)計中的核心地位。同時,借助開發(fā)本游戲的過程,可以熟悉人工智能的程序?qū)崿F(xiàn),有助于掌握棋類所需人工智能的常見算法,隨著游戲產(chǎn)業(yè)的日益壯大,人工智能在游戲中的突出表現(xiàn),人工智能越來越得到世人的重視。在這次的人機(jī)對戰(zhàn)算法中,通過一定的算法,實現(xiàn)電腦的下棋及走棋運作,加深了對人工智能工作原理的了解。綜上所述,通過每次黑白棋的開發(fā),可以深入了解Windows編程方法、加深了解AI算法。2.VisualC++集成開發(fā)環(huán)境VisualC++簡介VisualC++集成開發(fā)環(huán)境(IDE,IntegratedDevelopmentEnvironment)是用于提供程序開發(fā)環(huán)境的應(yīng)用程序,包括代碼編輯器、編譯器、調(diào)試器和圖形用戶界面工具。集成了代碼編寫功能、分析功能、編譯功能、調(diào)試功能等一體化的開發(fā)軟件服務(wù)套。VisualC++開發(fā)工具的特點VisualC++是Microsoft公司推出的開發(fā)Win32環(huán)境程序,面向?qū)ο蟮目梢暬删幊滔到y(tǒng)。它不但具有程序框架自動生成、靈活方便的類管理、代碼編寫和界面設(shè)計集成交互操作、可開發(fā)多種程序等優(yōu)點,而且通過簡單的設(shè)置就可使其生成的程序框架支持?jǐn)?shù)據(jù)庫接口、OLE2,WinSock網(wǎng)絡(luò)、3D控制界面。它以擁有“語法高亮”,IntelliSense(自動編譯功能)以及高級除錯功能而著稱。比如,它允許用戶進(jìn)行遠(yuǎn)程調(diào)試,單步執(zhí)行等。還有允許用戶在調(diào)試期間重新編譯被修改的代碼,而不必重新啟動正在調(diào)試的程序。其編譯及建置系統(tǒng)以預(yù)編譯頭文件、最小重建功能及累加連結(jié)著稱。這些特征明顯縮短程式編輯、編譯及連結(jié)的時間花費,在大型軟件計劃上尤其顯著。VisualC++開發(fā)工具與MFCVC++是Windows下開發(fā)人員使用的專業(yè)C++SDK(SDK,StandardSoftWareDevelopKit,專業(yè)軟件開發(fā)平臺),MFC就是掛在它之上的一個輔助軟件開發(fā)包,MFC作為與VC++血肉相連的部分,MFC同BC++集成的VCL一樣是一個非外掛式的軟件包,類庫,只不過MFC類是微軟為VC++專配的..MFC是微軟封裝了的API。windows作為一個提供功能強(qiáng)大的應(yīng)用程序接口編程的操作系統(tǒng),的確方便了許多程序員,傳統(tǒng)的win32開發(fā)(直接使用windows的接口函數(shù)API)對于程序員來說非常的困難,因為,API函數(shù)實在太多了,而且名稱很亂,從零構(gòu)架一個窗口動輒就是上百行的代碼。MFC是面向?qū)ο蟪绦蛟O(shè)計與Applicationframework的完美結(jié)合,他將傳統(tǒng)的API進(jìn)行了分類封裝,并且為你創(chuàng)建了程序的一般框架,2.2使用VisualC++開發(fā)工具本文以一個最常用的例子HelloWorld的開發(fā)過程,作為VisualC++編程的入門示例。2.2.1VisualC++開發(fā)工具的主界面啟動VisualC++后,就可以看到如圖所示的主窗口,其中包括了標(biāo)題欄、菜單欄、工具欄、工作區(qū)窗口、輸出窗口、狀態(tài)欄。圖2-1VisualC++開發(fā)工具的操作界面熟悉VisualC++開發(fā)工具的操作界面,有利于以后在使用該開發(fā)工具時提高工作效率。2.2.2使用向?qū)?chuàng)建項目現(xiàn)在就可以使用“創(chuàng)建向?qū)А眮韯?chuàng)建一個空的Windows窗體應(yīng)用程序項目。啟動VisualC++向?qū)У姆椒ㄈ缦拢海?)啟動VisualC++集成開發(fā)環(huán)境。(2)選擇File|New命令,打開New對話框。

(3)選擇Projects標(biāo)簽,進(jìn)入Projects選項卡。在其中選中Win32Application選項。然后在Projectsname中輸入一個名字作為整個項目的名稱。(4)把保存路徑位置設(shè)置為有效路徑。(5)單擊確定按鈕,即可啟動“Win32Application項目創(chuàng)建向?qū)А?。通過VisualC++工具的向?qū)В粌H可以免去了很多復(fù)雜的項目設(shè)置過程,同時還可以提高項目創(chuàng)建的效率,方便項目的管理。圖2-2新建對話框2.2.3創(chuàng)建一個HelloWorld程序現(xiàn)在我們需要創(chuàng)建一個能顯示HelloWorld的窗口應(yīng)用程序項目,創(chuàng)建項目的方法如下。(1)在成功啟動了向?qū)Ш螅x中向?qū)нx項的Anemptyproject項。表示當(dāng)前創(chuàng)建的是一個不包含任何文件的空窗口應(yīng)用程序項目。(2)單擊Finish按鈕,VisualC++就開始Win32窗口應(yīng)用程序項目的創(chuàng)建工作。(3)創(chuàng)建完成后會得到一個項目創(chuàng)建報告,如圖所示。單擊OK按鈕,關(guān)閉報告對話框。

圖2-3Win32Application項目創(chuàng)建向?qū)耂T如皂Win32圖2-3Win32Application項目創(chuàng)建向?qū)耂T如皂Win32Application將會創(chuàng)建一個新的以下格的工程骨架:Anemptyapplicationwillbecreatedforyou.Nofileswillbecreatedoraddedtotheproject工程目錄:C:\Users\Jason\Desktop\V\Hello_World翩定取消I通過前面的方法,可以得到一個只包含應(yīng)用程序框架的項目,其不包含任何源代碼。在VisualC++中,通常的源代碼保存在以CPP為后綴的文件中,這種文件也被稱為源文件?,F(xiàn)在就來給當(dāng)前項目添加一個源文件,并輸入相關(guān)的源代碼,讓其完成前面的要求。添加源文件的方法如下。(1)選擇File|New命令,在New對話框中選擇Files標(biāo)簽,進(jìn)入Files選項卡。(2)選中C++SourceFile項,在File文本框中輸入HelloWorldApp作為C++源文件的名稱,并選中AddtoProject復(fù)選框,如圖所示。圖2-5新建對話框(3)在代碼編輯窗口中輸入代碼。(4)按鍵盤F5鍵以編譯運行程序,最后程序執(zhí)行效果如圖所示。@Hello.World巨亙甚FileHelpHelloWorld!圖2-6HelloWorld運行圖2.3總結(jié)VisualC++簡單易用,它不但具有程序框架自動生成、靈活方便的類管理、代碼編寫和界面設(shè)計集成交互操作、可開發(fā)多種程序等優(yōu)點,而且通過簡單的設(shè)置就可使其生成的程序框架支持?jǐn)?shù)據(jù)庫接口、OLE2,WinSock網(wǎng)絡(luò)、3D控制界面。因而十分適合本次課題開發(fā)。.黑白棋需求分析3.1項目需求分析獲得項目需求并對其進(jìn)行詳細(xì)分析,是項目開始的基礎(chǔ)。只有獲得明確的需求,并做出好的需求分析文檔并得到有效解決,才能保證項目最后的成功。3.1.1黑白棋操作方法玩家把屬于自己顏色的棋子放在棋盤的空格上,而當(dāng)自己放下的棋子在橫、豎、斜八個方向內(nèi)有一個自己的棋子,則被夾在中間的全部棋子翻轉(zhuǎn)為自己顏色的棋子。3.1.2黑白棋的基本規(guī)則(1)兩人對弈,以輪流方式持黑子與白子。(2)開辟新局者持黑子,加入者持白子,之后以輪流方式將棋子置于棋盤格子中。若無地方可下子,則跳過一回,由對方下子。(3)在提示的格子中,選擇一個格子下子,當(dāng)下子的位置與離最近的同色旗子中,若有其他棋子則中間的棋子變?yōu)榕c我方一樣顏色。(4)當(dāng)下滿64個棋子,棋子多者為勝。(5)雙方都無棋可走的其他局面,游戲結(jié)束,以子多者為勝。3.1.3游戲應(yīng)具有的功能(1)能夠顯示主菜單和界面游戲需要提供主菜單讓玩家進(jìn)行游戲設(shè)置,同時能夠顯示當(dāng)前黑白棋子數(shù)量等相關(guān)信息到界面上。(2)能夠接收鼠標(biāo)輸入功能能夠接收玩家的鼠標(biāo)輸入功能,把棋子放到棋盤指定的位置上。(3)能夠根據(jù)規(guī)則翻轉(zhuǎn)相應(yīng)的棋子無論是電腦或者是玩家在棋盤中落下了棋子后,能夠根據(jù)游戲規(guī)則,把橫向、縱向及對角線上的棋子全部翻轉(zhuǎn)過來,變成最后落下棋子的顏色,并對棋子對比數(shù)量進(jìn)行增減。(4)游戲勝負(fù)判斷功能雙方都沒有棋子可以下時棋子結(jié)束,以棋子數(shù)目來計算勝負(fù),棋子多的一方獲勝。在棋盤還沒下滿時,如果一方的棋子已經(jīng)被對方吃光,則棋局也結(jié)束。將對方棋子吃光的一方獲勝。(5)能夠?qū)崿F(xiàn)人機(jī)對戰(zhàn)模式支持人工智能,根據(jù)游戲等級的不同,進(jìn)行不同的算法深度搜索,找出最合理的位置進(jìn)行落子操作。(6)人工智能的等級設(shè)置能夠指定當(dāng)前電腦人工智能的等級。根據(jù)等級的不同,其算法搜索深度不同。(7)游戲悔棋功能游戲中支持玩家的悔棋操作。(8)游戲提供幫助說明在游戲菜單中,提供一個使用說明項。以方便對本游戲不了解的玩家對游戲進(jìn)行操作和使用。3.2項目可行性分析該游戲采用VisualC++開發(fā)軟件在Windows平臺上開發(fā)完成,借用微軟基礎(chǔ)類庫MFC能夠輕易完成全部功能,在技術(shù)上完全可行。而且游戲相對簡單,只需要查看游戲幫助文檔即可開始游戲,所以用戶不需要具備一定的電腦技術(shù)基礎(chǔ)。綜上分析,該項目可行。.黑白棋程序設(shè)計4.1總體設(shè)計本模塊建立在第3章需求分析基礎(chǔ)之上,把用戶的需求轉(zhuǎn)換為程序的藍(lán)圖,作為后面編碼過程中的依據(jù)。4.1.1黑白棋的功能框架程序的框架見圖4-1,該圖表示出了程序功能架構(gòu),也基本表示出了程序的各個模塊和相互關(guān)系,后面的詳細(xì)設(shè)計和代碼實現(xiàn),就是基于本圖設(shè)計的。圖4-1黑白棋的功能框架4.1.2類結(jié)構(gòu)設(shè)計游戲由5個類和一個功能模塊組成,如圖4-2所示。(1)主界面對話框類:主要負(fù)責(zé)主界面及菜單、棋盤、棋子的顯示及窗口類對象的創(chuàng)建和調(diào)用等處理。(2)棋盤窗口類:主要負(fù)責(zé)接受玩家鼠標(biāo)輸入的棋子位置及棋子翻轉(zhuǎn)等處理。(3)規(guī)則處理類:主要負(fù)責(zé)棋子數(shù)據(jù)的統(tǒng)計、落子位置有效及勝負(fù)判斷等處理。(4)人工智能算法類:主要負(fù)責(zé)電腦的人工智能算法處理。(5)背景音樂播放模塊:主要負(fù)責(zé)游戲中背景音樂的播放。(6)幫助對話框類:主要負(fù)責(zé)幫助提示的顯示及其他輔助信息。圖4-2類結(jié)構(gòu)4.2界面設(shè)計4.2.1游戲主界面設(shè)計4.2.2游戲菜單結(jié)構(gòu)設(shè)計黑白棋的游戲菜單結(jié)構(gòu)設(shè)計,如圖4-4所示。

圖4-4游戲菜單結(jié)構(gòu).黑白棋程序?qū)崿F(xiàn)5.1黑白棋游戲界面的實現(xiàn)黑白棋游戲的VisualC++工程采用MFC對話框模式進(jìn)行開發(fā)。5.1.1游戲菜單的實現(xiàn)(1)黑白棋游戲工程的資源中添加一個菜單資源,其屬性如表5-1所示。表5-1菜單資源ID類別說明IDR_MAIN_MENU彈出菜單游戲的主菜單IDR_START_GAME菜單欄開始游戲IDR_EXIT_GAME菜單欄退出游戲IDR_HELP菜單欄幫助IDR_ABOUT菜單欄關(guān)于(2)給每個菜單資源對應(yīng)一個響應(yīng)函數(shù),該函數(shù)映射表由系統(tǒng)自動生成并維護(hù)。代碼5-1函數(shù)映射BEGIN_MESSAGE_MAP(COthelloDlg,CDialog)//((AFX_MSG_MAP(COthelloDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_COMMAND(IDR_ABOUT,OnAbout)ON_COMMAND(IDR_EXIT_GAME,OnExitGame)ON_COMMAND(IDR_GAME_START,OnGameStart)ON_COMMAND(IDR_HELP,OnHelp)ON_BN_CLICKED(IDC_BACK_BTN,OnBackBtn)ON_BN_CLICKED(IDC_BACK_BTN2,OnBackBtn2)//}}AFX_MSG_MAPON_MESSAGE(UM_RECALC,OnRecalc)ENDMESSAGEMAP()菜單響應(yīng)函數(shù)的實現(xiàn),如代碼5-2所示。代碼5-2菜單響應(yīng)函數(shù)voidCOthelloDlg::OnAbout()//(CAboutDlgdlg;//創(chuàng)建關(guān)于對話框類對象dlg.DoModal();//彈出關(guān)于對話框}voidCOthelloDlg::OnExitGame()//(CDialog::OnCancel();〃調(diào)用基類退出函數(shù)}voidCOthelloDlg::OnGameStart()//(GameStart();〃調(diào)用游戲開始接口函數(shù)}voidCOthelloDlg::OnHelp()//(CHelpDlgdlg;〃創(chuàng)建幫助對話框類對象dlg.DoModal();//彈出幫助對話框}按鍵響應(yīng)函數(shù)的實現(xiàn),如代碼5-3所示。代碼5-3按鍵響應(yīng)函數(shù)voidCOthelloDlg::OnBackBtn()//(m_chess.MoveBack();〃調(diào)用悔棋接口函數(shù)}voidCOthelloDlg::OnBackBtn2()//(m_chess.NewGame();〃調(diào)用新游戲接口函數(shù),}給主界面窗體類添加OnRecalc()函數(shù)代碼,如代碼5-4所示。實現(xiàn)黑白棋的棋子數(shù)顯示以及“黑方行動”“白方行動”的指示標(biāo)語。代碼5-4OnRecalc()函數(shù)voidCOthelloDlg::OnRecalc(WPARAMwParam,LPARAMlParam)(CStringstrStatus;CStringstrCount;

if(wParam&0x80000000)//表示如果wParam的第一位是1,則黑方行動(strStatus.Format("黑方行動〃);}else(strStatus.Format(〃白方行動〃);}SetDlgItemText(IDC_STATUS,strStatus);strCount.Format("黑方:%02d",UINT(lParam));//白子數(shù)SetDlgItemText(IDC_BLACK_COUNT,strCount);strCount.Format("白方:%02d",(wParam&0xFFFF));//黑子數(shù)SetDlgItemText(IDC_WHITE_COUNT,strCount);}5.1.2游戲幫助對話框的實現(xiàn)黑白棋游戲的幫助是采用一個標(biāo)準(zhǔn)MFC對話框來實現(xiàn)。添加一個對話款資源到工程中,并填寫說明文字,如圖5-1所示。IaIIig1Il^^l-|g|X|SOthello-MicrosoftVisualC++-[Othello.rc-IDD_HELP(Dialog)]胃文件⑥漏輯舊S^(V)插入0)工程IaIIig1Il^^l-|g|X|CHelpDIg(Allclassmembers]▼CHelpDIg國▼--■t3Othelloresources由口Bitmap-DialoggjDD^ABOUTBOX--■t3Othelloresources由口Bitmap-DialoggjDD^ABOUTBOX國idd]hei_pgIDDOTHELLODIALOG畝“(鯉Icon由口Menuij-LBStringTable畝,口VersionE游戲蒂助玩法1.黑方先行,雙方交替下棋.窟子,輻"新落下-個3.其它請百度之0KKabl口@匪圖ILnT]%feH0Bk血n區(qū)hrho-o-四3逃二Class...|翻Reso...國FileVi..」HTVA組建荷試\在文件i中查找\在文件<II就赭Q,0就赭Q,03193x124+4-4-+o|ftOO度1EEMX口圖5-1幫助對話框編寫一個CHelpDlg對話框類,主要是加載IDD_HELP對話框資源。通過資源中的文字說明對游戲操作方法進(jìn)行描述。同時只含單擊“OK”按鈕的響應(yīng)函數(shù)。圖5-2建立ChelpDlg類CHelpDlg對話框類的實現(xiàn),需要實現(xiàn)對話框的構(gòu)造函數(shù)、析構(gòu)函數(shù)和“OK”按鈕的響應(yīng)函數(shù)。用MFC類向?qū)Э梢宰詣由伞癘K”按鈕的響應(yīng)函數(shù),如代碼5-5所示。代碼5-5“OK”按鈕的響應(yīng)函數(shù)BEGIN_MESSAGE_MAP(CHelpDlg,CDialog)//{{AFX_MSG_MAP(CHelpDlg)//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CHelpDlgmessagehandlersvoidCHelpDlg::OnOK()(//TODO:AddextravalidationhereCDialog::OnOK();}5.2黑白棋游戲的核心算法的設(shè)計與實現(xiàn)以下是對黑白棋游戲的核心算法的設(shè)計與實現(xiàn)。5.2.1黑白棋游戲的核心算法的設(shè)計黑白棋游戲的核心算法將在棋盤窗口類中實現(xiàn),它主要負(fù)責(zé)游戲中的棋盤、棋子和棋子個數(shù)。同時還要管理繪圖、輸入輸出等內(nèi)容。其主要有如下幾個模塊:(1)新游戲處理模塊開始新游戲處理模塊,主要是把棋盤數(shù)據(jù)進(jìn)行初始化,并讓棋盤窗口進(jìn)行重繪。(2)鼠標(biāo)輸入處理模塊利用截取窗口上鼠標(biāo)輸入的信息,得到當(dāng)前玩家使用鼠標(biāo)左鍵落子坐標(biāo)。將坐標(biāo)進(jìn)行轉(zhuǎn)換得到棋盤數(shù)組中的序號,把當(dāng)前棋子顏色保存到該數(shù)組中。(3)悔棋模塊重新初始化當(dāng)前棋盤數(shù)組,并把落子步驟數(shù)組的數(shù)據(jù)復(fù)制出來。(4)繪圖處理模塊繪圖處理模塊主要通過遍歷當(dāng)前棋盤數(shù)組中的數(shù)據(jù),根據(jù)每一行或列的棋子類型的不同,進(jìn)行相應(yīng)的棋子繪圖即可。5.2.2黑白棋游戲的核心算法的實現(xiàn)棋盤窗口類CChessBoard的實現(xiàn)。(1)聲明棋盤窗口類CChessBoard,其中包含析構(gòu)函數(shù)、構(gòu)造函數(shù)、悔棋函數(shù)、翻轉(zhuǎn)函數(shù)、繪圖函數(shù)及鼠標(biāo)輸入處理函數(shù)等。首先我們應(yīng)該重寫其構(gòu)造函數(shù)CChessBoard(),為m_iMotiveNumber、m_iMotivex、m_iMotivey等變量附初值,其代碼如代碼5-6所示。代碼5-6重寫構(gòu)造函數(shù)CChessBoard()CChessBoard::CChessBoard()(m_iMotiveNumber=0;m_iMotivex=m_iMotivey=0;m_bPlayMotive=FALSE;init_board(&m_oChessBoard);}實現(xiàn)棋盤窗口類CChessBoard的悔棋函數(shù)MoveBack()。首先,把下棋步驟數(shù)組movearray[]中的數(shù)據(jù)復(fù)制到移動數(shù)組step_array[]中去。然后,調(diào)用下棋函數(shù)do_move_chess()下棋。其代碼如代碼5-7所示。代碼5-7悔棋函數(shù)MoveBack()////////////////////////////////////////////////////////////////////////////悔棋函數(shù)//////////////////////////////////////////////////////////////////////////voidCChessBoard::MoveBack()(if(cur_step<2)(//如果當(dāng)前步驟下于2,說明沒有開始游戲return;}UINT8comside=computer_side;UINT8step=cur_step;INT16movearray[64];〃把下棋步驟數(shù)組中的數(shù)據(jù)復(fù)制到移動數(shù)組中memcpy(movearray,step_array,64*sizeof(INT16));init_board(&m_oChessBoard);computer_side=comside;UINT8col=CHESS_BLACK;for(inti=0;i<step-2;i++,col=~col&3)(do_move_chess(&m_oChessBoard,movearray[i],col,0);}OnPaint();Invalidate();}實現(xiàn)棋盤窗口類CChessBoard的改變棋子接口函數(shù)OnTranChess()。其功能是對指定的棋盤格子進(jìn)行重繪,已改變棋子顏色。所有棋局信息儲存在全局變量wParam里,其中wParam個位是行數(shù),十位是列數(shù)。選定矩形區(qū)域CRectr(x0,y。,x1,y1),調(diào)用InvalidateRect(&r)函數(shù)使該區(qū)域失效,以便重新繪圖。重繪棋盤格子,棋子顏色改變。其代碼如代碼5-8所示代碼5-8改變棋子接口函數(shù)OnTranChess()//////////////////////////////////////////////////////////////////////////〃改變棋子接口函數(shù)//////////////////////////////////////////////////////////////////////////voidCChessBoard::OnTranChess(WPARAMwParam,LPARAMIParam)(introw=wParam/10-1;intcol=wParam%10-1;CRectr(col*COL_WIDTH+22,row*ROW_WIDTH+22,col*COL_WIDTH+COL_WIDTH+22,row*ROW_WIDTH+ROW_WIDTH+22);m_bPlayMotive=FALSE;OnPaint();InvalidateRect(&r);}實現(xiàn)棋盤窗口類CChessBoard的新游戲函數(shù)NewGame()。如果當(dāng)前棋局步數(shù)大于0,意味棋局已經(jīng)開始,那么調(diào)用MessageBox()函數(shù)彈出對話框詢問〃開始新游戲嗎?〃。選是,則初始化棋局。其效果如圖5-3所示。

圖5-3開始新游戲新游戲函數(shù)NewGame(),其代碼如代碼5-9所示。代碼5-9開始新游戲的實現(xiàn)////////////////////////////////////////////////////////////////////////////新游戲//////////////////////////////////////////////////////////////////////////voidCChessBoard::NewGame()(if(cur_step>0)(if(MessageBox(〃開始新游戲嗎?〃,〃黑白棋〃,MB_YESNO|MB_ICONQUESTION)==IDYES)(g_bStart=1;init_board(&m_oChessBoard);Invalidate。;}}}實現(xiàn)棋盤窗口類CChessBoard的窗口建立函數(shù)Create()。其功能是加載各種位圖資源,如棋盤、棋子。圖5-4棋盤chessboard.bmp圖5-5棋子chessblack.bmp窗口建立函數(shù)調(diào)用MFC庫函數(shù)LoadBitmap(),方便添加資源進(jìn)主界面對話框。其代碼實現(xiàn)如下代碼5-10所示。代碼5-10窗口建立函數(shù)Create()////////////////////////////////////////////////////////////////////////////窗口建立函數(shù)//////////////////////////////////////////////////////////////////////////BOOLCChessBoard::Create(RECT&rect,CWnd*pParentWnd,UINTnID)(CStringszClassName=AfxRegisterWndClass(CS_CLASSDC|CS_SAVEBITS|CS_HREDRAW|CS_VREDRAW,0,(HBRUSH)CBrush(RGB(0,0,255)),0);//注冊容器窗體rect.right=rect.left+380+3;rect.bottom=rect.top+380+3;if(!CWnd::CreateEx(WS_EX_CLIENTEDGE,szClassName,_T(〃〃),WS_CHILD|WS_VISIBLE|WS_TABSTOP,rect,pParentWnd,nID,NULL))//WS_EX_CLIENTEDGEreturnFALSE;//如窗體注冊失敗返回FALSEUpdateWindow();//更新窗口m_bitBlackChess.LoadBitmap(IDB_BLACKCHESS);//加載Bitmap位圖資源m_bitChessBoard.LoadBitmap(IDB_CHESSBOARD);m_bitWhiteChess.LoadBitmap(IDB_WHITECHESS);m_motive[0].LoadBitmap(IDB_WHITECHESS);m_motive[1].LoadBitmap(IDB_BLACKCHESS);returnTRUE;}.人工智能模塊6.1人工智能模塊法的設(shè)計人工智能模塊、主要設(shè)計思想是從棋盤的當(dāng)前狀態(tài)構(gòu)造博弈樹,到達(dá)終局狀態(tài)時計算狀態(tài)分,比并回歸到當(dāng)前狀態(tài),以求出最有利的一步(部分回溯值最大的一個子節(jié)點)。6.1.1終局狀態(tài)(1)棋局已結(jié)束。(2)當(dāng)前顏色已無處可下子。(3)博弈樹的深度已到達(dá)指定的深度。6.1.2博弈樹的構(gòu)造方法采用深度優(yōu)先的方法節(jié)省構(gòu)造函數(shù)過程中的內(nèi)存使用,構(gòu)造過程使用堆??臻g存儲子節(jié)點,已完成構(gòu)造的分支可拋棄,以達(dá)到節(jié)省內(nèi)存(使用遞歸程序)。算法簡單描述以下幾步:(1)如果當(dāng)前棋局為終局狀態(tài),則返回狀態(tài)分。(2)從當(dāng)前棋局的狀態(tài)出發(fā),找出一個可走的步數(shù),試走此步。新狀態(tài)擴(kuò)展為當(dāng)前棋局的一個子節(jié)點。此子節(jié)點做為新的當(dāng)前狀態(tài)遞歸調(diào)用。6.1.3構(gòu)造過程的a-p裁減(1)a裁減在考慮輪到棋手下棋的一個親節(jié)點及輪到對手下棋的一個子節(jié)點時,如果該子節(jié)點的數(shù)值已經(jīng)小于或等于其親節(jié)點的回溯值,那么就不需要對于該節(jié)點或者其后續(xù)節(jié)點做更多的處理了,計算的過程可以直接返回到親節(jié)點上。(2)P裁減在考慮輪到對手下棋的一個親節(jié)點及輪到棋手下棋的一個子節(jié)點時,如果該子節(jié)點的部分回溯值已經(jīng)大于或等于其親節(jié)點的部分回溯值,那么就不需要對該子節(jié)點或者其后裔節(jié)點做更多的處理了,計算過程可以直接返回到親節(jié)點上。6.1.4棋局的狀態(tài)估值函數(shù)此函數(shù)量化的方法描述棋局某一狀態(tài)下某一方棋子的形式。對棋局形式的正確分析直接關(guān)系到電腦棋力的高低考慮黑白棋的規(guī)則,棋局結(jié)束時,棋盤上哪一方的棋子多則哪一方獲勝,比較好的方法是計算棋盤上所有不可能被對方吃掉的棋子作為狀態(tài)分。棋盤上任一個棋子是否能被對方吃掉由其4個方向其它棋格的狀態(tài)決定,這4個方向分別是:(1)左上到右下的斜線。(2)右上到左下的斜線。(3)水平方向。(4)垂直方向。一個一個棋子在四個方向上受保護(hù),則認(rèn)為這顆棋子不可能被吃掉。6.1.5判斷棋子是否受保護(hù)一個棋子是否在某一個方向上受保護(hù),可用下面的方法來判斷。滿足下面兩種情況中任一條,則稱此棋子在此方向上受保護(hù):(1)此方向上與此棋子相連的一方棋子已經(jīng)到達(dá)邊界。(2)此方向上與此棋子相連的一方棋子兩邊沒有空格子(對方棋子,或邊界)。由此可知,棋盤空時,四個角上的棋子一定是不可被吃掉的棋子。6.1.6狀態(tài)分的計分方法(1)不可能被吃掉的棋子,計4分。(2)三個方向上受保護(hù)的棋子,計3分。(3)兩個方向上受保護(hù)的棋子,計2分。(4)一個方向上受保護(hù)的棋子,計1分。另外于角的重要性,下面的情況出現(xiàn)時被視為危險狀態(tài)將會被減分。例如,角邊上有一方棋子,但在到達(dá)角的方向上沒有受到保護(hù)則減分。6.1.7棋盤的數(shù)據(jù)結(jié)構(gòu)每一個棋格用一個字節(jié)記,低兩位記錄棋子顏色,高四位記錄此子在四個方向上是否受保護(hù)的情況。如果一個棋格為空,則對應(yīng)字節(jié)為0X0,為避免邊界檢查,在棋盤四周加一個邊框,邊框?qū)?yīng)值為0XFF。6.2人工智能模塊法的實現(xiàn)人工智能模塊的實現(xiàn),分為如下幾步。(1)實現(xiàn)人工智能模塊中比較簡單的功能函數(shù)。初始化游戲函數(shù),黑白棋棋盤是8乘8的矩陣,為了避免越界,特意在棋盤四周加一個邊框值為0XFF。初始化游戲還需要在棋盤中央交錯放置兩黑兩白四顆棋子,效果如圖6-1。圖6-1初始化棋局初始化游戲函數(shù),其代碼如代碼6-1所示。代碼6-1初始化游戲函數(shù)voidinit_board(board_type*board_ptr)(memset(board_ptr,0,sizeof(board_type));/*initboarder*/memset(boardptr->board[0],0xff,10);memset(board_ptr->board[9],0xff,10);for(inti=0;i<9;i++)(board_ptr->board[i][0]=board_ptr->board[i][9]=0xff;}〃給第i行的第一個數(shù)與第十個數(shù)賦初值0xFFboard_ptr->board[4][4]=board_ptr->board[5][5]=CHESS_WHITE;board_ptr->board[4][5]=board_ptr->board[5][4]=CHESS_BLACK;cur_step=0;computer_side=CHESS_WHITE;}統(tǒng)計黑白棋棋子個數(shù),逐個格子黑白棋的個數(shù),如代碼6-2所示。代碼6-2統(tǒng)計棋子個數(shù)voidget_chess_score(board_type*board_ptr,UINT16&iWscore,UINT16&iBscore)(iWscore=0;iBscore=0;for(INT16i=1;i<=8;i++)for(INT16j=1;j<=8;j++)(if(board_ptr->board[i][j]==CHESS_BLACK)iBscore++;elseif(board_ptr->board[i][j]==CHESS_WHITE)iWscore++;}}游戲結(jié)束函數(shù),但符合游戲結(jié)束條件時調(diào)用。其功能是比較黑白棋棋子個數(shù),決定勝出方。其如代碼6-3所示。代碼6-3游戲結(jié)束函數(shù)voidgame_over(board_type*board_ptr,HWNDhwnd)(UINT16wscore,bscore;charstrcomwin□二〃白方勝!";charstruserwin[]=〃黑方勝!〃;charstrdogfall[]="平局!〃;char*text;get_chess_score(board_ptr,wscore,bscore);if(wscore>bscore)//白棋個數(shù)較多時(text=strcomwin;}elseif(wscore<bscore)〃黑棋個數(shù)較多時(text=struserwin;}Else〃平局狀態(tài)(text=strdogfall;}MessageBox(hwnd,text,〃黑白棋〃,MB_OK|MB_ICONINFORMATION);}實現(xiàn)查找水平方向上受保護(hù)的棋子的功能函數(shù),垂直、斜線方向同理。其代碼如代碼6-4所示。代碼6-4查找水平方向上受保護(hù)的棋子的功能函數(shù)/*找出所有在水平方向受保護(hù)的obcolor方的棋子,并累計分?jǐn)?shù)*/INT16scan_horiz_aixes(board_type*board_ptr,UINT8obcolor)(/*掃描8個水平方向*/INT16score=0;UINT8*cur_ptr,*stop_ptr;UINT8piece[4][2];UINT8count=0,tmpscore;UINT8bFull;for(UINT8row=1;row<9;row++)(tmpscore=(row==1||row==8)?10:2;curptr=&boardptr->board[row][1];stop_ptr=&board_ptr->board[row][9];bFull=TRUE;count=0;while(cur_ptr<stop_ptr)(if(*cur_ptr==obcolor)(piece[count][0]=cur_ptr-&board_ptr->board[row][0];while(*cur_ptr==obcolor)cur_ptr++;piece[count++][1]=cur_ptr-&board_ptr->board[row][0];}if(!*cur_ptr)bFull=FALSE;cur_ptr++;}while(count--)(UINT8nums=(piece[count][1]-piece[count][0]);if(bFull||piece[count][0]==1||piece[count][1]==9)score+=nums;if(piece[count][0]==1||piece[count][1]==9)score+=tmpscore;elseif(!bFull&&(piece[count][0]==2||piece[count][1]==8)&&(row==1||row==8))score-=tmpscore;}}returnscore;}實現(xiàn)人工智能模塊中的計算當(dāng)前棋盤狀態(tài)函數(shù),計算當(dāng)前棋盤狀態(tài)得分函數(shù)、移動棋子函數(shù)。其代碼如代碼6-5所示。代碼6-5計算狀態(tài)分/*計算棋局board_ptr的狀態(tài)分*/INT16calc_board_status(board_type*board_ptr,UINT8obcolor)(INT16score=0;score+=scan_horiz_aixes(board_ptr,obcolor);score+=scan_vertical_aixes(board_ptr,obcolor);score+=scan_bd_aixes(board_ptr,obcolor);score+=scan_fd_aixes(board_ptr,obcolor);UINT8tmpcol=~obcolor&0x03;if(board_ptr->board[1][1]==tmpcol)score-=44;if(board_ptr->board[8][8]==tmpcol)score-=44;if(board_ptr->board[1][8]==tmpcol)score-=44;if(board_ptr->board[8][1]==tmpcol)score-=44;returnscore;}UINT8do_move_chess(board_type*board_ptr,UINT16movepos,UINT8obcolor,HWNDhwnd)(INT16affected_list[MAX_AFFECTED_PIECES];INT16num=find_move(board_ptr,movepos,obcolor,affected_list);if(!num||affected_list[0]!=movepos)return0;for(inti=0;i<num;i++)(board_ptr->board[0][affected_list[i]]=obcolor;if(hwnd)::SendMessage(hwnd,WM_TRANCHESS,WPARAM(affected_list[i]),LPARAM(i<<16|obcolor));}step_array[cur_step++]=movepos;return1;}實現(xiàn)人工智能模塊中的核心功能函數(shù)。計算并尋找棋盤中可以下子的位置點。其主要是一個遞歸函數(shù)實現(xiàn),其代碼如代碼6-6所示。代碼6-6尋找棋盤中可以下子的位置點/*從棋盤的一個狀態(tài)出發(fā),擴(kuò)展此結(jié)點,并返回此結(jié)點的部分回溯值*/voidextend_node_one(tree_node_type*node_ptr,tree_node_type*parent_ptr,UINT8obcolor)(tree_node_typechildnode;INT16affected_list[MAX_AFFECTED_PIECES];INT16start_pos=11,num;num=find_move(&node_ptr->board,start_pos,obcolor,affected_list);/*如果是終局狀態(tài),則返回狀態(tài)估值函數(shù)的值*/if(++cur_depth==max_depth||num==0)(/*如果已方PASS但沒到棋局結(jié)束,要扣分*/node_ptr->value=calc_board_status(&node_ptr->board,computer_side);if(!num)(/*如果雙方都沒棋下*/if(!find_move(&node_ptr->board,11,~obcolor&0x03,affected_list))return;if(obcolor==computer_side)(node_ptr->value-=15;return;}node_ptr->value+=15;}return;}/*初始化回溯值*/node_ptr->value=(obcolor==computer_side)?-INITIAL_VALUE:INITIAL_VALUE;memcpy(&childnode.board,&node_ptr->board,sizeof(board_type));while(num)(while(num--)childnode.board.board[0][affected_list[num]]=obcolor;/*遞歸計算

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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

提交評論