版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、畢業(yè)設(shè)計(jì)論文(潘登).doc(1)原創(chuàng)本文轉(zhuǎn)自同名word的無(wú)格式文檔,復(fù)制到此,無(wú)法保持原有格式,在此給大家閱讀造成不便,敬請(qǐng)包涵! 封面中原工學(xué)院信息商務(wù)學(xué)院畢業(yè)設(shè)計(jì)(論文)此封面系里統(tǒng)一發(fā)題 目:專 業(yè):班 級(jí):學(xué) 號(hào):學(xué)生姓名:指導(dǎo)教師:年 月 日 Linux下基于QT的黑白棋游戲軟件設(shè)計(jì)與實(shí)現(xiàn)Black & white chess game software based on QT under Linux design and implementation專 業(yè):計(jì)算機(jī)科學(xué)技術(shù)系班 級(jí):網(wǎng)絡(luò)051學(xué) 號(hào):200580124114學(xué)生姓名:潘登指導(dǎo)教師:王璐2009 年 5 月 5 日
2、摘 要本程序使用面向?qū)ο蟮腝T庫(kù)的C+語(yǔ)言,開發(fā)于可以同時(shí)運(yùn)行于Linux和Windows環(huán)境下的游戲程序。有雙人對(duì)弈,人機(jī)對(duì)弈,無(wú)限悔棋等功能,其中人機(jī)對(duì)弈包含難度選擇和先后手選擇。本論文首先指出了黑白棋游戲、Linux桌面環(huán)境、QT開發(fā)環(huán)境的發(fā)展現(xiàn)狀,然后重點(diǎn)介紹了QT開發(fā)工具的使用、黑白棋的常見戰(zhàn)術(shù)、黑白棋程序的界面設(shè)計(jì)、規(guī)則設(shè)計(jì)、算法設(shè)計(jì)(包含搜索算法、局面估值、-減枝、散列表、MTD等當(dāng)今主流算法)、終局搜索、以及作為一款游戲的其他必須功能,最后介紹了Linux桌面環(huán)境 GUI的發(fā)展趨勢(shì)。本設(shè)計(jì)通過(guò)一個(gè)棋類游戲的開發(fā),闡述了棋類游戲的開發(fā)過(guò)程,包括軟件開發(fā)的邏輯分析,程序設(shè)計(jì),軟件實(shí)
3、現(xiàn)和軟件測(cè)試幾個(gè)步驟。關(guān)鍵詞: 黑白棋;Linux;人工智能;QTAbstractThis programme used QT Object-Oriented Database C+ language, develops the game which can be run on Linux and Windows environments. has doubles plays , man-machine plays, retract a false move in a chess game boundlessly waiting for a function. Single mode cont
4、ains degree of difficulty choosing and choosing successively personally.The thesis has pointed out first the Othello, the Linux desktop environment, the development status of QT develop. Then, focuses on the use of QT development tools, Othello common tactical, Othello program interface design, desi
5、gn of rules, algorithm design (including search algorithms, the valuation of the situation, - by sticks, Hash table, MTD algorithm, such as todays mainstream), final search, and as well as other games functions. Finally, introduce the GUI desktop environment for Linux development trends.This design
6、through the development of a chess game, described the development of chess games, including logic analyzer of software development, programming, software achieve and Software Testing, and so on.Key words : black & white chess; Linux; AI; QT目 錄摘 要 IAbstract II目 錄 III第1章 緒 論 11.1黑白棋開發(fā)背景 11.2黑白棋游戲簡(jiǎn)介 2
7、1.2.1黑白棋規(guī)則 21.2.2黑白棋戰(zhàn)術(shù)分析 21.3相關(guān)實(shí)現(xiàn)環(huán)境 31.3.1 開發(fā)環(huán)境 41.3.2 運(yùn)行環(huán)境 41.3.3 硬件環(huán)境 41.4 主要研究?jī)?nèi)容 41.5 系統(tǒng)開發(fā)的現(xiàn)實(shí)意義 5第2章 開發(fā)工具QT 62.1 QT簡(jiǎn)介 62.2 QT的使用 62.3 信號(hào)與槽 8第3章 黑白棋需求分析 113.1 黑白棋程序界面的需求 113.1.1 調(diào)查對(duì)比同類軟件 113.1.2 確定需求 143.2 黑白棋游戲規(guī)則的需求 143.3 黑白棋程序的其它需求 15第4章 黑白棋程序設(shè)計(jì) 164.1 程序流程圖 164.2 主要模塊簡(jiǎn)介 17第5章 程序?qū)崿F(xiàn) 195.1 界面實(shí)現(xiàn) 195
8、.2 功能按鈕的實(shí)現(xiàn) 215.3 程序主要函數(shù) 235.4 電腦戰(zhàn)術(shù)分析 265.4.1 棋盤掃描 265.4.2判斷行動(dòng)力 265.4.3 四角優(yōu)先戰(zhàn)術(shù) 275.4.4 選擇最佳位置落子 27第6章 系統(tǒng)測(cè)試 286.1雙人模式下的測(cè)試 286.1.1 悔棋和悔棋恢復(fù)測(cè)試 286.1.2 PASS情況下的悔棋恢復(fù) 306.1.3 游戲規(guī)則測(cè)試 316.1.4 終局測(cè)試 316.2 單人模式下的測(cè)試 326.2.1 PASS情況的測(cè)試 326.2.2 游戲正常測(cè)試 326.2.3 悔棋測(cè)試 326.3 綜合測(cè)試報(bào)告 32第7章 總結(jié)和展望 337.1 總結(jié) 337.2展望 337.2.1 人工
9、智能展望 337.2.2 Linux GUI展望 34致 謝 35參考文獻(xiàn) 36附 錄 37附錄A: 主要源程序 37第1章 緒 論本章概述了黑白棋游戲開發(fā)的意義,以及對(duì)黑白棋的基本知識(shí)和相關(guān)開發(fā)環(huán)境做了一個(gè)簡(jiǎn)介。1.1黑白棋開發(fā)背景隨著網(wǎng)絡(luò)技術(shù)的日新月異和計(jì)算機(jī)的普及,當(dāng)今的計(jì)算機(jī)技術(shù)也走上了平民化和娛樂化的時(shí)代,計(jì)算機(jī)技術(shù)再也不是只能由少數(shù)人掌握的深不可測(cè)的學(xué)問;同時(shí)個(gè)人計(jì)算機(jī)也由原來(lái)單純的數(shù)值計(jì)算和工業(yè)應(yīng)用逐漸轉(zhuǎn)變成像電視機(jī)一樣的家庭娛樂中心,伴隨著這種巨大的轉(zhuǎn)變計(jì)算機(jī)軟件的發(fā)展也走向了娛樂化。尤其是游戲產(chǎn)業(yè)的發(fā)展已經(jīng)成為信息產(chǎn)業(yè)中發(fā)展勢(shì)頭最猛烈最具前景的一個(gè)分支,而游戲廳也漸漸被網(wǎng)吧擠
10、出了正常的營(yíng)業(yè)市場(chǎng),游戲除了單純的個(gè)人娛樂功能之外,也逐漸向互動(dòng)的方向發(fā)展。游戲的功能不斷按照玩家的需求和愛好擴(kuò)展延伸進(jìn)化,如今運(yùn)行在各種平臺(tái)上不同名稱,不同內(nèi)容,不同形式的游戲不僅僅為廣大游戲愛好者提供了豐富的選擇,而且為游戲開發(fā)商帶來(lái)了豐厚的回報(bào),游戲產(chǎn)業(yè)吸引著許多程序員去開發(fā)更多更新的游戲。基于游戲發(fā)展的歷史和前景,我決定用C+語(yǔ)言開發(fā)一款小游戲,游戲內(nèi)容來(lái)自網(wǎng)絡(luò)上日漸流行的一種智力游戲黑白棋。我希望把平時(shí)界面簡(jiǎn)單、選項(xiàng)復(fù)雜的游戲,在Linux里面做成漂亮的、簡(jiǎn)單的游戲程序,以給Linux玩家一個(gè)新的選擇。人工智能是一門極富挑戰(zhàn)性的科學(xué),包括十分廣泛的科學(xué),它由不同的領(lǐng)域組成,如機(jī)器學(xué)習(xí)
11、,計(jì)算機(jī)視覺等等,總的說(shuō)來(lái),人工智能研究的一個(gè)主要目標(biāo)是使機(jī)器能夠勝任一些通常需要人類智能才能完成的復(fù)雜工作。但不同的時(shí)代、不同的人對(duì)這種“復(fù)雜工作”的理解是不同的。例如繁重的科學(xué)和工程計(jì)算本來(lái)是要人腦來(lái)承擔(dān)的, 現(xiàn)在計(jì)算機(jī)不但能完成這種計(jì)算, 而且能夠比人腦做得更快、更準(zhǔn)確, 因而當(dāng)代人已不再把這種計(jì)算看作是“需要人類智能才能完成的復(fù)雜任務(wù)”, 可見復(fù)雜工作的定義是隨著時(shí)代的發(fā)展和技術(shù)的進(jìn)步而變化的, 人工智能這門科學(xué)的具體目標(biāo)也自然隨著時(shí)代的變化而發(fā)展。它一方面不斷獲得新的進(jìn)展, 一方面又轉(zhuǎn)向更有意義、更加困難的目標(biāo)。目前能夠用來(lái)研究人工智能的主要物質(zhì)手段以及能夠?qū)崿F(xiàn)人工智能技術(shù)的機(jī)器就是
12、計(jì)算機(jī), 人工智能的發(fā)展歷史是和計(jì)算機(jī)科學(xué)與技術(shù)的發(fā)展史聯(lián)系在一起的。除了計(jì)算機(jī)科學(xué)以外, 人工智能還涉及信息論、控制論、自動(dòng)化、仿生學(xué)、生物學(xué)、心理學(xué)、數(shù)理邏輯、語(yǔ)言學(xué)、醫(yī)學(xué)和哲學(xué)等多門學(xué)科。隨著計(jì)算機(jī)處理速度的飛速提高,人們很早就提出了疑問:計(jì)算機(jī)是否會(huì)超越人類?世界國(guó)際象棋棋王卡斯帕羅夫與美國(guó)IBM公司的RS6000(深藍(lán))計(jì)算機(jī)系統(tǒng)于1997年5月11日進(jìn)行了六局“人機(jī)大戰(zhàn)”,結(jié)果“深藍(lán)”以3.5比2.5的總比分獲勝。比賽結(jié)束了給人們留下了深刻的思考;下棋要獲勝要求選手要有很強(qiáng)的思維能力、記憶能力、豐富的下棋經(jīng)驗(yàn),還得及時(shí)做出反應(yīng),迅速進(jìn)行有效的處理,否則一著出錯(cuò)滿盤皆輸,這顯然是個(gè)“
13、智能”問題。盡管開發(fā)“深藍(lán)”計(jì)算機(jī)的IBM專家也認(rèn)為它離智能計(jì)算機(jī)還相差甚遠(yuǎn),但它以高速的并行的計(jì)算能力(2r108步秒棋的計(jì)算速度)。實(shí)現(xiàn)了人類智力的計(jì)算機(jī)上的部分模擬。那么計(jì)算機(jī)已經(jīng)超過(guò)了人類嗎?看完本文,相信你會(huì)對(duì)計(jì)算機(jī)棋手的智能有所了解。1.2黑白棋游戲簡(jiǎn)介黑白棋,又叫反棋(Reversi)、奧賽羅棋(Othello),蘋果棋,翻轉(zhuǎn)棋。黑白棋起源中世紀(jì)的英國(guó),18世紀(jì)傳入日本,并在日本得到了發(fā)展?,F(xiàn)在,黑白棋在西方和日本很流行。游戲通過(guò)相互翻轉(zhuǎn)對(duì)方的棋子,最后以棋盤上誰(shuí)的棋子多來(lái)判斷勝負(fù)。它的游戲規(guī)則簡(jiǎn)單,因此上手很容易,但是它的變化又非常復(fù)雜。有一種說(shuō)法是:只需要幾分鐘學(xué)會(huì)它,卻需要
14、一生的時(shí)間去精通它。黑白棋不僅能增強(qiáng)思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。黑白棋既有現(xiàn)代休閑的明顯特征“短、平、快”,又有古典哲學(xué)的高深學(xué)問“陰陽(yáng)易理”;它既有簡(jiǎn)單易學(xué)的特性,為人民群眾所喜聞樂見,又有深?yuàn)W的技巧和高水平的國(guó)際性比賽;它的棋文化源淵流長(zhǎng),具有東方的神秘和西方的直觀;既有“場(chǎng)”的概念,亦有“點(diǎn)”的連接。它是中西文化的交流點(diǎn),是古今哲理的結(jié)晶。1.2.1黑白棋規(guī)則1兩人對(duì)弈,以輪流方式持黑子與白子。2開辟新局者持白子,加入者持黑子, 之后以輪流方式將棋子置于棋盤格子中。若無(wú)地方可下子,則跳過(guò)一回,由對(duì)方下子。3在提示的格子中,選擇一個(gè)格子下子, 當(dāng)下子的位置與離最近的同
15、色旗子中, 若有其他棋子則中間的棋子變?yōu)榕c我方一樣顏色。4當(dāng)下滿64個(gè)棋子,棋子多者為勝。1.2.2黑白棋戰(zhàn)術(shù)分析黑白棋規(guī)則規(guī)定對(duì)局結(jié)束時(shí)子多的一方為勝方,于是初學(xué)者通常會(huì)一開始使勁吃子,這實(shí)際上是犯了短視的錯(cuò)誤。每一步都盡可能吃更多的子,我們把這種下法叫做大食策略(MAXIMUM DISC STRATEGY)。除了大食策略以外,還有其它幾種常用的策略以及重要位置和術(shù)語(yǔ),它們是:穩(wěn)定子 - 位置策略(STABLE DISCS - POSITIONAL STRATEGY)楔入(WEDGES)行動(dòng)力策略(MOBILITY)余裕手(TEMPO,WAITING MOVES)爬邊(CREEPING AL
16、ONG EDGES) 奇偶性(PARITY) 非平衡邊(UNBALANCED EDGES)四通陷阱(STONER TRAPS)從黑白棋的游戲規(guī)則上看,應(yīng)該盡量使自己的棋子多于對(duì)手的,很容易就得到了一個(gè)戰(zhàn)術(shù),就是每步棋都落在能吃掉對(duì)手棋子最多的位置,但是經(jīng)過(guò)幾局后,你就會(huì)發(fā)現(xiàn)這并不是一個(gè)好的方法。那么黑白棋的正確戰(zhàn)術(shù)應(yīng)該是怎樣的呢?一般說(shuō)來(lái),下棋過(guò)程中,你必須盡量削減對(duì)手的行動(dòng)力,同時(shí)增加自己的行動(dòng)力,這種策略我們稱之為行動(dòng)力原則(或行動(dòng)力戰(zhàn)術(shù))。當(dāng)一方達(dá)到或接近這個(gè)目標(biāo)時(shí),我們就稱該棋手控制了棋局。另外,這個(gè)戰(zhàn)術(shù)的目的是迫使對(duì)方下壞棋,如果對(duì)方雖然可選位置很少,但每一步卻總有好棋,那戰(zhàn)術(shù)目的就
17、沒有達(dá)成。記住,你必須讓對(duì)方完全無(wú)好棋可下。 黑白棋規(guī)則規(guī)定只能在對(duì)方棋子相鄰的空位下棋,這就可以推出另一個(gè)原則。對(duì)方棋子邊上的空位越多,你下棋的選擇也就越多,換句話說(shuō),你的行動(dòng)力就越強(qiáng);相反,如果你棋子邊上的空位越少,對(duì)方可下的位置也就越少。我們把相鄰位置上有空位的子稱為外子,反之稱為內(nèi)子,連在一起的外子稱為前線或墻。下棋時(shí)要盡量減少自己的外子。1.3相關(guān)實(shí)現(xiàn)環(huán)境本程序采用QT庫(kù)及其開發(fā)環(huán)境,使用C+語(yǔ)言開發(fā)運(yùn)行于Linux系統(tǒng)KDE桌面環(huán)境下的黑白棋游戲。經(jīng)過(guò)實(shí)際檢測(cè),QT強(qiáng)大的跨平臺(tái)性,已經(jīng)保證了同樣的代碼在Windows XP下、Linux GNOME下、Linux KDE下,幾乎不用
18、修改就能正常運(yùn)行。1.3.1 開發(fā)環(huán)境qt-sdk-linux-x86-opensource-2009.01 (QT4.5)MinGW編譯器1.3.2 運(yùn)行環(huán)境1. Linux環(huán)境Fedora 10 Linux with KDEFedora 10 Linux with Gnome2. Windows環(huán)境Microsoft Windows XP sp21.3.3 硬件環(huán)境AMD Sempron 2600+,1024M內(nèi)存,160G硬盤1.4 主要研究?jī)?nèi)容本文將對(duì)計(jì)算機(jī)棋手下黑白棋做一個(gè)全面綜述,介紹計(jì)算機(jī)對(duì)黑白棋戰(zhàn)術(shù)分析的全過(guò)程,包括對(duì)圖形和動(dòng)畫的處理、對(duì)棋盤搜索的算法、對(duì)棋局做出正確的估計(jì)、并
19、生成最佳走法,并將介紹其中各個(gè)流程的研究狀況及實(shí)用技術(shù)。本文的重點(diǎn)放在計(jì)算機(jī)對(duì)當(dāng)前棋局的分析,并做出最佳的選擇。介紹搜索算法,棋類游戲不可能一步就決出勝負(fù),象棋中不可能第一步就將對(duì)方將死;而對(duì)某個(gè)棋局的判斷也不可能完全精確,在黑白棋中,初局時(shí)棋子多并不一定最終取得勝利,因?yàn)閷?duì)手可能在后面的博弈過(guò)程中將局面扭轉(zhuǎn)。想想人類下棋時(shí),一般會(huì)假設(shè)我走這步,那么對(duì)手會(huì)怎樣回應(yīng),如果對(duì)手回應(yīng)了某一步,我再走哪一步,如果對(duì)手回應(yīng)了另外某一步,我又該怎么走;然后再假設(shè)我走另外的某一步,如此反復(fù)下去。這個(gè)過(guò)程叫做搜索。1.5 系統(tǒng)開發(fā)的現(xiàn)實(shí)意義利用這次畢業(yè)設(shè)計(jì)的機(jī)會(huì)可以熟悉c+語(yǔ)言的各種特性,鍛煉程序設(shè)計(jì)的實(shí)踐能
20、力,熟悉c+語(yǔ)言Linux下的開發(fā)環(huán)境,熟悉前沿的Linux圖形用戶界面的開發(fā),以及鞏固數(shù)據(jù)結(jié)構(gòu)和算法等課程的學(xué)習(xí)成果,并深入理解數(shù)據(jù)結(jié)構(gòu)和算法在程序設(shè)計(jì)中的核心地位。同時(shí),借助開發(fā)本游戲的過(guò)程,可以熟悉人工智能的程序?qū)崿F(xiàn),有助于掌握棋類所需人工智能的常見算法,隨著游戲產(chǎn)業(yè)的日益壯大,人工智能在游戲中的突出表現(xiàn),人工智能越來(lái)越得到世人的重視。在這次的人機(jī)對(duì)戰(zhàn)算法中,通過(guò)一定的算法,實(shí)現(xiàn)電腦的下棋及走棋運(yùn)作,加深了對(duì)人工智能工作原理的了解。 綜上所述,通過(guò)每次黑白棋的開發(fā),可以深入了解Linux編程方法、加深了解AI算法。第2章 開發(fā)工具QT2.1 QT簡(jiǎn)介Qt是一個(gè)跨平臺(tái)的C+圖形用戶界面庫(kù),
21、由挪威TrollTech公司出品,目前包括Qt, 基于Framebuffer的Qt Embedded,快速開發(fā)工具Qt Designer,國(guó)際化工具 Qt Linguist等部分Qt支持所有Unix系統(tǒng),當(dāng)然也包括 Linux,還支持 WinNT/Win2k,Win95/98 平臺(tái)。1Qt是一個(gè)多平臺(tái)的C+圖形用戶界面應(yīng)用程序框架。它提供給應(yīng)用程序開發(fā)者建立藝術(shù)級(jí)的圖形用戶界面所需的所用功能。Qt是完全面向?qū)ο蟮暮苋菀讛U(kuò)展,并且允許真正地組件編程。自從1996年早些時(shí)候,Qt進(jìn)入商業(yè)領(lǐng)域,它已經(jīng)成為全世界范圍內(nèi)數(shù)千種成功的應(yīng)用程序的基礎(chǔ)。Qt也是流行的Linux桌面環(huán)境KDE 的基礎(chǔ),KDE是
22、所有主要的Linux發(fā)行版的一個(gè)標(biāo)準(zhǔn)組件?;旧希琎t同X Window上的Motif、Openwin、GTK等圖形界面庫(kù)和Windows 平臺(tái)上的MFC、OWL、VCL、ATL是同類型的東西,但是Qt具有下列優(yōu)點(diǎn):優(yōu)良的跨平臺(tái)特性:Qt支持下列操作系統(tǒng): Microsoft Windows 95/98、 Microsoft Windows NT、 linux、Solaris、SunOS、HP-UX、Digital UNIX (OSF/1、Tru64)、Irix、FreeBSD, BSD/OS、SCO、AIX、OS390、QNX 等等。面向?qū)ο螅篞t 的良好封裝機(jī)制使得Qt的模塊化程度非常高,
23、可重用性較好,對(duì)于用戶開發(fā)來(lái)說(shuō)是非常方便的。Qt提供了一種稱為signals/slots的安全類型來(lái)替代 callback,這使得各個(gè)元件之間的協(xié)同工作變得十分簡(jiǎn)單。豐富的API:Qt 包括多達(dá)250個(gè)以上的C+類,還提供基于模板的collections、 serialization、file、I/O device、Directory management、date/time 類。甚至還包括正則表達(dá)式的處理功能。支持2D/3D圖形渲染,支持OpenGL。2.2 QT的使用本文以一個(gè)最常用的例子HelloWorld的開發(fā)過(guò)程,作為QT編程的入門。2需要的代碼如下:#include #includ
24、e Int main( int argc, char *argv ) QApplication a( argc, argv ); QPushButton hello( Hello world!, 0 ); hello.resize( 300, 100 ); a.setMainWidget( &hello ); hello.show(); return a.exec(); #include 代碼解釋:這一行包含了QApplication類的定義。在每一個(gè)使用Qt的應(yīng)用程序中都必須使用一個(gè)QApplication對(duì)象。QApplication管理了各種各樣的應(yīng)用程序的廣泛資源,比如默認(rèn)的字體和光標(biāo)
25、。 #include 這一行包含了QPushButton類的定義。參考文檔的文件的最上部分提到了使用哪個(gè)類就必須包含哪個(gè)頭文件的說(shuō)明。 QPushButton是一個(gè)經(jīng)典的圖形用戶界面按鈕,用戶可以按下去,也可以放開。它管理自己的觀感,就像其它每一個(gè)QWidget。一個(gè)窗口部件就是一個(gè)可以處理用戶輸入和繪制圖形的用戶界面對(duì)象。程序員可以改變它的全部觀感和它的許多主要的屬性(比如顏色),還有這個(gè)窗口部件的內(nèi)容。一個(gè)QPushButton可以顯示一段文本或者一個(gè)QPixmap。 int main( int argc, char *argv )main()函數(shù)是程序的入口。幾乎在使用Qt的所有情況下,
26、main()只需要在把控制轉(zhuǎn)交給Qt庫(kù)之前執(zhí)行一些初始化,然后Qt庫(kù)通過(guò)事件來(lái)向程序告知用戶的行為。argc是命令行變量的數(shù)量,argv是命令行變量的數(shù)組。這是一個(gè)C/C+特征。它不是Qt專有的,無(wú)論如何Qt需要處理這些變量。 QApplication a( argc, argv )a是這個(gè)程序的QApplication。它在這里被創(chuàng)建并且處理這些命令行變量(比如在X窗口下的-display)。請(qǐng)注意,所有被Qt識(shí)別的命令行參數(shù)都會(huì)從argv中被移除(并且argc也因此而減少)。接下來(lái)是編譯:編譯一個(gè)C+應(yīng)用程序,你需要?jiǎng)?chuàng)建一個(gè)makefile。創(chuàng)建一個(gè)Qt的makefile的最容易的方法是使
27、用Qt提供的連編工具qmake。如果你已經(jīng)把main.cpp保存到它自己的目錄了,你所要做的就是這些: qmake *.promake 第一個(gè)命令調(diào)用qmake來(lái)生成一個(gè).pro(項(xiàng)目)文件。第二個(gè)命令根據(jù)這個(gè)項(xiàng)目文件來(lái)生成一個(gè)(系統(tǒng)相關(guān)的)makefile。你現(xiàn)在可以輸入make,然后運(yùn)行你的第一個(gè)Qt應(yīng)用程序! 運(yùn)行后效果如圖2-1所示圖2-1 QT開發(fā)的Hello World2.3 信號(hào)與槽QT不同于其他開發(fā)工具的一個(gè)重要特點(diǎn),就是信號(hào)與槽。信號(hào)和槽用于對(duì)象間的通訊。信號(hào)/槽機(jī)制是Qt的一個(gè)中心特征并且也許是Qt與其它工具包的最不相同的部分。3在圖形用戶界面編程中,我們經(jīng)常希望一個(gè)窗口部
28、件的一個(gè)變化被通知給另一個(gè)窗口部件。更一般地,我們希望任何一類的對(duì)象可以和其它對(duì)象進(jìn)行通訊。例如,如果我們正在解析一個(gè)XML文件,當(dāng)我們遇到一個(gè)新的標(biāo)簽時(shí),我們也許希望通知列表視圖我們正在用來(lái)表達(dá)XML文件的結(jié)構(gòu)。圖 2-2 一個(gè)關(guān)于一些信號(hào)和槽連接的摘要圖在Qt中我們有一種可以替代回調(diào)的技術(shù)。我們使用信號(hào)和槽。當(dāng)一個(gè)特定事件發(fā)生的時(shí)候,一個(gè)信號(hào)被發(fā)射。Qt的窗口部件有很多預(yù)定義的信號(hào),但是我們總是可以通過(guò)繼承來(lái)加入我們自己的信號(hào)。槽就是一個(gè)可以被調(diào)用處理特定信號(hào)的函數(shù)。Qt的窗口部件又很多預(yù)定義的槽,但是通常的習(xí)慣是你可以加入自己的槽,這樣你就可以處理你所感興趣的信號(hào)。 信號(hào)和槽的機(jī)制是類型
29、安全的:一個(gè)信號(hào)的簽名必須與它的接收槽的簽名相匹配。(實(shí)際上一個(gè)槽的簽名可以比它接收的信號(hào)的簽名少,因?yàn)樗梢院雎灶~外的簽名。)因?yàn)楹灻且恢碌?,編譯器就可以幫助我們檢測(cè)類型不匹配。信號(hào)和槽是寬松地聯(lián)系在一起的:一個(gè)發(fā)射信號(hào)的類不用知道也不用注意哪個(gè)槽要接收這個(gè)信號(hào)。Qt的信號(hào)和槽的機(jī)制可以保證如果你把一個(gè)信號(hào)和一個(gè)槽連接起來(lái),槽會(huì)在正確的時(shí)間使用信號(hào)的參數(shù)而被調(diào)用。信號(hào)和槽可以使用任何數(shù)量、任何類型的參數(shù)。它們是完全類型安全的:不會(huì)再有回調(diào)核心轉(zhuǎn)儲(chǔ)(core dump)。圖 2-3 一個(gè)信號(hào)和槽連接的例子 信號(hào)與槽機(jī)制是一個(gè)函數(shù),原型如下:QObject:connect( &a, SIGNA
30、L(funtionA(), &b, SLOT(funtionB() )這一行在兩個(gè)Qt對(duì)象(直接或間接繼承QObject對(duì)象的對(duì)象)中建立了一種單向的連接。每一個(gè)Qt對(duì)象都有signals(發(fā)送消息)和slots(接收消息)。所有窗口部件都是Qt對(duì)象。它們繼承QWidget,而QWidget繼承QObject。該函數(shù)意思是a部件發(fā)出 funtionA()消息,b部件執(zhí)行funtionB()函數(shù)。第3章 黑白棋需求分析為了開發(fā)出真正滿足用戶需求的程序,尤其是游戲程序,首先必須知道用戶的需求。把用戶需求作為前提條件,來(lái)指導(dǎo)程序的開發(fā)。3.1 黑白棋程序界面的需求3.1.1 調(diào)查對(duì)比同類軟件為了獲取
31、一款黑白棋程序需要滿足的功能,我在網(wǎng)上查閱了大量前人做好的黑白棋程序。具有可比性的黑白棋程序有如下幾款,傷心黑白棋(見圖3-1)、億唯黑白棋1.35(見圖3-2)、Monkey黑白棋1.0(見圖3-3)、以及大名鼎鼎的WZebra(見圖3-4)。圖3-1 傷心黑白棋圖3-2 億唯黑白棋1.35圖3-3 Monkey黑白棋1.0圖3.4 WZebra這四款游戲程序都能滿足玩家游戲的基本需求,但是使用起來(lái)還是帶給用戶以不同的體驗(yàn)。傷心黑白棋:界面簡(jiǎn)潔、游戲棋力強(qiáng),具有棋子數(shù)目顯示、顯示上步棋位置、先后手選擇、單人雙人模式、悔棋和悔棋恢復(fù)、難度選擇、提示下棋點(diǎn)、聲音提示、棋盤翻轉(zhuǎn)、棋局保存及讀取等功
32、能。不足之處:悔棋、開局等常用設(shè)置主界面不顯示,使用過(guò)程中要在菜單欄尋找。作為一款游戲,沒有考慮到程序的便捷性。作為一款游戲,界面不夠美觀。億唯黑白棋1.35:界面較為簡(jiǎn)潔、游戲棋力較強(qiáng),具有棋子數(shù)目顯示、顯示上步棋位置、先后手選擇、單人雙人模式、悔棋和悔棋恢復(fù)、難度選擇、提示下棋點(diǎn)、聲音提示、棋盤翻轉(zhuǎn)、棋局保存及讀取、動(dòng)畫翻轉(zhuǎn)棋子、本局棋譜顯示等功能。并在主界面上放置了常用功能按鈕,為用戶操作提供便捷性。不足之處:常用快捷鍵有點(diǎn)多,降低游戲開發(fā)簡(jiǎn)單為好的原則。作為一款游戲,界面不夠美觀。Monkey黑白棋1.0:界面另類,給人以耳目一新的感覺,人機(jī)對(duì)戰(zhàn)中會(huì)給玩家提示電腦認(rèn)為較好的位置。程序功
33、能直觀。沒有菜單欄等的干擾。具有棋子數(shù)目顯示、顯示上步棋位置、先后手選擇、悔棋和悔棋恢復(fù)、難度選擇、提示下棋點(diǎn)、聲音提示等功能。不足之處:作為一款游戲,大膽使用透明界面,無(wú)形中就增加了游戲的樂趣,但布局有些亂,背景透明和其他背景融合一起,長(zhǎng)時(shí)間游戲會(huì)對(duì)該界面產(chǎn)生反感。實(shí)際調(diào)查中,本點(diǎn)已被程序作者接受,在Monkey黑白棋2.0中,已經(jīng)取消透明背景。WZebra:WZebra功能齊全、算法優(yōu)異、棋力深厚、電腦思考速度快,在黑白棋中處于老大的地位。其他黑白棋中有的功能本游戲中都有。不足之處:作為一款程序,他當(dāng)之無(wú)愧很成功,但作為一款游戲,它主界面上豐富的按鈕,并不會(huì)帶給玩家良好的用戶體驗(yàn)。3.1.
34、2 確定需求通過(guò)上述網(wǎng)上常見的一些具有代表性的黑白棋程序的對(duì)比分析,現(xiàn)在一個(gè)基于界面上的用戶需求已經(jīng)基本確立。該需求包含以下幾點(diǎn):作為按鈕出現(xiàn)在主界面上的:先后手選擇、單人雙人模式、悔棋和悔棋恢復(fù)、難度選擇、開始新游戲。能夠直觀顯示在游戲界面上的:棋子數(shù)目顯示、顯示上步棋位置、提示下棋點(diǎn)、動(dòng)畫翻轉(zhuǎn)棋子。3.2 黑白棋游戲規(guī)則的需求第二章中已經(jīng)介紹了黑白棋游戲的規(guī)則,主要有如下規(guī)則:1兩人對(duì)弈,以輪流方式持黑子與白子。2開辟新局者持黑子,加入者持白子, 之后以輪流方式將棋子置于棋盤格子中。若無(wú)地方可下子,則跳過(guò)一回,由對(duì)方下子。3在提示的格子中,選擇一個(gè)格子下子, 當(dāng)下子的位置與離最近的同色旗子
35、中, 若有其他棋子則中間的棋子變?yōu)榕c我方一樣顏色。4當(dāng)下滿64個(gè)棋子,棋子多者為勝。5雙方都無(wú)棋可走的其他局面,游戲結(jié)束,以子多者為勝。黑白棋游戲規(guī)則,是程序設(shè)計(jì)是需要考慮的內(nèi)部需求,該部分需求,和前面的游戲界面需求,以及下小節(jié)的其他需求,功能構(gòu)成了黑白棋程序的基本需求。3.3 黑白棋程序的其它需求一個(gè)良好的游戲不僅要有一個(gè)好的界面來(lái)吸引用戶興趣,還需要把凡是不是必須有用戶做出選擇的地方都去掉。比如,在雙方下棋中,一方無(wú)棋可走,切換到另一方,這時(shí)只需要在界面上給出提示即可,不需要彈出一個(gè)對(duì)話框的形式,告訴本步棋要pass,并提示玩家點(diǎn)擊該對(duì)話框來(lái)繼續(xù)游戲,這樣會(huì)降低游戲的可玩性。同樣的問題也出
36、現(xiàn)在用戶點(diǎn)擊退出時(shí),不少程序會(huì)彈出圖3-5的對(duì)話框來(lái)要求用戶確認(rèn)。這是見仁見智的選擇,本文認(rèn)為不符合用戶的需求,因此也去掉了。圖3-5 退出對(duì)話框第4章 黑白棋程序設(shè)計(jì)本模塊建立在第3章需求分析基礎(chǔ)之上,把用戶的需求轉(zhuǎn)換為程序的藍(lán)圖,作為后面編碼過(guò)程中的依據(jù)。4.1 程序流程圖程序所需執(zhí)行的流程見圖4-1,該圖表示出了程序執(zhí)行的流程,也基本表示出了程序的各個(gè)模塊和相互關(guān)系,后面的詳細(xì)設(shè)計(jì)和代碼實(shí)現(xiàn),就是基于本圖設(shè)計(jì)的。圖4-1 黑白棋流程圖4.2 主要模塊簡(jiǎn)介為了實(shí)現(xiàn)黑白棋游戲的開發(fā),通過(guò)流程圖的分析,計(jì)劃采用以下幾大模塊:繪圖模塊本模塊用來(lái)負(fù)責(zé)主界面的繪制,包括棋盤、棋子、個(gè)數(shù)統(tǒng)計(jì)、時(shí)間顯示
37、、以及其它需要顯示的部分的繪圖。繪圖模塊的實(shí)現(xiàn),主要通過(guò)重載QT庫(kù)中自帶的繪圖函數(shù)來(lái)實(shí)現(xiàn)。初始化模塊初始化模塊是一個(gè)函數(shù),用來(lái)負(fù)責(zé)開局時(shí)的棋盤初始化,主要負(fù)責(zé)把程序代碼中各變量值初始化。初始化函數(shù)再程序首次執(zhí)行時(shí)自動(dòng)調(diào)用,中途通過(guò)點(diǎn)擊新游戲按鍵調(diào)用。雙人模塊雙人模塊是本程序得以運(yùn)行的基礎(chǔ),本模塊通過(guò)判斷用戶鼠標(biāo)點(diǎn)擊位置,判斷出該坐標(biāo)所處棋盤中響應(yīng)位置,并通過(guò)后面的規(guī)則模塊決定能否下子,如果能下子就下己方棋子,并交換為對(duì)手走棋。單人模塊單人模塊是基于雙人模塊的,當(dāng)玩家點(diǎn)擊棋盤并成功走棋后,把交換對(duì)手部分,變?yōu)榻粨Q至電腦走棋,電腦則通過(guò)算法模塊走出電腦認(rèn)為最佳位置,并等待玩家繼續(xù)走棋。因此,本黑白
38、棋開發(fā)過(guò)程中,把單人模塊看成是雙人模塊的一部分來(lái)處理。規(guī)則模塊走棋模塊是黑白棋的基礎(chǔ),它負(fù)責(zé)判斷哪些位置能走棋,并在成功走棋后,翻轉(zhuǎn)所需棋子后,并再次負(fù)責(zé)判斷出對(duì)方可走棋位置本模塊包括翻轉(zhuǎn)函數(shù)、以及判斷可下子位置函數(shù)。悔棋和悔棋恢復(fù)模塊本模塊通過(guò)每次走棋記錄棋譜,以便用戶能夠全局悔棋,并全局恢復(fù),但是當(dāng)悔棋過(guò)程中,用戶再次走棋,則后繼步數(shù)不能恢復(fù)。人機(jī)對(duì)弈模式下,只允許玩家悔當(dāng)前的兩步棋(計(jì)算機(jī)一步,玩家一步)。雙人網(wǎng)絡(luò)對(duì)弈模式下,悔棋的過(guò)程為:首先由玩家向?qū)Ψ桨l(fā)送悔棋請(qǐng)求(悔棋消息),然后由對(duì)方?jīng)Q定是否允許玩家悔棋,在玩家得到對(duì)方的響應(yīng)消息(允許或者拒絕)之后,才進(jìn)行悔棋與否的操作。這是應(yīng)該
39、做到的,但實(shí)際編碼中,沒有開發(fā)網(wǎng)絡(luò)對(duì)弈,因此雙人悔棋無(wú)需確認(rèn),但每次只悔一步棋。算法模塊算法模塊是人機(jī)對(duì)戰(zhàn)的關(guān)鍵,是AI函數(shù)的具體設(shè)計(jì)部分??紤]到黑白棋的實(shí)際情況,決定把算法分成三大部分:開局算法、中局算法和終局算法。開局算法首先通過(guò)棋譜庫(kù)調(diào)用已有棋譜,如果棋譜庫(kù)中沒有該棋譜,則自動(dòng)調(diào)用中局算法。開局算法由于采用棋譜庫(kù),程序執(zhí)行較快。中局算法采用減枝和棋盤位置估值以及其他黑白棋常用估值方法,并給每種不同估值賦一權(quán)值,進(jìn)行估值合并,選擇出估值最高的位置,并在該處下棋。中局算法由于棋局中期可走位置較多,致使中局算法執(zhí)行較慢。終局算法,終局算法是窮舉某一步到棋局結(jié)束的所有可能走法,選出對(duì)自己最有利的
40、位置,并走棋。由于臨近終局,最后位置較少,因此程序執(zhí)行較快。第5章 程序?qū)崿F(xiàn)通過(guò)第3章和第4章的描述,黑白棋設(shè)計(jì)思路已經(jīng)確定,現(xiàn)在要做的就是把設(shè)計(jì)結(jié)果翻譯成專用的程序設(shè)計(jì)語(yǔ)言所書寫的程序。編碼是對(duì)設(shè)計(jì)的進(jìn)一步具體化,本部分的質(zhì)量取決于前期設(shè)計(jì)的質(zhì)量,但是,所選設(shè)計(jì)語(yǔ)言的特點(diǎn)及編碼風(fēng)格也會(huì)對(duì)程序的可靠性、可讀性、可測(cè)試性和可維護(hù)性產(chǎn)生影響。5.1 界面實(shí)現(xiàn)為了增加游戲的美觀,界面采用專業(yè)繪圖工具制作出來(lái)的漂亮圖片作為程序背景和棋盤背景。本程序利用FireWorks對(duì)網(wǎng)絡(luò)上的一些圖片做了修改,并作為程序背景使用。界面的顯示,是把上述背景圖作為資源文件,通過(guò)重載QT庫(kù)自帶的paintEvent(QP
41、aintEvent *e)函數(shù),來(lái)繪制背景棋盤。 效果見圖5-1。圖 5-1 黑白棋背景圖葉子狀的是程序背景,木紋狀的是棋盤背景。之所以不作為一個(gè)圖片保存背景,是為了便于以后棋盤改變布局位置。在左邊有總用時(shí)和本步用時(shí)兩個(gè)小模塊,這是用QTDesigner自帶的控件繪制的,計(jì)劃用于上方走棋時(shí)間統(tǒng)計(jì)。為了使這兩個(gè)小模塊好看些,也加上了背景,同時(shí)背景的上半部分,用來(lái)標(biāo)示黑白雙方,以及顯示雙方當(dāng)前局面棋子個(gè)數(shù),并用高亮方式,表示出當(dāng)前該哪一方走棋。背景界面設(shè)計(jì)好了,再加上常用功能鍵、其它選擇按鈕等,一個(gè)程序打開的初始界面就確定了,見圖5-2圖5-2 黑白棋主界面重載QT庫(kù)自帶的paintEvent(Q
42、PaintEvent *e)函數(shù)的方法如下,首先定義用來(lái)統(tǒng)計(jì)黑白兩色棋子個(gè)數(shù),初始值為0,接著生成繪圖對(duì)象,并加載需要繪制的各個(gè)元素,然后并繪制出來(lái),以及繪制其他相關(guān)元素。5.2 功能按鈕的實(shí)現(xiàn)用QT開發(fā)GUI程序,不如MFC容易,但只要掌握了QT的方法,還是很輕松的。如圖5-2的上方部分的按鈕,可以用QTDesigner里面的控件直接繪制出來(lái)。然而這是顯性的繪制,點(diǎn)擊該按鈕并不能直接執(zhí)行相應(yīng)的函數(shù)。而是通過(guò)信號(hào)與槽機(jī)制響應(yīng)相關(guān)函數(shù)。信號(hào)與槽的機(jī)制在2.3節(jié)中有介紹。再次我們要給新游戲按鈕與初始化函數(shù)建立聯(lián)系,即:QObject:connect(pushButton_new, SIGNAL(c
43、licked(), Form, SLOT(initialize();pushButton_new為新游戲部件名稱,本句話意思是點(diǎn)擊新游戲按鈕,程序執(zhí)行初始化(initialize())函數(shù)。其他按鈕已通過(guò)信號(hào)與槽機(jī)制和相關(guān)功能的函數(shù)連接起來(lái),具體連接請(qǐng)參照附錄一主要代碼部分。本程序使用到的信號(hào)與槽,見圖5-3所示。同時(shí),圖5-3也標(biāo)識(shí)出了QTDesigner在本程序開發(fā)中所能發(fā)揮的全部作用。圖5-3 QTDesigner完成的作用Designer不能顯示白色的文本內(nèi)容(見圖5-3左下角數(shù)字2),但為了標(biāo)示白棋的顏色,需要在代碼部分借助QPalette類的setColor函數(shù)來(lái)改變本控件的文本顏
44、色,相關(guān)實(shí)現(xiàn)代碼見附錄一 主要代碼部分。結(jié)合著相關(guān)函數(shù)介紹實(shí)現(xiàn)代碼:本部分主要是把信號(hào)和槽進(jìn)行部件之間的連接,這部分在Designer里面會(huì)自動(dòng)生成。但是自定義的槽函數(shù),要聲明稱public slots形式。對(duì)應(yīng)圖5-3,本程序用到的信號(hào)槽代碼和功能如下:QObject:connect(pushButton_new, SIGNAL(clicked(), Form, SLOT(initialize(),點(diǎn)擊開始按鈕,程序初始化。QObject:connect(pushButton_backward, SIGNAL(clicked(), Form, SLOT(backward(),點(diǎn)擊后退按鈕,執(zhí)
45、行后退相關(guān)函數(shù)。QObject:connect(pushButton_forward, SIGNAL(clicked(), Form, SLOT(forward(),點(diǎn)擊前進(jìn)按鈕執(zhí)行前進(jìn)函數(shù)QObject:connect(checkBox_tip, SIGNAL(clicked(), Form, SLOT(update(),點(diǎn)擊tip按鈕,執(zhí)行刷新函數(shù),刷新過(guò)程中,根據(jù)該組件是否被選中,決定時(shí)候繪制提示點(diǎn)。QObject:connect(radio_single, SIGNAL(clicked(bool), checkBox_2, SLOT(setEnabled(bool),點(diǎn)擊單人游戲按鈕,
46、改變?cè)摻M件狀態(tài)為選中模式,從而決定在mousePressEvent(QMouseEvent *e)里面執(zhí)行單人模式。QObject:connect(radio_double, SIGNAL(clicked(bool), checkBox_2, SLOT(setDisabled(bool) ,點(diǎn)擊單人游戲按鈕,改變?cè)摻M件狀態(tài)為選中模式,從而決定在mousePressEvent(QMouseEvent *e)里面執(zhí)行雙人模式。QObject:connect(radio_single, SIGNAL(clicked(bool), radioButton_lv1, SLOT(setEnabled(bo
47、ol),點(diǎn)擊單人游戲按鈕,如果該按鈕被選中,則難度選擇按鈕為可更改狀態(tài),下面兩個(gè)相同。QObject:connect(radio_single, SIGNAL(clicked(bool), radioButton_lv2, SLOT(setEnabled(bool)。QObject:connect(radio_single, SIGNAL(clicked(bool), radioButton_lv3, SLOT(setEnabled(bool)。QObject:connect(radio_double, SIGNAL(clicked(bool), radioButton_lv1, SLOT(s
48、etDisabled(bool) 點(diǎn)擊雙人游戲按鈕,如果該按鈕被選中,則難度選擇按鈕為不可更改狀態(tài),下面兩個(gè)相同。QObject:connect(radio_double, SIGNAL(clicked(bool), radioButton_lv2, SLOT(setDisabled(bool)。QObject:connect(radio_double, SIGNAL(clicked(bool), radioButton_lv3, SLOT(setDisabled(bool)。QObject:connect(checkBox_2, SIGNAL(clicked(), Form, SLOT(up
49、date(),該處選中,執(zhí)行動(dòng)畫效果。QObject:connect(radio_single, SIGNAL(clicked(), Form, SLOT(doubletosingle(),該處選中,執(zhí)行雙人到單人模式切換函數(shù)doubletosingle(),判斷如果該電腦走棋,則電腦走一步棋。5.3 程序主要函數(shù)從程序表面看,這是一個(gè)二維平面圖,所以數(shù)據(jù)用二維數(shù)組類來(lái)表示,數(shù)組兩個(gè)下標(biāo)可以表示棋盤上的位置,數(shù)組元素的值代表棋格上的狀態(tài),共有五種情況,分別是0代表可下子格,1代表黑棋,-1代表黑棋,-2代表絕對(duì)不能下的位置,2代表需要判斷才知道能否下的位置。程序首次打開,執(zhí)行initializ
50、e()函數(shù)初始化棋局,用戶可以直接走棋或者選擇單人模式等一些功能,當(dāng)用戶點(diǎn)擊棋盤某一位置時(shí),響應(yīng)mousePressEvent(QMouseEvent *e)函數(shù),判斷鼠標(biāo)點(diǎn)擊位置,如果能下棋則執(zhí)行onestep(int x,int y)函數(shù)在該方格內(nèi)走一步棋。并交由對(duì)方(可能是另一名玩家,或者電腦走棋。)mousePressEvent(QMouseEvent *e)函數(shù)的執(zhí)行過(guò)程如下:首先通過(guò)點(diǎn)擊鼠標(biāo)位置獲取點(diǎn)擊坐標(biāo),并判斷該處是否能下子,不能下子退出該函數(shù)。該位置能下子,執(zhí)行onestep(judgepos(x),judgepos(y)走一步棋。玩家走一步棋之后,如果是單人模式執(zhí)行,則交由
51、電腦走棋。電腦走棋首先進(jìn)行難度判斷,并結(jié)合著棋局步數(shù)判斷,選擇不同的函數(shù)進(jìn)行搜索,搜索結(jié)束,電腦執(zhí)行onestep(judgepos(x),judgepos(y)走一步棋,退出該函數(shù)。 在調(diào)用onestep(int x,int y)函數(shù)時(shí),程序首先通過(guò)mousePressEvent(QMouseEvent *e)函數(shù)獲得的(x,y)坐標(biāo),在棋盤(x,y)位置放置一枚該方棋子,然后檢測(cè)周圍能翻轉(zhuǎn)的棋子并翻轉(zhuǎn)(reverse(int x,int y,int whom))、之后判斷出對(duì)方可走棋位置(canbedrop(int x,int y,int whom)),并交由對(duì)方走棋。reverse(in
52、t x,int y,int whom)翻轉(zhuǎn)函數(shù)會(huì)對(duì)該位置的八個(gè)方向做出判斷,選擇能翻轉(zhuǎn)的棋子,并進(jìn)行翻轉(zhuǎn),為了節(jié)省篇幅,再次舉出12點(diǎn)鐘方向的翻轉(zhuǎn)過(guò)程,其他方向類似。if (y1 & weizhixy-1.state = (-1)*whom) / for (int k=2;k=y;k+) if (weizhixy-k.state = 0 | weizhixy-k.state = -2 |weizhixy-k.state = 2) break; if (weizhixy-k.state = whom) for (int i = 1; ik;i+) weizhixy-i.state = whom;
53、 break; 而判斷可下子位置函數(shù)canbedrop(int x,int y,int whom)的思路和翻轉(zhuǎn)函數(shù)類似,也是進(jìn)行8方向的判斷。為了使判斷可走棋位置的循環(huán)減少,在此增加了一個(gè)cube(int x,int y)函數(shù)的處理,黑白棋只能在有子位置的相鄰位置才可能放置棋子,開局時(shí)棋子周圍的8個(gè)相鄰格子為cube狀態(tài)(2),然后每走一步棋,把該步棋周圍的8個(gè)子,和之前標(biāo)記為2和0的位置,全部標(biāo)記為2,然后進(jìn)行canbedrop(int x,int y,int whom)搜索時(shí),就只需要在標(biāo)記為2的格子內(nèi)進(jìn)行8方向判斷,并把該處位置標(biāo)記為0,等待對(duì)方下棋。走棋行進(jìn)過(guò)程中,可隨時(shí)通過(guò)點(diǎn)擊棋盤上
54、方的功能控制菜單,進(jìn)行悔棋(backward())、悔棋回復(fù)(forward())、單人雙人模式切換(doubletosingle())、難度選擇、顯示提示位置等功能。悔棋和悔棋回復(fù)函數(shù),實(shí)質(zhì)上建立一個(gè)數(shù)組,記錄每步棋全盤棋子的各個(gè)位置的狀態(tài)值,并進(jìn)行悔棋和恢復(fù)。每走一步棋,自動(dòng)調(diào)用繪圖函數(shù)(paintEvent(QPaintEvent *e))進(jìn)行界面重繪。如果是單人模式,前面的mousePressEvent(QMouseEvent *e)有介紹,玩家走完會(huì)判斷,如果輪到電腦走棋,則執(zhí)行響應(yīng)的AI算法,選擇最佳走棋位置,并在該處走一步棋,交由玩家繼續(xù)走棋。AI算法分為startserch()
55、,負(fù)責(zé)開局1-10步,middleserch()負(fù)責(zé)11-50步,50步以后直至終局由endserch()負(fù)責(zé)。startserch()函數(shù)主要通過(guò)對(duì)程序中搜集的棋譜進(jìn)行比較,如果有該開局模式,則按棋譜走棋,沒有則自動(dòng)調(diào)用middleserch()的方法進(jìn)行搜索。在這些算法中還會(huì)用到如下一些子函數(shù):count(int x)統(tǒng)計(jì)標(biāo)記為x的一方棋子個(gè)數(shù);middlemain(int x)中期搜索函數(shù)的主要搜索過(guò)程;endmain()終局搜索函數(shù)的主要搜索過(guò)程;valuemiddle()中期搜索的綜合估值函數(shù);mobility()行動(dòng)力函數(shù);danger()危險(xiǎn)位置函數(shù)。實(shí)際游戲開發(fā)中,高質(zhì)量的AI程序,都會(huì)再加有一些其他子函數(shù)來(lái)更好的實(shí)現(xiàn)AI算法,在我的程序中,缺少這些高級(jí)算法。游戲結(jié)束時(shí),直觀顯示雙方棋子個(gè)數(shù),由于黑白棋是靠子數(shù)多少?zèng)Q定勝負(fù),因此為了美觀我沒有加入對(duì)話框提示輸贏。此時(shí)可以點(diǎn)擊新游戲重新開局,或選擇退出。5.4 電腦戰(zhàn)術(shù)分析在這一節(jié)中將介紹計(jì)算機(jī)是如何對(duì)棋盤進(jìn)行分析,然后選擇一個(gè)合理的位置進(jìn)行下棋的。5.4.1 棋盤掃描想要計(jì)算機(jī)能夠與人對(duì)弈黑白棋,對(duì)棋盤的掃描是最基本的操作。前面已經(jīng)介紹了通過(guò)cube(int x,int y)和canbedrop(int x,int y,int who
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 債務(wù)糾紛合同(2篇)
- 公共事業(yè)資產(chǎn)管理合同
- 2025年無(wú)機(jī)械動(dòng)力飛機(jī)項(xiàng)目發(fā)展計(jì)劃
- 《職場(chǎng)溝通》電子教案 項(xiàng)目九 商務(wù)談判溝通教案
- 門店租賃協(xié)議模板
- 福州汽車租賃合同
- 廠房租賃合同書范文
- 公寓別墅租賃服務(wù)合同
- 八年級(jí)語(yǔ)文上冊(cè)第一單元5國(guó)行公祭為佑世界和平教案新人教版1
- 八年級(jí)道德與法治上冊(cè)第三單元勇?lián)鐣?huì)責(zé)任第七課積極奉獻(xiàn)社會(huì)第2框服務(wù)社會(huì)教案新人教版
- 水生生物學(xué)智慧樹知到期末考試答案章節(jié)答案2024年寧波大學(xué)
- 針灸推拿治療失眠PPT
- ISO-8467-1993高錳酸鹽指數(shù)
- 防雷和接地監(jiān)理實(shí)施細(xì)則-
- 糧食倉(cāng)儲(chǔ)組織架構(gòu)設(shè)計(jì)及全套管理規(guī)章制度
- 《人員素質(zhì)測(cè)評(píng)理論與方法》電子版本
- 陶瓷色料的技術(shù)PPT課件
- 幼兒園食品安全工作計(jì)劃四篇
- 課程設(shè)計(jì)YA32-350型四柱萬(wàn)能液壓機(jī)液壓系統(tǒng)設(shè)計(jì)
- 中國(guó)工業(yè)數(shù)據(jù)庫(kù)介紹
- 弱電智能化設(shè)計(jì)服務(wù)建議書(共35頁(yè))
評(píng)論
0/150
提交評(píng)論