基于qt的黑白棋游戲_第1頁
基于qt的黑白棋游戲_第2頁
基于qt的黑白棋游戲_第3頁
基于qt的黑白棋游戲_第4頁
基于qt的黑白棋游戲_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

基于QT的黑白棋游戲摘要本文主要介紹黑白棋游戲的設(shè)計與開發(fā)流程,同時討論黑白棋設(shè)計中不同搜索算法的原理以及特點,從博弈樹搜索算法的進(jìn)步來反映人工智能的發(fā)展。本程序是在LINUXUBUNTU1204LTS環(huán)境下使用面向?qū)ο蟮腃語言開發(fā)。有人人對弈,人機(jī)對弈,悔棋等功能。本論文首先指出了黑白棋游戲,QT以及計算機(jī)博弈的發(fā)展現(xiàn)狀,然后重點介紹了QT開發(fā)工具的使用,黑白棋程序的設(shè)計流程(包含類圖、用例圖、時序圖的設(shè)計),規(guī)則設(shè)計,算法設(shè)計。最后介紹了LINUX桌面環(huán)境GUI和計算機(jī)博弈的發(fā)展趨勢。本設(shè)計通過一個棋類游戲的開發(fā),闡述了棋類游戲的開發(fā)過程,包括軟件開發(fā)的邏輯分析,程序設(shè)計,軟件實現(xiàn)和軟件測試的幾個步驟。關(guān)鍵詞黑白棋;人工智能;搜索算法;QTREVERSIGAMEBASEDONQTABSTRACTTHISPAPERDESCRIBESTHEOTHELLOGAMEDESIGNANDDEVELOPMENTPROCESSANDDISCUSSEDDIFFERENTDESIGNPRINCIPLESANDFEATURESOFTHESEARCHALGORITHMFROMTHEADVANCEMENTOFGAMETREESEARCHALGORITHMTOREFLECTADVANCESINTHEDEVELOPMENTOFARTIFICIALINTELLIGENCETHISPROGRAMISTHEUSEOFOBJECTORIENTEDCLANGUAGEDEVELOPMENTUNDERLINUXUBUNTU1204LTSENVIRONMENTIMPLEMENTSTHEFOLLOWINGFUNCTIONS,MANMACHINETOWAR,MULTIPLAYER,UNDO,ETCINTHISTHESISPOINTSOUTTHEDEVELOPMENTSTATUSOFREVERSIGAME,QTANDCOMPUTERGAMETHENFOCUSESONTHEUSAGEOFQTDEVELOPMENTTOOLS,OTHELLOPROGRAMDESIGNPROCESSINCLUDINGCLASSDIAGRAMS,CASEDIAGRAM,SEQUENCEDIAGRAMDESIGNWITH,RULESDESIGN,ALGORITHMDESIGNFINALLY,THEDEVELOPMENTTRENDOFLINUXDESKTOPENVIRONMENTGUIANDCOMPUTERGAMEBYDEVELOPINGACHESSGAME,DESCRIBESTHEDEVELOPMENTPROCESSOFBOARDGAMESSEVERALSTEPSINCLUDINGLOGICALANALYSISOFSOFTWAREDEVELOPMENT,PROGRAMDESIGN,SOFTWAREIMPLEMENTATIONANDSOFTWARETESTINGKEYWORDSOTHELLOARTIFICIALINTELLIGENCESEARCHALGORITHMQT目錄摘要IABSTRACTII1緒論111前言112黑白棋的發(fā)展1121黑白棋程式的發(fā)展2122游戲規(guī)則2123開局策略213機(jī)器博弈與人工智能的發(fā)展概況3131機(jī)器博弈的基本思想3132機(jī)器博弈系統(tǒng)4133博弈搜索4134MINMAX搜索4135剪枝搜索4136ALPHABETA的增強算法介紹5137人工智能的發(fā)展?fàn)顩r714主要研究內(nèi)容815相關(guān)實驗環(huán)境82工具及算法介紹921QT簡介922信號與槽923QT和MFC的比較924核心算法介紹103系統(tǒng)分析與設(shè)計1231黑白棋的需求分析12311用例圖12312程序流程圖1332模塊設(shè)計13321主要模塊簡介13322類圖14323棋盤數(shù)據(jù)結(jié)構(gòu)設(shè)計1533設(shè)計系統(tǒng)的現(xiàn)實意義174詳細(xì)設(shè)計1841界面設(shè)計1842核心算法代碼及注釋205系統(tǒng)測試2951白盒測試2952黑盒測試3053總結(jié)3254展望33參考文獻(xiàn)34致謝351緒論11前言計算機(jī)博弈(COMPUTERGAMES),也稱之為機(jī)器博弈,就是讓計算機(jī)可以像人腦一樣進(jìn)行思維活動,最終可以下棋,下國際象棋、西洋跳棋、黑白棋、中國象棋、圍棋等等。早在計算機(jī)誕生的前夜,著名的數(shù)學(xué)家和計算機(jī)學(xué)家阿倫圖靈ALANTURING便設(shè)計了一個能夠下國際象棋的紙上程序,并經(jīng)過一步步的人為推演,實現(xiàn)了第一個國際象棋的程序化博弈。那些世界上最著名的科學(xué)家,如計算機(jī)創(chuàng)始人馮諾依曼(JOHNVONNEUMANN),信息論創(chuàng)始人科勞德香農(nóng)CLAUDEESHANNON,人工智能的創(chuàng)始人麥卡錫JOHNMCCARTHY等人都曾涉足計算機(jī)博弈領(lǐng)域,并做出過非常重要的貢獻(xiàn)。從上世紀(jì)40年代計算機(jī)誕生,計算機(jī)博弈經(jīng)過一代又一代學(xué)者的艱苦奮斗和坎坷歷程,終于在上世紀(jì)的八、九十年代,以計算機(jī)程序戰(zhàn)勝棋類領(lǐng)域的天才而享譽世界。其中最為著名的則是1997年5月IBM“深藍(lán)”戰(zhàn)勝世界棋王卡斯帕羅夫,成為計算機(jī)科學(xué)史上一個不朽的豐碑。在這之后,計算機(jī)博弈一天也沒有停息過拼搏。由SCIENCE雜志評選的2007年十大科技突破中,就還包括了加拿大阿爾波特大學(xué)的科研成果解決了西洋跳棋CHECKER博弈問題,也就是說,在西洋跳棋的博弈中計算機(jī)將永遠(yuǎn)“立于不敗之地”。計算機(jī)博弈原理與方法學(xué)既涉及到博弈論(對策論)、搜索原理等理論內(nèi)容,又更多地涉及到數(shù)據(jù)結(jié)構(gòu)、軟件工程、程序設(shè)計方法學(xué)等方面的知識。計算機(jī)博弈屬于計算機(jī)科學(xué)與應(yīng)用學(xué)科的研究方向之一,又是人工智能領(lǐng)域的重要研究方向,應(yīng)該屬于智能科學(xué)與技術(shù)學(xué)科的一個分支。本文著重介紹了黑白棋的設(shè)計與開發(fā),通過介紹博弈算法與程序設(shè)計的基本流程讓您對計算機(jī)博弈原理與方法以及程序設(shè)計有更深入的了解。12黑白棋的發(fā)展黑白棋是起源于英國19世紀(jì)末的一種棋盤類游戲,又叫反棋REVERSI、奧塞羅棋OTHELLO、蘋果棋或翻轉(zhuǎn)棋。游戲通過相互翻轉(zhuǎn)對方的棋子,最后以棋盤上誰的棋子多來判斷勝負(fù)。為什么以奧塞羅棋來命名黑白棋呢上世紀(jì)70年代日本人GOROHASEGAWA借用莎士比亞名劇“奧塞羅”為黑白棋重新命名。在莎士比亞筆下的主角奧塞羅,是一位黑膚色的摩那人將軍,他的妻子是一位白人貴族的女兒苔絲狄蒙娜DESDEMON,因為受到小人伊阿古IAGO的挑撥離間,懷疑自己的妻子不忠而親手殺死了自己的妻子。真相大白后,由于內(nèi)心充滿后悔和愧疚而自殺身亡。就如同奧塞羅據(jù)中男女主角之間的愛恨糾葛一樣,黑白棋在游戲的過程中黑子與白子必須不斷翻動對手棋子,因此黑白棋就以O(shè)THELLO來命名。121黑白棋程式的發(fā)展上世紀(jì)90年代初,由于計算深度和尾局的準(zhǔn)確性,黑白棋程式的棋力已經(jīng)很強。這個時期的程式由人工加入行動力、位置策略等因素,所以程式的棋力依賴于程式員本身的棋力,導(dǎo)致程式中存在人類棋手的弱點。這一情況在1995年左右得到了突破性的發(fā)展,程式員MICHAELBURO寫出了能自我學(xué)習(xí)的黑白棋游戲LOGISTELLO。自此,程式員不在把人工策略寫死在程式里,而是由程式自我學(xué)習(xí),程式會紀(jì)錄形狀,自動調(diào)整下棋策略。具有先進(jìn)算法,高效率和準(zhǔn)確的編程,使黑白棋程式的棋力遠(yuǎn)遠(yuǎn)超過人類棋手。黑白棋算法的不斷改進(jìn),體現(xiàn)了人工智能AI的發(fā)展。122游戲規(guī)則游戲開始時棋盤正中有交叉放置的四個棋子,兩黑兩白,黑棋總是先手。雙方交替下棋。新落下的棋子與棋盤上已有同色棋子之間,被夾住得所有對方棋子都要翻轉(zhuǎn)過來。且夾住位置上必須全部是對手的棋子,不能有空格。一步棋可以在數(shù)個方向上翻棋,任何被夾住得棋子必須被翻轉(zhuǎn)過來。如果一方在棋盤上沒有地方可以落子,則對手可以連續(xù)落子。雙方都沒有棋子可落時,棋局結(jié)束,棋子數(shù)目多的一方獲勝。在棋盤還沒有下滿是,如果一方棋盤上沒有棋子,則棋局結(jié)束。將對手棋子吃光的一方獲勝。123開局策略黑白棋最常見的開局策略有以下幾種最多子策略THEMAXIMUMDISCSTRATEGY位置權(quán)重策略THEWEIGHTEDSQUARESTRATEGY行動能力策略THEMOBILITYCONSIDERATIONSTRATEGY穩(wěn)定子策略THESTABILITYDISCSTRATEGY這四種開局策略各有優(yōu)缺點,以下會對其簡單介紹1最多子策略THEMAXIMUMDISCSTRATEGY此策略采用貪心算法,是最直接簡單的一種策略。此策略在落子時,會判斷在哪個位置落子可以造成己方棋子數(shù)目最多,即可以翻轉(zhuǎn)對手棋子最多的位置,從而取得勝利。雖然使用此策略會在初期占據(jù)大量棋子并取得優(yōu)勢,但是占據(jù)的棋子并非不會再被對手所占據(jù)的穩(wěn)定子,且讓對手有更多落子的位置的選擇。因此很容易被對方逆轉(zhuǎn)局面,失去領(lǐng)先地位。2位置權(quán)重策略THEWEIGHTEDSQUARESTRATEGY棋盤上每個位置都有各自對整個盤面變化產(chǎn)生的價值,因此將每個位置不同的價值作為落子時考慮的權(quán)重,如圖11所示在角落位置因為對盤面有較大的影響力,因此也就擁有比其他位置較高的權(quán)重,一旦占領(lǐng)角落后,不僅此位置不會被對手再占領(lǐng),且將可以此位置為錨,進(jìn)而占領(lǐng)盤面上其他的位置,所以在位置權(quán)重策略上對角落位置給予較高權(quán)重。而在盤面上C與X被賦予較低的權(quán)重,因為落子在這些位置時有可能對盤面發(fā)展?fàn)顩r造成不利的影響,落子在C、X會讓對手有機(jī)會占領(lǐng)角落,而讓自己處于不利局面。此外在A、D位置會給予次高的權(quán)重,落子在這些位置時,將有可能讓對手被迫落子在C、X位置,而陷于困境,因此A、D位置有次高權(quán)重。3行動能力策略THEMOBILITYCONSIDERATIONSTRATEGY以合法步的數(shù)量來決定其行動能力的狀態(tài),如果是對手可下的合法步數(shù)量少得話,將會使對手無合法步可以落子發(fā)生PASS,或是被迫下在不利位置如圖11C、X位置。4穩(wěn)定子策略THESTABILITYDISCSTRATEGY落子時考慮落子的位置將會造成多少穩(wěn)定子來決定該下在哪里,穩(wěn)定子即無法再被對手所翻動的棋子。在上述的策略中,每一種策略都有其應(yīng)用的情況,也有其不足之處,所以在一盤棋局中不能只采用一種策略,最好的方式應(yīng)該是在面對不同的棋局情況時采用對應(yīng)的策略。圖11位置權(quán)重策略示意圖13機(jī)器博弈與人工智能的發(fā)展概況131機(jī)器博弈的基本思想機(jī)器博弈的核心思想并不復(fù)雜,實際上就是對博弈樹節(jié)點的估值過程和對博弈樹搜索過程的結(jié)合。在博弈的任何一個中間階段,站在博弈雙方其中一方的立場上,可以構(gòu)想一個博弈樹。這個博弈樹的根節(jié)點是當(dāng)前時刻的棋局,它的兒子節(jié)點是假設(shè)再行棋一步以后的各種棋局,孫子節(jié)點是從兒子節(jié)點的棋局再行棋一步的各種棋局,以此類推,構(gòu)造整棵博弈樹,直到可以分出勝負(fù)的棋局。整棵的博弈樹非常龐大,且不同的棋類有所不同,分支因子大的如圍棋的博弈樹顯然要比分支因子小的如國際象棋的博弈樹要大得多。博弈程序的任務(wù)就是對博弈樹進(jìn)行搜索找出當(dāng)前最優(yōu)的一步行棋。對博弈樹進(jìn)行極大極小搜索,可以達(dá)到這一目的。極大極小搜索,是因為博弈雙方所要達(dá)到的目的相反,一方要尋找的利益恰是一方失去的利益,所以博弈的一方總是希望下一走是兒子節(jié)點中取值最大者,而另一方恰恰相反。這便形成了極大極小過程。當(dāng)然,程序不能也沒有必要做到搜索整棵博弈樹的所有節(jié)點,對于一些已經(jīng)確定為不佳的走步可以將以它為根節(jié)點的子樹剪掉。而且,搜索也不必真地進(jìn)行到分出勝負(fù)的棋局,只需要在一定深度范圍內(nèi)對局面進(jìn)行評價即可。只有搜索空間縮小到一定程度,搜索才可以真正的進(jìn)行。當(dāng)搜索進(jìn)行到一定深度,用局面評價機(jī)制來評價棋局,按照極大極小的原則選出最優(yōu),向上回溯,給出這一局面的父親節(jié)點的價值評價,然后再繼續(xù)向上回溯,一直到根節(jié)點,最優(yōu)走步就是這樣搜索出來的。在這個過程中,最為重要的是搜索算法,高效的搜索算法可以保證用盡量少的時間和空間損耗來達(dá)到尋找高價值的走步。但是真的想要博弈程序棋力提高,還必須有一個好的局面評價機(jī)制,即估值算法作后盾。就是說,用這個估值算法評價的局面價值必須是客觀的、正確的,可以確鑿的評價局面的優(yōu)劣以及優(yōu)劣的程度。132機(jī)器博弈系統(tǒng)根據(jù)機(jī)器博弈的基本思想,可以確定一個機(jī)器博弈系統(tǒng)的一般構(gòu)成6。首先是知識表示的問題,選用一種合適的方法記錄棋局。這時需要考慮在這種知識表示的數(shù)據(jù)結(jié)構(gòu)之上將要進(jìn)行的各種操作,知識表示應(yīng)該使最經(jīng)常進(jìn)行的操作花費的時間和空間代價最小。其次,根據(jù)不同的棋類的不同規(guī)則集,要有一個相應(yīng)的走法產(chǎn)生機(jī)制。它的作用是用來產(chǎn)生整棵博弈樹,即處于博弈樹的任何一個節(jié)點位置上,應(yīng)該能夠運用該機(jī)制產(chǎn)生這個節(jié)點的所有兒子節(jié)點,也就是接下來的所有合法走步。除了以上兩個模塊以外,就是博弈核心的搜索技術(shù)和與之配合的估值技術(shù)了。這四個部分相互配合運轉(zhuǎn)起來,就可以實現(xiàn)機(jī)器博弈。133博弈搜索博弈搜索的基本思想已經(jīng)提出半個多世紀(jì),目前廣泛研究的是確定的、二人、零和、完備信息的博弈搜索。也就是說,沒有隨機(jī)因素的博弈在兩個人之間進(jìn)行,在任何一個時刻,一方失去的利益即為另一方得到的利益,不會出現(xiàn)“雙贏”的局面,而且在任何時刻,博弈的雙方都明確的知道每一個棋子是否存在和存在于哪里。二人、零和、完備信息的博弈搜索理論已經(jīng)很系統(tǒng)。極大極小算法是所有搜索算法的基礎(chǔ)。在這個基礎(chǔ)上,目前在這一領(lǐng)域的算法主要有兩類,一類是作為主流的深度優(yōu)先的ALPHABETA搜索及其系列增強算法,另一類是最佳優(yōu)先的系列算法。博弈搜索從搜索方向上可以分為寬度優(yōu)先搜索BREADTHFIRSTSEARCH和深度優(yōu)先搜索DEPTHFIRSTSEARCH。前者能夠保證在搜索樹中找到一條通向目標(biāo)節(jié)點的最短途徑。但是巨大的時間和空間開銷使得它在計算機(jī)博弈中很少采用。深度優(yōu)先搜索的最大特點就是可以節(jié)省大量的節(jié)點存儲空間。因為它通常是采用遞歸過程來遍歷搜索樹,即后序遍歷,得到一個節(jié)點值,就對其子節(jié)點做遞歸,然后根據(jù)他們的俄返回值來決定自身的返回值,搜索過的底層節(jié)點也隨即撤銷,因此它所占用的動態(tài)空間十分有限。134MINMAX搜索在機(jī)器與人對弈的過程中,機(jī)器事先并不知道人的水平如何,因而機(jī)器只能假設(shè)人走的每一步都會為自己帶來最小的收益,而機(jī)器走的每一步都要為自己爭取最大的利益,這就是極大極小原理。如果我們把機(jī)器和人連接走的每一步畫成樹狀結(jié)構(gòu)(即博弈樹),對于每一個節(jié)點,其子節(jié)點是下一步所有可能走的位置(有可能是對方走,也有可能是自己走),對于葉子節(jié)點我們運用一次估值函數(shù)得到葉子的權(quán)值,之后便一直向上反推,直到得到根節(jié)點的權(quán)值。我們把每一次機(jī)器要走的節(jié)點叫做MAX節(jié)點,因為這個節(jié)點的值是其子節(jié)點所有值中的最大值,而把每一個人要走的節(jié)點叫做MIN節(jié)點,因為這個節(jié)點的值是其子節(jié)點所有值中的最小值。這樣得到的根節(jié)點的值,就是機(jī)器走這一步期望的最大收益。135剪枝搜索搜索實際上就是運用剪枝優(yōu)化后的MINMAX搜索,其基本的極大極小思想是不變的。首先引入兩個變量、,表示當(dāng)前節(jié)點在前面的搜索過程中,依據(jù)子節(jié)點的返回值來估計出的當(dāng)前節(jié)點最后的結(jié)果的下限和上限。下面給出剪枝和剪枝的定義1如果當(dāng)前節(jié)點是MIN節(jié)點,當(dāng)前節(jié)點的父節(jié)點是MAX節(jié)點,那么當(dāng)當(dāng)前節(jié)點的一個子節(jié)點的值小于當(dāng)前節(jié)點的值時,那么當(dāng)前節(jié)點的其余子節(jié)點就不用搜索了,這個過程稱為剪枝過程。2如果當(dāng)前節(jié)點是MAX節(jié)點,當(dāng)前節(jié)點的父節(jié)點是MIN節(jié)點,那么當(dāng)當(dāng)前節(jié)點的一個子節(jié)點的值大于當(dāng)前節(jié)點的值時,那么當(dāng)前節(jié)點的其余子節(jié)點就不用搜索了,這個過程稱為剪枝過程。圖12ALPHA剪枝示意圖圖13BETA剪枝示意圖136ALPHABETA的增強算法介紹1渴望搜索(ASPIRATIONSEARCH)在ALPHABETA剪枝過程中,初始的的搜索窗口往往是從(即初始的ALPHA值)到(初始的BETA值),在搜索進(jìn)行中再不斷縮小窗口,加大剪枝效果。渴望搜索就是渴望從一開始就使用小的窗口,從而在搜索初起,就可以進(jìn)行大量的剪枝。這個初始窗口的選定很重要,如果選擇準(zhǔn)確,即所要尋找的走步就在這個窗口內(nèi),搜索便可以繼續(xù)進(jìn)行。如果第一步搜索的返回值證明最佳走步大于BETA值,就需要重新確定窗口。以原來的BETA值為ALPHA值,以為新的BETA值重新搜索。相反如果第一步的返回值證明最佳走步小于ALPHA值,重新確定的窗口就是以為ALPHA值,原來的ALPHA值為BETA值了??梢姷谝淮嗡阉鞑聹y的窗口非常重要,如果猜測準(zhǔn)確,搜索時間可以大大縮短,如果不準(zhǔn)確,這一優(yōu)勢就不明顯了。由于渴望搜索是一種基本的搜索方法,它在和后面敘述的遍歷深化結(jié)合使用的時候,就可以借助前一次深度為DEPTH的搜索的結(jié)果來猜測當(dāng)前深度為DEPTH1搜索的窗口了。2極小窗口搜索(MINIMALWINDOWSEARCH)極小窗口搜索,也被稱為是主變量導(dǎo)向搜索(PRINCIPALVARIATIONSEARCH),常常簡稱為PVS算法或者NEGASCOUT算法。這個算法應(yīng)用非常廣泛。它的出發(fā)點是和渴望搜索大致相同的,即用極小的窗口來限制剪枝范圍。它的過程是這樣的在根節(jié)點處,假定第一個兒子節(jié)點為主變量,也就是假定它為最佳走步,對它進(jìn)行完整窗口A,B的搜索并得到一個返回值V,對后面的兒子節(jié)點依次用極小窗口(也被稱為是零窗口)(V,V1)來進(jìn)行搜索,如果搜索返回值大于零窗口,則證明這一分支亦為主變量,對它進(jìn)行窗口為(V1,B)的搜索,可是如果返回值小于零窗口,這一分支就可以忽略,因為它的最佳走步還不如已有的走步。極小窗口搜索采用了極小的窗口,剪枝效率最高,并且只對主變量進(jìn)行大窗口的搜索,所以大部分搜索動作是有效的,搜索產(chǎn)生的博弈樹也很小。3置換表(TRANSPOSITIONTABLE)在搜索進(jìn)行中,查詢所有的走步,經(jīng)常會在相同的或者不同的路徑上遇到相同的棋局,這樣的子樹就沒有必要重復(fù)搜索,把子樹根節(jié)點的估值、子樹的最好走步和取得這個值的深度信息保存在一個稱為置換表的數(shù)據(jù)結(jié)構(gòu)中,下次遇到時直接運用即可。但是,對不同的情況要區(qū)別對待。對于固定深度的搜索,如果前一次保存的子樹深度小于新節(jié)點要搜索的深度,還是要進(jìn)行重新的搜索以保證所取得數(shù)據(jù)的準(zhǔn)確程度。反之,如果置換表中保存的子樹信息表明,子樹的深度大于或者等于當(dāng)前的新節(jié)點要求的搜索深度,它的信息就可以直接運用了。置換表增強如果和有效的ALPHABETA搜索結(jié)合使用,結(jié)果就會使實際搜索的博弈樹小于最小樹。博弈樹搜索的問題實際上是一個有向圖的搜索。那些在置換表中被命中的節(jié)點,就是有向圖中若干路徑的交叉點。只有避免這些交點被重復(fù)搜索,搜索過程中生成的搜索樹才有可能小于最小樹。這也是后來證明深度優(yōu)先的算法并不比最佳優(yōu)先的算法差的原因之一。這個算法存在的問題是,置換表的構(gòu)造,必須使對置換表的查找和插入操作不成為整個搜索的負(fù)擔(dān),才能提高效率。一般使用散列表來實現(xiàn)。4遍歷深化(ITERATIVEDEEPENING)遍歷深化是因?qū)Σ┺臉溥M(jìn)行多次遍歷,又不斷加深其深度而得名,有人還把它稱為蠻力搜索。算法利用了ALPHABETA算法對子節(jié)點排序敏感的特點。它希望通過淺層的遍歷給出節(jié)點的大致排序,把這個排序作為深層遍歷的啟發(fā)式信息。另外,算法用時間控制遍歷次數(shù),時間一到,搜索立即停止,這也符合人類棋手的下棋特點。在關(guān)鍵的開局和殘局,由于分支較少,也可以進(jìn)行較深層次的搜索。算法的過程是,對以當(dāng)前棋局為根節(jié)點的博弈樹進(jìn)行深度為二的遍歷,得出其兒子節(jié)點的優(yōu)劣排序,接著再從根節(jié)點進(jìn)行深度為三的遍歷,這一次優(yōu)先搜索上次遍歷中得出的最優(yōu)者,從而加大剪枝效果,以此類推,在進(jìn)行第三次、第四次的遍歷,一直達(dá)到限定時間為止。由于這個算法的每次遍歷都從根節(jié)點開始,所以有人稱其為蠻力搜索,但實際上由于每次都可以優(yōu)先搜索相對好的節(jié)點,導(dǎo)致剪枝效率增大,其實算法效率是很高的,目前這一算法也得到了廣泛的認(rèn)可。5歷史啟發(fā)搜索(HISTORYHEURISTIC)歷史啟發(fā)也是迎合ALPHABETA搜索對節(jié)點排列順序敏感的特點來提高剪枝效率的,即對節(jié)點排序,從而優(yōu)先搜索好的走法。所謂好的走法即可以引發(fā)剪枝的走法或者是其兄弟節(jié)點中最好的走法。一個這樣的走法,一經(jīng)遇到,就給其歷史得分一個相應(yīng)的增量,使其具有更高的優(yōu)先被搜索的權(quán)利。6殺手啟發(fā)搜索KILLERHEURISTIC殺手啟發(fā)實際上是歷史啟發(fā)的特例。它是把同一層中,引發(fā)剪枝最多的節(jié)點稱為殺手,當(dāng)下次搜索時,搜索到同一層次,如果殺手走步是合法的話,就優(yōu)先搜索殺手。7MTDF算法MTDF搜索的全稱是MEMORYENHANCEDTESTDRIVERWITHFANDN。它是一個較新的算法,在1995左右年由ASKEPLAAT等人提出。它不是單一的ALPHABETA算法的增強,但也是ALPHABETA算法的改進(jìn)。在算法進(jìn)行中多次調(diào)用了零窗口的ALPHABETA搜索過程。在算法初起,要給定一個初始值F,一個上界和一個下界。初始值要盡可能的靠近最后要找到的最優(yōu)走步值,上界和下界要保證能把這個最優(yōu)走步包含在內(nèi)。算法實際上就是不斷的應(yīng)用零窗口的ALPHABETA搜索,縮小上界和下界,并移動初始值使其接近最優(yōu)走步。以下使這個算法的偽代碼。FUNCTIONMTDN,GREPEATIFGTHENG1ELSEGGALPHABETAN,1,IFG先獲取當(dāng)前窗口的高和寬,HEIGHT()和WIDTH(),必須在PAINTEREVENT事件中,因為在窗口發(fā)生變化時,重繪工作要重新獲取寬和高的數(shù)值,才能準(zhǔn)確畫出棋盤;3FOR循環(huán)9次畫線;3將棋盤中間的四個位置畫上相應(yīng)的棋子。其他位置繪制棋子就事先在此類的構(gòu)造函數(shù)中將棋盤模擬成一個三維數(shù)組,用不同的枚舉狀態(tài)代表不同的顏色。然后這里進(jìn)行數(shù)組遍歷,根據(jù)不同顏色,在計算出四個棋子的相對坐標(biāo)上將棋子(圓)畫上去。雙方棋子數(shù)目的顯示在另一模塊中定義兩個QLCDNUMBER對象,將其初始化后,用QHBOXLAYOUT放入QWIDGET框架中。然后在用CONNECT()棋子的數(shù)目變化與DISPLAY()槽連接。當(dāng)棋子數(shù)目發(fā)生變化時,發(fā)送信號使其顯示棋子數(shù)。當(dāng)點擊開始按鈕(QPUSHBUTTON)時發(fā)射信號給自定義槽INIT(),槽的功能則是將棋盤(數(shù)組)重新初始化為新一局棋盤,包括主要標(biāo)志位,然后進(jìn)行重繪。核心算法(人機(jī)對戰(zhàn))此算法由事件MOUSEPRESSEVENT(QMOUSEEVENTE)函數(shù)來響應(yīng)鼠標(biāo)事件。當(dāng)點擊鼠標(biāo)后進(jìn)入該事件,首先獲取鼠標(biāo)點擊出坐標(biāo)XEX,YEY,計算X,Y坐標(biāo)對應(yīng)的數(shù)組位置,即QPOINTPOINT。當(dāng)獲取到棋盤坐標(biāo)后,將其傳入另一函數(shù)DO_PRESSPOINTQPOINTPOINT中進(jìn)行進(jìn)一步處理。參數(shù)COLOR代表當(dāng)前方棋子的顏色,在此分析函數(shù)將完成棋盤點擊處八個方向的棋子是否可落子判斷,八個方向則由I、J加減一來決定,這里只分析一個方向,其他方向雷同。如果坐標(biāo)的下一格為空或著是與COLOR值相同,則進(jìn)入下一個方向判斷。若上述條件不滿足,進(jìn)入WHILEI0,若遇到COLOR則記錄坐標(biāo)處到CLOR處的格數(shù)(COUNT),退出循環(huán)。然后用FOR循環(huán)將剛才COLOR間夾得子變成COLOR。跳過當(dāng)人對人時,可隨意跳過,人對機(jī)時要等到某方確實無法下子時,跳過才生效。主要是通過發(fā)射信號的方式來顯示一個提示框,同時,已經(jīng)改變同步標(biāo)志位。勝負(fù)提示當(dāng)棋盤棋子總數(shù)為64或者單方棋子位0時顯示提示框。3系統(tǒng)分析與設(shè)計在軟件工程中,需求分析指的是在創(chuàng)建一個新的或改變一個現(xiàn)存的系統(tǒng)或產(chǎn)品時,確定新系統(tǒng)的目的、范圍、定義和功能時所要做的所有工作。需求分析是軟件工程中的一個關(guān)鍵過程。在這個過程中,系統(tǒng)分析員和軟件工程師確定顧客的需要。只有在確定了這些需要后他們才能夠分析和尋求新系統(tǒng)的解決方法。概要設(shè)計的主要任務(wù)是把需求分析得到的系統(tǒng)擴(kuò)展用例圖轉(zhuǎn)換為軟件結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu)。設(shè)計軟件結(jié)構(gòu)的具體任務(wù)是將一個復(fù)雜系統(tǒng)按功能進(jìn)行模塊劃分、建立模塊的層次結(jié)構(gòu)及調(diào)用關(guān)系、確定模塊間的接口及人機(jī)界面等。數(shù)據(jù)結(jié)構(gòu)設(shè)計包括數(shù)據(jù)特征的描述、確定數(shù)據(jù)的結(jié)構(gòu)特性、以及數(shù)據(jù)庫的設(shè)計。31黑白棋的需求分析首先要界面簡潔,具有黑、白棋子數(shù)目顯示、倒數(shù)計時顯示、功能鍵顯示等。其次要界面友好,背景、組件大小等要協(xié)調(diào),給用戶一種和諧的感官。再次要實現(xiàn)游戲開始、暫停、退出、模式選擇、悔棋、跳過等基本功能。最后要選擇合適的算法來實現(xiàn)黑白棋的下棋規(guī)則功能和計算機(jī)自動下棋功能。311用例圖USER人人人人人人人人人人人人人人人人人人人人人人人人人人人人INCLUDEINCLUDE圖31用例圖由參與者(ACTOR)、用例(USECASE)以及它們之間的關(guān)系構(gòu)成的用于描述系統(tǒng)功能的靜態(tài)視圖稱為用例圖。用例圖是被稱為參與者的外部用戶所能觀察到的系統(tǒng)功能的模型圖,呈現(xiàn)了一些參與者和一些用例,以及它們之間的關(guān)系,主要用于對系統(tǒng)、子系統(tǒng)或類的功能行為進(jìn)行建模。用例圖用于對系統(tǒng)、子系統(tǒng)或類的行為進(jìn)行可視化,使用戶能夠理解如何使用這些元素,并使開發(fā)者能夠?qū)崿F(xiàn)這些元素。用例圖定義了系統(tǒng)的功能需求,它是從系統(tǒng)的外部看系統(tǒng)功能,并不描述系統(tǒng)內(nèi)部對功能的具體實現(xiàn)。312程序流程圖開始模式選擇人機(jī)對戰(zhàn)人人對戰(zhàn)使用者落子產(chǎn)生盤面判斷游戲是否結(jié)束計算機(jī)落子產(chǎn)生盤面NO判斷游戲是否結(jié)束NO結(jié)束YESYES黑方落子產(chǎn)生盤面判斷游戲是否結(jié)束白方落子產(chǎn)生盤面判斷游戲是否結(jié)束NOYESNO圖32程序流程圖32模塊設(shè)計321主要模塊簡介通過對程序流程圖的分析,將采用以下模塊來實現(xiàn)黑白棋游戲的開發(fā)與設(shè)計。1游戲界面模塊本模塊是用來繪制游戲主界面,包括黑白棋記數(shù),時間顯示,棋盤,以及實現(xiàn)各種子功能的按鈕。該模塊是由QT設(shè)計師界面類實現(xiàn),通過QTDESIGNER拖拽控件設(shè)計主界面。2繪制棋盤模塊繪制棋盤模塊用來繪制8X8正方形棋盤以及黑、白色棋子。通過PAINTEVENTQPAINTEVENTE函數(shù)來實現(xiàn)繪圖模塊。3初始化棋盤模塊根據(jù)黑白棋的游戲規(guī)則,每輪開局前,首先在88的棋盤上的中心位置,先放入4枚棋子,黑、白各兩枚。初始化模塊的作用就是開局以及游戲結(jié)束開始新游戲時復(fù)位棋盤。4黑白棋子記數(shù)及判斷輸贏模塊本模塊實現(xiàn)當(dāng)棋盤下滿時,根據(jù)黑白棋數(shù)目判斷輸贏及對當(dāng)前黑白棋子數(shù)的顯示。5倒計時及判斷輸贏模塊本模塊當(dāng)?shù)褂嫊r小于5時,實現(xiàn)對玩家的提醒功能以及倒計時結(jié)束后對游戲輸贏的判斷。6人人對戰(zhàn)模塊本模塊通過判斷用戶鼠標(biāo)單擊事件位置,獲得棋盤落子坐標(biāo),根據(jù)下棋規(guī)則模塊判斷落子是否合法,判斷為合法落子,則落子成功,并將落子權(quán)交給對方,否則將無法響應(yīng)。7人機(jī)對戰(zhàn)模塊本模塊通過人機(jī)對戰(zhàn)時機(jī)器計算落子坐標(biāo),并根據(jù)坐標(biāo)自動下棋,本模塊是黑白棋游戲的核心模塊,人機(jī)對戰(zhàn)模塊的核心算法決定了黑白棋游戲的落子效率以及黑白棋游戲的可玩性。該算法是人工智能在游戲領(lǐng)域的體現(xiàn)。本模塊采用的是一個窮舉的方法傳統(tǒng)的博弈樹搜索算法(極大極?。?。8下棋規(guī)則模塊本模塊是黑白棋游戲的基礎(chǔ),本模塊負(fù)責(zé)判斷哪些位置能落子,以及落子成功后翻轉(zhuǎn)相應(yīng)的棋子。本模塊是由C語言實現(xiàn)黑白棋游戲規(guī)則的邏輯。9跳過模塊當(dāng)根據(jù)游戲規(guī)則出現(xiàn)沒有地方落子的情況時,通過本模塊實現(xiàn)跳過功能,將落子權(quán)交給對方,從而繼續(xù)進(jìn)行游戲。10悔棋模塊黑白棋項目是由堆棧來存儲落子信息。通過落子信息的出棧、入棧實現(xiàn)悔棋功能。322類圖類圖CLASSDIAGRAM是顯示了模型的靜態(tài)結(jié)構(gòu),特別是模型中存在的類、類的內(nèi)部結(jié)構(gòu)以及它們與其他類的關(guān)系等。類圖由許多(靜態(tài))說明性的模型元素(例如類、包和它們之間的關(guān)系)組成。類圖是最常用的UML圖,顯示出類、接口以及它們之間的靜態(tài)結(jié)構(gòu)和關(guān)系;它用于描述系統(tǒng)的結(jié)構(gòu)化設(shè)計。類圖最基本的元素是類或者接口。QWIDGETCHESSBOARDENUMGRIDSTATEINTBLACK_NUMINTWHITE_NUMINTGRIDINTSTARX,STARYINTGRIDNUMVOIDCHESSMANINFOCHESSBOARDSETCHESSMANINFOPAINTEVENTMOUSEPRESSEVENTPRESSPOINTCHESSNUMWIDGETQSTACKSTACKINTBLACKNUMBERINTWHITENUMBERCHESSBOARDBOARDCHESSBOARDGRIDSTATECURRENTROLEINTCHESSINTROWINITPAINTEVENTCHESSRULECHESSOUTOAUTOCHESSDO_PRESSPOINTTIMERSLOTSHOW_CHESSNUMPRESSPOINT圖33類圖323棋盤數(shù)據(jù)結(jié)構(gòu)設(shè)計WIDGETCPP文件中包含了下棋的規(guī)則和棋盤的數(shù)據(jù)結(jié)構(gòu)。要實現(xiàn)棋盤的數(shù)據(jù)結(jié)構(gòu),我們首先想到的是二維數(shù)組,但是二維數(shù)組的執(zhí)行效率不高,我們將采用三維數(shù)組來實現(xiàn)棋盤的數(shù)據(jù)結(jié)構(gòu)INTCHESS6488三維數(shù)組第一個元素代表64個位置的落子狀態(tài),第二元素代表棋盤X坐標(biāo),第三元素代表棋盤Y坐標(biāo)。三維數(shù)組的存儲情況如下所示012345670XXXXXXXX071XXXXXXXX8152XXXXXXXX16233XXXXXXXX24314XXXXXXXX32395XXXXXXXX40476XXXXXXXX48557XXXXXXXX5663圖34落子位置示意圖其中“X”表示棋盤上8X8個棋格,數(shù)字表示三維數(shù)組的下標(biāo)。INTDIR821,0,1,1,0,1,1,1,1,0,1,1,0,1,1,1DIR數(shù)組表示“橫豎撇捺”四個方向要位移的下標(biāo)。例如CHESSBOARDTEMP_XDIR00,TEMP_YDIR01就是橫方向向右移一位。CHESSBOARDTEMP_XDIR10,TEMP_YDIR11就是橫方向向右移一位的同時縱方向向下移一位。棋盤數(shù)組上每一元素可以是黑棋子、白棋子和空棋格3種情況ENUMGRIDSTATEBLACK,WHITE,EMPTY假設(shè)CHESSBOARDGRIDSTATECURRENTROLE0為黑色棋子。假如CHESSBOARDTEMP_XDIR00,TEMP_YDIR01CHESSBOARDEMPTY,表示X位置橫方向向右移一位是空棋格。假如CHESSBOARDTEMP_XDIR00,TEMP_YDIR01CURRENTROLE,表示X位置橫方向向右移一位是黑色棋子。假如CHESSBOARDTEMP_XDIR00,TEMP_YDIR01CURRENTROLE,表示X位置橫方向向右移一位是白色棋子。其中,需要特別注意的是,構(gòu)造的三維數(shù)組,可能會造成數(shù)組的越界,通過IF語句加強判斷,能有效地解決數(shù)組越界問題。從上面三位數(shù)組數(shù)據(jù)結(jié)構(gòu)和枚舉類型中,我們發(fā)現(xiàn)數(shù)據(jù)冗余量較大,BYTE是一個字節(jié)8位,2的8次方等于256,可以代表256種情況,而我們只用存儲黑、白、空三種情況所以存在大量數(shù)據(jù)冗余,所以在此我們可以嘗試一種新的存貯方法按位存儲棋子信息的數(shù)據(jù)結(jié)構(gòu)。在本輪文將給出思路而不進(jìn)行實現(xiàn)。具體的思路就是,使用兩個64位的無符號整形數(shù),一個保存黑棋的情況,另一個保存白棋的情況。64位剛好保存8X8的棋盤格子。DEFINEBITBOARDUNSIGNEDLONGLONGBITBOARDBLACKBITBOARDWHITE如果某格上為黑棋,那么BITBOARDBLACK對應(yīng)標(biāo)志位為1,其余位為0;如果某格上為白棋,那么BITBOARDWHITE對應(yīng)標(biāo)志位為1,其余位為0。對應(yīng)黑棋和白棋的情況,初始局面的位圖情況如圖35所示圖35數(shù)據(jù)結(jié)構(gòu)示意圖33設(shè)計系統(tǒng)的現(xiàn)實意義黑白棋由于其規(guī)則簡單,搜索規(guī)模較小等特點,特別適合于研究和測試算法使用。黑白棋編程被譽為博弈人工智能界的“果蠅”,可以在黑白棋的編程上試驗各種各樣的新的人工智能方面的研究的新技術(shù)與新方法。由于黑白棋只有64格,開局已經(jīng)有四個棋子,按照游戲規(guī)則60步就可以下完一盤。人人隊?wèi)?zhàn)23分鐘可以下完一盤棋,如果設(shè)置雙方都是計算機(jī)的自動隊?wèi)?zhàn)模式,一分鐘內(nèi)可以下完。所以測試起來非常方便,能夠方便地看到人工智能實現(xiàn)的效果。正是由于以上原因,一些算法和思想已經(jīng)首先在黑白棋上得到驗證,比如MPC搜索算法和基于統(tǒng)計和模板匹配的估值函數(shù),對其他棋類也是有相當(dāng)啟發(fā)意義的。黑白棋在人工智能這一領(lǐng)域,相當(dāng)于生物學(xué)中的果蠅和小白鼠,具有相當(dāng)?shù)难芯亢蜏y試意義。4詳細(xì)設(shè)計通過第3章的描述,黑白棋設(shè)計思路已經(jīng)確定,現(xiàn)在要做的就是把設(shè)計結(jié)果翻譯成專用的程序設(shè)計語言所書寫的程序。編碼是對設(shè)計的進(jìn)一步具體化,本部分的質(zhì)量取決于前期設(shè)計的質(zhì)量,但是,所選設(shè)計語言的特點及編碼風(fēng)格也會對程序的可靠性、可讀性、可測試性和可維護(hù)性產(chǎn)生影響。41界面設(shè)計本程序界面采用QTDESIGNER設(shè)計。界面由QWIDGET控件、QLCDNUMBER控件、SPACER控件、QPUSHBUTTON控件和QHBOXLAYOUT控件組成。界面效果如圖41所示。圖41界面效果圖如圖41所示,整體界面包含三大部分,第一部分是由布局類QHBOXLAYOUT包含的三個QLCDNUMBER類,分別表示黑棋計數(shù)、倒計時和白棋計數(shù)。第二部分是繼承于QWIDGET類的CHESSBOARD類主要實現(xiàn)棋盤的繪制。第三部分是由布局類QHBOXLAYOUT包含的11個QPUSHBUTTON,在不同情況下實現(xiàn)按鈕的隱藏和顯示。CHESSBOARDCPP下面主要介紹繼承于QWIDGET類的CHESSBOARD類,該類實現(xiàn)了88棋盤和初始化棋盤的繪制。接下來,主要說明實現(xiàn)CHESSBOARD類的主要函數(shù)的實現(xiàn)。析構(gòu)函數(shù)CHESSBOARDCHESSBOARDQWIDGETPARENTQWIDGETPARENTSETMOUSETRACKING這個屬性保存的是窗口部件跟蹤鼠標(biāo)是否生效。如果鼠標(biāo)跟蹤失效(默認(rèn)),當(dāng)鼠標(biāo)被移動的時侯只有在至少一個鼠標(biāo)按鍵被按下時,這個窗口部件才會接收鼠標(biāo)移動事件。如果鼠標(biāo)跟蹤生效,如果沒有按鍵被按下,這個窗口部件也會接收鼠標(biāo)移動事件。本程序由函數(shù)VOIDCHESSBOARDPAINTEVENTQPAINTEVENTE繪制棋盤,以下為采用函數(shù)及其功能介紹VOIDQPAINTERDRAWPIXMAPINTX,INTY,INTWIDTH,INTHEIGHT,CONSTQPIXMAP/黑子初始化WHITE_NUM0/白子初始化QPAINTERPTHIS/QPENPENPENSETSTYLEQTSOLIDLINE/實線畫筆PENSETCOLORQCOLOR0,0,0/INTROW8INTXTHISWIDTHINTYTHISHEIGHTINTSIZEIFXYSIZEYELSESIZEXTHISRESIZESIZE,SIZE/正方形棋盤PDRAWPIXMAP0,0,THISWIDTH,THISHEIGHT,QPIXMAP“/IMAGES/BACKGROUNDJPG“XTHISWIDTHYTHISHEIGHTTHISGRIDY/ROW/每個格子的邊長INTLINEWIDTHGRID/15/畫筆像素PENSETWIDTHLINEWIDTHTHISSTARXY/GRID/2THISSTARYY/GRID/2INTXENDYSTARXINTYENDTHISSTARYPSETPENPENINTIFORI0ISTARX,THISSTARY,XEND,YENDTHISSTARYGRIDYENDGRID/畫九條橫線THISSTARXY/GRID/2THISSTARYY/GRID/2XENDTHISSTARXYENDYTHISSTARXFORI0ISTARX,THISSTARY,XEND,YENDTHISSTARXGRIDXENDGRID/畫九條豎線THISSTARXY/GRID/2THISSTARYY/GRID/2TYPEDEFINTPERROW/QSTACKSTACKFORI0ISTARXLINEWIDTHGRIDI,THISSTARYLINEWIDTHGRIDJ,GRID2LINEWIDTH,GRID2LINEWIDTH,QPIXMAP“/IMAGES/BLACKPNG“BLACK_NUM/畫黑棋ELSEIFPERCHESSMANINFOIJWHITEPDRAWPIXMAPTHISSTARXLINEWIDTHGRIDI,THISSTARYLINEWIDTHGRIDJ,GRID2LINEWIDTH,GRID2LINEWIDTH,QPIXMAP“/IMAGES/WHITEPNG“WHITE_NUM/畫白棋EMITCHESSNUMQPOINTBLACK_NUM,WHITE_NUM【函數(shù)功能】獲得棋盤落子坐標(biāo)【參數(shù)】QMOUSEEVENTE【返回值】信號X,Y棋盤坐標(biāo)VOIDCHESSBOARDMOUSEPRESSEVENTQMOUSEEVENTEINTXEXINTYEYINTROW8IFXTHISSTARXYYTHISSTARY/GRIDEMITPRESSPOINTQPOINTX,Y/信號發(fā)射【函數(shù)功能】槽函數(shù),實現(xiàn)倒計時及判斷勝負(fù)VOIDWIDGETTIMERSLOTUILCDNUMBER_TIMERDISPLAYNUMNUMIFNUM4QPALETTEPPSETCOLORQPALETTEWINDOWTEXT,QCOLOR0,0,255PSETCOLORQPALETTEWINDOW,QCOLOR255,0,0UILCDNUMBER_TIMERSETPALETTEPIFNUM1NUM0TIMERSTOPINTBUTTONBUTTONQMESSAGEBOXQUESTIONTHIS,“提示信息“,“游戲超時N是否繼續(xù)游戲YES繼續(xù),NO重來“,QMESSAGEBOXYES|QMESSAGEBOXNOSWITCHBUTTONCASEQMESSAGEBOXYESTIMERSTART1000NUM30CURRENTROLECHESSBOARDGRIDSTATECURRENTROLE/邏輯取反,選擇YES后,將是對手回合IFCURRENTROLE0QPALETTEPPSETCOLORQPALETTEWINDOW,QCOLOR0,0,0PSETCOLORQPALETTEWINDOWTEXT,QCOLOR255,255,255UILCDNUMBER_TIMERSETPALETTEPUILCDNUMBER_BLACKDISPLAY10UILCDNUMBER_WHITEDISPLAY5NUM30ELSEIFCURRENTROLE1QPALETTEPPSETCOLORQPALETTEWINDOW,QCOLOR255,255,255PSETCOLORQPALETTEWINDOWTEXT,QCOLOR0,0,0UILCDNUMBER_TIMERSETPALETTEPUILCDNUMBER_WHITEDISPLAY10NUM30IFAUTOCHESSIFTHISBLACKNUMBERTHISWHITENUMBERTHISINITNUM30TIMERSTOPQMESSAGEBOXINFORMATIONTHIS,“提示信息“,“黑方獲勝“ELSETHISINITNUM30TIMERSTOPQMESSAGEBOXINFORMATIONTHIS,“提示信息“,“白方獲勝“BREAKCASEQMESSAGEBOXNONUM30THISINITTIMERSTART1000UIPUSHBUTTON_GOHIDEUIPUSHBUTTON_STOPSHOWIFCURRENTROLE0QPALETTEPPSETCOLORQPALETTEWINDOW,QCOLOR0,0,0PSETCOLORQPALETTEWINDOWTEXT,QCOLOR255,255,255UILCDNUMBER_TIMERSETPALETTEPUILCDNUMBER_BLACKDISPLAY10UILCDNUMBER_WHITEDISPLAY5NUM30ELSEIFCURRENTROLE1QPALETTEPPSETCOLORQPALETTEWINDOW,QCOLOR255,255,255PSETCOLORQPALETTEWINDOWTEXT,QCOLOR0,0,0UILCDNUMBER_TIMERSETPALETTEPUILCDNUMBER_WHITEDISPLAY10NUM30BREAKDEFAULTBREAK/【函數(shù)功能】槽函數(shù),接收棋盤鼠標(biāo)事件/【參數(shù)】QPOINTCHESSNUM,棋盤的X,Y軸坐標(biāo)/【返回值】無VOIDWIDGETDO_PRESSPOINTQPOINTPOINTIFSTARFIG1/按下開始鍵INTROW8QDEBUGLCDNUMBER_TIMERSETPALETTEPNUM30ELSEIFCURRENTROLE1QPALETTEPPSETCOLORQPALETTEWINDOW,QCOLOR255,255,255PSETCOLORQPALETTEWINDOWTEXT,QCOLOR0,0,0UILCDNUMBER_TIMERSETPALETTEPNUM30ELSEUPDATEELSEIFSTARFIG3QMESSAGEBOXINFORMATIONTHIS,“幫助信息“,“請選擇對戰(zhàn)模式“ELSEIFSTARFIG2QMESSAGEBOXINFORMATIONTHIS,“幫助信息“,“請選擇按開始按鈕開始游戲“ELSEIFSTARFIG0QMESSAGEBOXINFORMATIONTHIS,“幫助信息“,“游戲已暫停按繼續(xù)按鈕,繼續(xù)“/【函數(shù)功能】人機(jī)對戰(zhàn)時機(jī)器計算落子坐標(biāo)/【參數(shù)】INTX,INTY,INTGRIDNUM,VOIDCHESS,CHESSBOARDGRIDSTATECURRENTROLE/【返回值】RETURNEATNUM吃子數(shù)量INTWIDGETCHESSOUTOINTX,INTY,INTGRIDNUM,VOIDCHESS,CHESSBOARDGRIDSTATECURRENTROLEINTTEMP_XX,TEMP_YYINTI0,EATNUM0TYPEDEFINTPGRIDNUM/自定義類型PCHESSBOARDPCHESS/類型轉(zhuǎn)換INTROW8IFCHESSBOARDTEMP_XTEMP_YCHESSBOARDEMPTY/如果此方格內(nèi)已有棋子,返回RETURN0FORI0I0TEMP_YDIRI1/繼續(xù)判斷下一個WHILETEMP_X0IFCHESSBOARDTEMP_XTEMP_YCURRENTROLE/可以吃子CHESSBOARDXYCURRENTROLETEMP_XDIRI0TEMP_YDIRI1WHILETEMP_XX|TEMP_YY/吃子CHESSBOARDTEMP_XTEMP_YCURRENTROLETEMP_XDIRI0TEMP_YDIRI1EATNUMBREAKTEMP_XDIRI0TEMP_YDIRI1TEMP_XXTEMP_YYRETURNEATNUM/【函數(shù)功能】下棋規(guī)則/【參數(shù)】INTX,INTY,INTGRIDNUM,VOIDCHESS,CHESSBOARDGRIDSTATECURRENTROLE/【返回值】RETURNEATNUM吃子數(shù)量INTWIDGETCHESSRULEINTX,INTY,INTGRIDNUM,VOIDCHESS,CHESSBOARDGRIDSTATECURRENTROLEINTTEMP_XX,TEMP_YYINTI0,EATN

溫馨提示

  • 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

提交評論