基于Qt的黑白棋游戲開發(fā)畢業(yè)論文_第1頁
基于Qt的黑白棋游戲開發(fā)畢業(yè)論文_第2頁
基于Qt的黑白棋游戲開發(fā)畢業(yè)論文_第3頁
基于Qt的黑白棋游戲開發(fā)畢業(yè)論文_第4頁
基于Qt的黑白棋游戲開發(fā)畢業(yè)論文_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、 PAGE29 / NUMPAGES38 畢業(yè)設(shè)計(論文)課題:基于QT的黑白棋游戲開發(fā)學(xué)生:戴福林 學(xué)院:計算機(jī)學(xué)院 班級:硬件1102班 學(xué)號:2011130632 指導(dǎo)教師:佘明洪 裝訂交卷日期:2014.4.20目 錄 HYPERLINK l _引言 引言1 HYPERLINK l _11系統(tǒng)開發(fā)背景 1.1 系統(tǒng)開發(fā)背景1 HYPERLINK l _1.2_黑白棋簡介 1.2 黑白棋簡介2 HYPERLINK l _1.2.1_黑白棋游戲規(guī)則 1.2.1 黑白棋游戲規(guī)則2 HYPERLINK l _1.2.2_黑白棋游戲簡介 1.2.2 黑白棋游戲簡介2 HYPERLINK l _1

2、.3_相關(guān)實現(xiàn)環(huán)境 1.3 相關(guān)實現(xiàn)環(huán)境3 HYPERLINK l _1.3.1_開發(fā)環(huán)境 1.3.1 開發(fā)環(huán)境3 HYPERLINK l _1.3.2_運(yùn)行環(huán)境 1.3.2 運(yùn)行環(huán)境3 HYPERLINK l _1.4_主要研究內(nèi)容 1.4 主要研究容3 HYPERLINK l _1.5_系統(tǒng)開發(fā)的現(xiàn)實意義 1.5 系統(tǒng)開發(fā)的現(xiàn)實意義3 HYPERLINK l _第二章_開發(fā)工具 2 開發(fā)工具Qt4 HYPERLINK l _21_QT簡介 21 QT簡介4 HYPERLINK l _22信號與槽 22信號與槽4 HYPERLINK l _第三章_黑白棋需求分析 3. 黑白棋需求分析7 HY

3、PERLINK l _31_黑白棋程序界面的需求 31 黑白棋程序界面的需求7 HYPERLINK l _3._2黑白棋游戲規(guī)則的需求 3. 2黑白棋游戲規(guī)則的需求7 HYPERLINK l _第4章_黑白棋總體設(shè)計 第4章 黑白棋總體設(shè)計8 HYPERLINK l _4.1_程序流程圖 4.1 程序流程圖8 HYPERLINK l _4.2_主要模塊簡介 4.2 主要模塊簡介8 HYPERLINK l _第五章_程序?qū)崿F(xiàn) 5. 程序?qū)崿F(xiàn)10 HYPERLINK l _5.1_界面實現(xiàn) 5.1 界面實現(xiàn)10 HYPERLINK l _5.2_功能按鈕的實現(xiàn) 5.2 功能按鈕的實現(xiàn)11 HYPE

4、RLINK l _5.3主要函數(shù) 5.3主要函數(shù)12 HYPERLINK l _5.3主要函數(shù) 5.4 電腦戰(zhàn)術(shù)分析14 HYPERLINK l _5.4.1_棋盤掃描 5.4.1 棋盤掃描14 HYPERLINK l _5.4.2判斷行動力 5.4.2判斷行動力14 HYPERLINK l _5.4.3選擇最佳位置落子 5.4.3選擇最佳位置落子15 HYPERLINK l _第六章_系統(tǒng)測試 6.系統(tǒng)測試16 HYPERLINK l _6.1雙人模式下的測試 6.1雙人模式下的測試16 HYPERLINK l _6.1.1_悔棋和悔棋恢復(fù)測試 6.1.1 悔棋和悔棋恢復(fù)測試16 HYPER

5、LINK l _6.1.2_PASS情況下的悔棋恢復(fù) 6.1.2 PASS情況下的悔棋恢復(fù)16 HYPERLINK l _6.2_單人模式下的測試 6.2 單人模式下的測試16 HYPERLINK l _6.2.1_PASS情況的測試 6.2.1 PASS情況的測試16 HYPERLINK l _6.2.2_游戲正常測試 6.2.2 游戲正常測試17 HYPERLINK l _6.2.3_悔棋測試 6.2.3 悔棋測試17 HYPERLINK l _6.3_綜合測試報告 6.3 綜合測試報告17 HYPERLINK l _第七章_總結(jié)和展望 7. 總結(jié)和展望18 HYPERLINK l _7.

6、1_總結(jié) 7.1 總結(jié)18 HYPERLINK l _7.2展望 7.2展望18 HYPERLINK l _致謝 致19 HYPERLINK l _參考文獻(xiàn) 參考文獻(xiàn)20基于Qt的黑白棋游戲開發(fā)容提要 本程序使用的是面向?qū)ο蟮腝T庫的C+語言開發(fā),可以同時運(yùn)行于Linux和Windows環(huán)境下的游戲程序。有雙人對弈,人機(jī)對弈,無限悔棋等功能,其中人機(jī)對弈包含難度選擇和先后手選擇。本論文首先指出了黑白棋游戲、Linux桌面環(huán)境、QT開發(fā)環(huán)境的發(fā)展現(xiàn)狀,然后重點介紹了QT開發(fā)工具的使用、黑白棋的常見戰(zhàn)術(shù)、黑白棋程序的界面設(shè)計、規(guī)則設(shè)計、算法設(shè)計(包含搜索算法、局面估值、-減枝、散列表、MTD等當(dāng)今

7、主流算法)、終局搜索、以與作為一款游戲的其他必須功能,最后介紹了Linux桌面環(huán)境 GUI的發(fā)展趨勢。 本設(shè)計通過一個棋類游戲的開發(fā),闡述了棋類游戲的開發(fā)過程,包括軟件開發(fā)的邏輯分析,程序設(shè)計,軟件實現(xiàn)和軟件測試幾個步驟。關(guān)鍵詞:黑白棋, Linux,人工智能,QT引言概述了黑白棋游戲開發(fā),對黑白棋的基本知識和相關(guān)開發(fā)環(huán)境做了一個簡介第一章 背景11系統(tǒng)開發(fā)背景隨著網(wǎng)絡(luò)技術(shù)的日新月異和計算機(jī)的普與,當(dāng)今的計算機(jī)技術(shù)也走上了平民化和娛樂化的時代,計算機(jī)技術(shù)再也不是只能由少數(shù)人掌握的深不可測的學(xué)問;同時個人計算機(jī)也由原來單純的數(shù)值計算和工業(yè)應(yīng)用逐漸轉(zhuǎn)變成像電視機(jī)一樣的家庭娛樂中心,伴隨著這種巨大的

8、轉(zhuǎn)變計算機(jī)軟件的發(fā)展也走向了娛樂化。尤其是游戲產(chǎn)業(yè)的發(fā)展已經(jīng)成為信息產(chǎn)業(yè)中發(fā)展勢頭最猛烈最具前景的一個分支,而游戲廳也漸漸被網(wǎng)吧擠出了正常的營業(yè)市場,游戲除了單純的個人娛樂功能之外,也逐漸向互動的方向發(fā)展。游戲的功能不斷按照玩家的需求和愛好擴(kuò)展延伸進(jìn)化,如今運(yùn)行在各種平臺上不同名稱,不同容,不同形式的游戲不僅僅為廣大游戲愛好者提供了豐富的選擇,而且為游戲開發(fā)商帶來了豐厚的回報,游戲產(chǎn)業(yè)吸引著許多程序員去開發(fā)更多更新的游戲?;谟螒虬l(fā)展的歷史和前景,我決定用C+語言開發(fā)一款小游戲,游戲容來自網(wǎng)絡(luò)上日漸流行的一種智力游戲黑白棋。我希望把平時界面簡單、選項復(fù)雜的游戲,在Linux里面做成漂亮的、簡單

9、的游戲程序,以給Linux玩家一個新的選擇。隨著計算機(jī)處理速度的飛速提高,人們很早就提出了疑問:計算機(jī)是否會超越人類?世界國際象棋棋王卡斯帕羅夫與美國IBM公司的RS6000(深藍(lán))計算機(jī)系統(tǒng)于1997年5月11日進(jìn)行了六局“人機(jī)大戰(zhàn)”,結(jié)果“深藍(lán)”以3.5比2.5的總比分獲勝。比賽結(jié)束了給人們留下了深刻的思考;下棋要獲勝要求選手要有很強(qiáng)的思維能力、記憶能力、豐富的下棋經(jīng)驗,還得與時做出反應(yīng),迅速進(jìn)行有效的處理,否則一著出錯滿盤皆輸,這顯然是個“智能”問題。盡管開發(fā)“深藍(lán)”計算機(jī)的IBM專家也認(rèn)為它離智能計算機(jī)還相差甚遠(yuǎn),但它以高速的并行的計算能力(20108步每秒棋的計算速度)。實現(xiàn)了人類智

10、力的計算機(jī)上的部分模擬。那么計算機(jī)已經(jīng)超過了人類嗎?本文著重介紹了黑白棋的設(shè)計與開發(fā),讓您對計算機(jī)棋手的智能有更深入的了解。1.2 黑白棋簡介黑白棋,又名反棋(Reversi)、奧賽羅棋(Othello),蘋果棋,翻轉(zhuǎn)棋。黑白棋起源中世紀(jì)的英國,18世紀(jì)傳入日本,并在日本得到了發(fā)展。現(xiàn)在,黑白棋在西方和日本很流行。游戲通過相互翻轉(zhuǎn)對方的棋子,最后以棋盤上誰的棋子多來判斷勝負(fù)。它的游戲規(guī)則簡單,因此上手很容易,但是它的變化又非常復(fù)雜。有一種說法是:只需要幾分鐘學(xué)會它,卻需要一生的時間去精通它。黑白棋不僅能增強(qiáng)思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。黑白棋既有現(xiàn)代休閑的明顯特征“短、平、

11、快”,又有古典哲學(xué)的高深學(xué)問“陰陽易理”;它既有簡單易學(xué)的特性,為人民群眾所喜聞樂見,又有深奧的技巧和高水平的國際性比賽;它的棋文化源淵流長,具有的神秘和西方的直觀;既有“場”的概念,亦有“點”的連接。它是中西文化的交流點,是古今哲理的結(jié)晶。1.2.1 黑白棋游戲規(guī)則(1)兩人對弈,以輪流方式持黑子與白子。(2)開辟新局者持白子,加入者持黑子, 之后以輪流方式將棋子置于棋盤格子中。若無地方可下子,則跳過一回,由對方下子。(3)在提示的格子中,選擇一個格子下子, 當(dāng)下子的位置與離最近的同色旗子中, 若有其他棋子則中間的棋子變?yōu)榕c我方一樣顏色。(4)當(dāng)下滿64個棋子,棋子多者為勝。1.2.2 黑白

12、棋游戲簡介黑白棋規(guī)則規(guī)定對局結(jié)束時子多的一方為勝方,于是初學(xué)者通常會一開始使勁吃子,這實際上是犯了短視的錯誤。每一步都盡可能吃更多的子,我們把這種下法叫做大食策略(MAXIMUM DISC STRATEGY)。除了大食策略以外,還有其它幾種常用的策略以與重要位置和術(shù)語,它們是:穩(wěn)定子 - 位置策略(STABLE DISCS - POSITIONAL STRATEGY)楔入(WEDGES)行動力策略(MOBILITY)余裕手(TEMPO,WAITING MOVES)爬邊(CREEPING ALONG EDGES) 奇偶性(PARITY) 非平衡邊(UNBALANCED EDGES)四通陷阱(ST

13、ONER TRAPS)從黑白棋的游戲規(guī)則上看,應(yīng)該盡量使自己的棋子多于對手的,很容易就得到了一個戰(zhàn)術(shù),就是每步棋都落在能吃掉對手棋子最多的位置,但是經(jīng)過幾局后,你就會發(fā)現(xiàn)這并不是一個好的方法。1.3 相關(guān)實現(xiàn)環(huán)境本程序采用QT庫與其開發(fā)環(huán)境,使用C+語言開發(fā)運(yùn)行于Linux系統(tǒng)KDE桌面環(huán)境下的黑白棋游戲。經(jīng)過實際檢測,QT強(qiáng)大的跨平臺性,已經(jīng)保證了同樣的代碼在Windows XP下、Linux GNOME下、Linux KDE下,幾乎不用修改就能正常運(yùn)行。1.3.1 開發(fā)環(huán)境Qt 4.7.4 (4.7.4)MinGW編譯器1.3.2 運(yùn)行環(huán)境Microsoft Windows XPPenti

14、um(R) Dual-Core CPU 250G硬盤1.4 主要研究容本文將對計算機(jī)棋手下黑白棋做一個全面綜述,介紹計算機(jī)對黑白棋戰(zhàn)術(shù)分析的全過程,包括對圖形和動畫的處理、對棋盤搜索的算法、對棋局做出正確的估計、并生成最佳走法,并將介紹其中各個流程的研究狀況與實用技術(shù)。本文的重點放在計算機(jī)對當(dāng)前棋局的分析,并做出最佳的選擇。介紹搜索算法,棋類游戲不可能一步就決出勝負(fù),象棋中不可能第一步就將對方將死;而對某個棋局的判斷也不可能完全精確,在黑白棋中,初局時棋子多并不一定最終取得勝利,因為對手可能在后面的博弈過程中將局面扭轉(zhuǎn)。想想人類下棋時,一般會假設(shè)我走這步,那么對手會怎,樣回應(yīng),如果對手回應(yīng)了某

15、一步,我再走哪一步,如果對手回應(yīng)了另外某一步,我又該怎么走;然后再假設(shè)我走另外的某一步,如此反復(fù)下去。這個過程叫做搜索。1.5 系統(tǒng)開發(fā)的現(xiàn)實意義利用這次畢業(yè)設(shè)計的機(jī)會可以熟悉C+語言的各種特性,鍛煉程序設(shè)計的實踐能力,熟悉c+語言Linux下的開發(fā)環(huán)境,熟悉前沿的Linux圖形用戶界面的開發(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)算法中,通過一定的算法,

16、實現(xiàn)電腦的下棋與走棋運(yùn)作,加深了對人工智能工作原理的了解。 綜上所述,通過每次黑白棋的開發(fā),可以深入了解Linux編程方法、加深了解算法。第二章 開發(fā)工具21 QT簡介Qt是一個跨平臺的C+圖形用戶界面庫,由挪威TrollTech公司出品,目前包括Qt, 基于Framebuffer的Qt Embedded,快速開發(fā)工具Qt Designer,國際化工具 Qt Linguist等部分Qt支持所有Unix系統(tǒng),當(dāng)然也包括 Linux,還支持 WinNT/Win2k,Win95/98 平臺。1Qt是一個多平臺的C+圖形用戶界面應(yīng)用程序框架。它提供給應(yīng)用程序開發(fā)者建立藝術(shù)級的圖形用戶界面所需的所用功能

17、。Qt是完全面向?qū)ο蟮暮苋菀讛U(kuò)展,并且允許真正地組件編程。自從1996年早些時候,Qt進(jìn)入商業(yè)領(lǐng)域,它已經(jīng)成為全世界圍數(shù)千種成功的應(yīng)用程序的基礎(chǔ)。Qt也是流行的Linux桌面環(huán)境KDE 的基礎(chǔ),KDE是所有主要的Linux發(fā)行版的一個標(biāo)準(zhǔn)組件。基本上,Qt同X Window上的Motif、Openwin、GTK等圖形界面庫和Windows 平臺上的MFC、OWL、VCL、ATL是同類型的東西,但是Qt具有下列優(yōu)點:優(yōu)良的跨平臺特性:Qt支持下列操作系統(tǒng): Microsoft Windows 95/98、 Microsoft Windows NT、 linux、Solaris、SunOS、HP-

18、UX、Digital UNIX (OSF/1、Tru64)、Irix、FreeBSD, BSD/OS、SCO、AIX、OS390、QNX 等等。面向?qū)ο螅篞t 的良好封裝機(jī)制使得Qt的模塊化程度非常高,可重用性較好,對于用戶開發(fā)來說是非常方便的。Qt提供了一種稱為signals/slots的安全類型來替代 callback,這使得各個元件之間的協(xié)同工作變得十分簡單。豐富的API:Qt 包括多達(dá)250個以上的C+類,還提供基于模板的collections、 serialization、file、I/O device、Directory management、date/time 類。甚至還包括正則

19、表達(dá)式的處理功能。支持2D/3D圖形渲染,支持OpenGL。22信號與槽QT不同于其他開發(fā)工具的一個重要特點,就是信號與槽。信號和槽用于對象間的通訊。信號/槽機(jī)制是Qt的一個中心特征并且也許是Qt與其它工具包的最不一樣的部分。在圖形用戶界面編程中,我們經(jīng)常希望一個窗口部件的一個變化被通知給另一個窗口部件。更一般地,我們希望任何一類的對象可以和其它對象進(jìn)行通訊。例如,如果我們正在解析一個XML文件,當(dāng)我們遇到一個新的標(biāo)簽時,我們也許希望通知列表視圖我們正在用來表達(dá)XML文件的結(jié)構(gòu)。圖 2-1 一個關(guān)于一些信號和槽連接的摘要圖在Qt中我們有一種可以替代回調(diào)的技術(shù)。我們使用信號和槽。當(dāng)一個特定事件發(fā)

20、生的時候,一個信號被發(fā)射。Qt的窗口部件有很多預(yù)定義的信號,但是我們總是可以通過繼承來加入我們自己的信號。槽就是一個可以被調(diào)用處理特定信號的函數(shù)。Qt的窗口部件又很多預(yù)定義的槽,但是通常的習(xí)慣是你可以加入自己的槽,這樣你就可以處理你所感興趣的信號。 信號和槽的機(jī)制是類型安全的:一個信號的簽名必須與它的接收槽的簽名相匹配。(實際上一個槽的簽名可以比它接收的信號的簽名少,因為它可以忽略額外的簽名。)因為簽名是一致的,編譯器就可以幫助我們檢測類型不匹配。信號和槽是寬松地聯(lián)系在一起的:一個發(fā)射信號的類不用知道也不用注意哪個槽要接收這個信號。Qt的信號和槽的機(jī)制可以保證如果你把一個信號和一個槽連接起來,

21、槽會在正確的時間使用信號的參數(shù)而被調(diào)用。信號和槽可以使用任何數(shù)量、任何類型的參數(shù)。它們是完全類型安全的:不會再有回調(diào)核心轉(zhuǎn)儲(core dump)。圖 2-2 一個信號和槽連接的例子信號與槽機(jī)制是一個函數(shù),原型如下:QObject:connect( &a, SIGNAL(funtionA(), &b, SLOT(funtionB() )這一行在兩個Qt對象(直接或間接繼承QObject對象的對象)中建立了一種單向的連接。每一個Qt對象都有signals(發(fā)送消息)和slots(接收消息)。所有窗口部件都是Qt對象。它們繼承QWidget,而QWidget繼承QObject。該函數(shù)意思是a部件發(fā)

22、出 funtionA()消息,b部件執(zhí)行funtionB()函數(shù)。第三章 黑白棋需求分析為了開發(fā)出真正滿足用戶需求的程序,尤其是游戲程序,首先必須知道用戶的需求。把用戶需求作為前提條件,來指導(dǎo)程序的開發(fā)31 黑白棋程序界面的需求通過上述網(wǎng)上常見的一些具有代表性的黑白棋程序的對比分析,現(xiàn)在一個基于界面上的用戶需求已經(jīng)基本確立。該需求包含以下幾點:1. 作為按鈕出現(xiàn)在主界面上的:先后手選擇、單人雙人模式、悔棋和悔棋恢復(fù)、難度選擇、開始新游戲。2. 能夠直觀顯示在游戲界面上的:棋子數(shù)目顯示、顯示上步棋位置、提示下棋點、動畫翻轉(zhuǎn)棋子。3. 2黑白棋游戲規(guī)則的需求第二章中已經(jīng)介紹了黑白棋游戲的規(guī)則,主要

23、有如下規(guī)則:1兩人對弈,以輪流方式持黑子與白子。2開辟新局者持黑子,加入者持白子, 之后以輪流方式將棋子置于棋盤格子中。若無地方可下子,則跳過一回,由對方下子。3在提示的格子中,選擇一個格子下子, 當(dāng)下子的位置與離最近的同色旗子中, 若有其他棋子則中間的棋子變?yōu)榕c我方一樣顏色。4當(dāng)下滿64個棋子,棋子多者為勝。5雙方都無棋可走的其他局面,游戲結(jié)束,以子多者為勝。黑白棋游戲規(guī)則,是程序設(shè)計是需要考慮的部需求,該部分需求,和前面的游戲界面需求,以與下小節(jié)的其他需求,功能構(gòu)成了黑白棋程序的基本需求。第4章 黑白棋總體設(shè)計本模塊建立在第3章需求分析基礎(chǔ)之上,把用戶的需求轉(zhuǎn)換為程序的藍(lán)圖,作為后面編碼過

24、程中的依據(jù)。4.1 程序流程圖程序所需執(zhí)行的流程見圖4-1,該圖表示出了程序執(zhí)行的流程,也基本表示出了程序的各個模塊和相互關(guān)系,后面的詳細(xì)設(shè)計和代碼實現(xiàn),就是基于本圖設(shè)計的。圖4-1 黑白棋流程圖4.2 主要模塊簡介為了實現(xiàn)黑白棋游戲的開發(fā),通過流程圖的分析,計劃采用以下幾大模塊:繪圖模塊本模塊用來負(fù)責(zé)主界面的繪制,包括棋盤、棋子、個數(shù)統(tǒng)計、時間顯示、以與其它需要顯示的部分的繪圖。繪圖模塊的實現(xiàn),主要通過重載QT庫中自帶的繪圖函數(shù)來實現(xiàn)。初始化模塊初始化模塊是一個函數(shù),用來負(fù)責(zé)開局時的棋盤初始化,主要負(fù)責(zé)把程序代碼中各變量值初始化。初始化函數(shù)再程序首次執(zhí)行時自動調(diào)用,中途通過點擊新游戲按鍵調(diào)用

25、。雙人模塊雙人模塊是本程序得以運(yùn)行的基礎(chǔ),本模塊通過判斷用戶鼠標(biāo)點擊位置,判斷出該坐標(biāo)所處棋盤中響應(yīng)位置,并通過后面的規(guī)則模塊決定能否下子,如果能下子就下己方棋子,并交換為對手走棋。單人模塊單人模塊是基于雙人模塊的,當(dāng)玩家點擊棋盤并成功走棋后,把交換對手部分,變?yōu)榻粨Q至電腦走棋,電腦則通過算法模塊走出電腦認(rèn)為最佳位置,并等待玩家繼續(xù)走棋。因此,本黑白棋開發(fā)過程中,把單人模塊看成是雙人模塊的一部分來處理。規(guī)則模塊走棋模塊是黑白棋的基礎(chǔ),它負(fù)責(zé)判斷哪些位置能走棋,并在成功走棋后,翻轉(zhuǎn)所需棋子后,并再次負(fù)責(zé)判斷出對方可走棋位置。 本模塊包括翻轉(zhuǎn)函數(shù)、以與判斷可下子位置函數(shù)?;谄搴突谄寤謴?fù)模塊本模塊通

26、過每次走棋記錄棋譜,以便用戶能夠全局悔棋,并全局恢復(fù),但是當(dāng)悔棋過程中,用戶再次走棋,則后繼步數(shù)不能恢復(fù)。第五章 程序?qū)崿F(xiàn)通過第3章和第4章的描述,黑白棋設(shè)計思路已經(jīng)確定,現(xiàn)在要做的就是把設(shè)計結(jié)果翻譯成專用的程序設(shè)計語言所書寫的程序。編碼是對設(shè)計的進(jìn)一步具體化,本部分的質(zhì)量取決于前期設(shè)計的質(zhì)量,但是,所選設(shè)計語言的特點與編碼風(fēng)格也會對程序的可靠性、可讀性、可測試性和可維護(hù)性產(chǎn)生影響。5.1 界面實現(xiàn)為了增加游戲的美觀,界面采用專業(yè)繪圖工具制作出來的漂亮圖片作為程序背景和棋盤背景。本程序利用FireWorks對網(wǎng)絡(luò)上的一些圖片做了修改,并作為程序背景使用。界面的顯示,是把上述背景圖作為資源文件,

27、通過重載QT庫自帶的paintEvent(QPaintEvent *e)函數(shù),來繪制背景棋盤。 葉子狀的是程序背景,紅色底紋的是棋盤背景。之所以不作為一個圖片保存背景,是為了便于以后棋盤改變布局位置。在左邊有總用時和本步用時兩個小模塊,這是用QTDesigner自帶的控件繪制的,計劃用于上方走棋時間統(tǒng)計。為了使這兩個小模塊好看些,也加上了背景,同時背景的上半部分,用來標(biāo)示黑白雙方,以與顯示雙方當(dāng)前局面棋子個數(shù),并用高亮方式,表示出當(dāng)前該哪一方走棋。背景界面設(shè)計好了,再加上常用功能鍵、其它選擇按鈕等,一個程序打開的初始界面就確定了,見圖5-1圖5-1 黑白棋主界面重載QT庫自帶的paintEve

28、nt(QPaintEvent *e)函數(shù)的方法如下,首先定義用來統(tǒng)計黑白兩色棋子個數(shù),初始值為0,接著生成繪圖對象,并加載需要繪制的各個元素,然后并繪制出來,以與繪制其他相關(guān)元素。5.2 功能按鈕的實現(xiàn)用QT開發(fā)GUI程序,不如MFC容易,但只要掌握了QT的方法,還是很輕松的。如圖5-1的上方部分的按鈕,可以用QTDesigner里面的控件直接繪制出來。然而這是顯性的繪制,點擊該按鈕并不能直接執(zhí)行相應(yīng)的函數(shù)。而是通過信號與槽機(jī)制響應(yīng)相關(guān)函數(shù)。信號與槽的機(jī)制在2.3節(jié)中有介紹。再次我們要給新游戲按鈕與初始化函數(shù)建立聯(lián)系,即:QObject:connect(pushButton_new, SIGN

29、AL(clicked(), Form, SLOT(initialize();pushButton_new為新游戲部件名稱,本句話意思是點擊新游戲按鈕,程序執(zhí)行初始化(initialize())函數(shù)。其他按鈕已通過信號與槽機(jī)制和相關(guān)功能的函數(shù)連接起來,具體連接請參照附錄一主要代碼部分。本程序使用到的信號與槽。結(jié)合著相關(guān)函數(shù)介紹實現(xiàn)代碼:本部分主要是把信號和槽進(jìn)行部件之間的連接,這部分在Designer里面會自動生成。但是自定義的槽函數(shù),要聲明稱public slots形式。本程序用到的信號槽代碼和功能如下:QObject:connect(pushButton_new, SIGNAL(clicke

30、d(), Form, SLOT(initialize(),點擊開始按鈕,程序初始化。QObject:connect(pushButton_backward, SIGNAL(clicked(), Form, SLOT(backward(),點擊后退按鈕,執(zhí)行后退相關(guān)函數(shù)。QObject:connect(pushButton_forward, SIGNAL(clicked(), Form, SLOT(forward(),點擊前進(jìn)按鈕執(zhí)行前進(jìn)函數(shù)QObject:connect(checkBox_tip, SIGNAL(clicked(), Form, SLOT(update(),點擊tip按鈕,執(zhí)行

31、刷新函數(shù),刷新過程中,根據(jù)該組件是否被選中,決定時候繪制提示點。QObject:connect(radio_single, SIGNAL(clicked(bool), checkBox_2, SLOT(setEnabled(bool),點擊單人游戲按鈕,改變該組件狀態(tài)為選中模式,從而決定在mousePressEvent(QMouseEvent *e)里面執(zhí)行單人模式。QObject:connect(radio_double, SIGNAL(clicked(bool), checkBox_2, SLOT(setDisabled(bool) ,點擊單人游戲按鈕,改變該組件狀態(tài)為選中模式,從而決定在

32、mousePressEvent(QMouseEvent *e)里面執(zhí)行雙人模式。QObject:connect(radio_single, SIGNAL(clicked(bool), radioButton_lv1, SLOT(setEnabled(bool),點擊單人游戲按鈕,如果該按鈕被選中,則難度選擇按鈕為可更改狀態(tài),下面兩個一樣。QObject:connect(radio_single, SIGNAL(clicked(bool), radioButton_lv2, SLOT(setEnabled(bool)。QObject:connect(radio_single, SIGNAL(cl

33、icked(bool), radioButton_lv3, SLOT(setEnabled(bool)。QObject:connect(radio_double, SIGNAL(clicked(bool), radioButton_lv1, SLOT(setDisabled(bool) 點擊雙人游戲按鈕,如果該按鈕被選中,則難度選擇按鈕為不可更改狀態(tài),下面兩個一樣。QObject:connect(radio_double, SIGNAL(clicked(bool), radioButton_lv2, SLOT(setDisabled(bool)。QObject:connect(radio_do

34、uble, SIGNAL(clicked(bool), radioButton_lv3, SLOT(setDisabled(bool)。QObject:connect(checkBox_2, SIGNAL(clicked(), Form, SLOT(update(),該處選中,執(zhí)行動畫效果。QObject:connect(radio_single, SIGNAL(clicked(), Form, SLOT(doubletosingle(),該處選中,執(zhí)行雙人到單人模式切換函數(shù)doubletosingle(),判斷如果該電腦走棋,則電腦走一步棋。5.3主要函數(shù)從程序看,這是一個二維平面圖,所以數(shù)

35、據(jù)用二維數(shù)組類來表示,數(shù)組兩個下標(biāo)可以表示棋盤上的位置,數(shù)組元素的值代表棋格上的狀態(tài),共有五種情況,分別是0代表可下子格,1代表黑棋,-1代表黑棋,-2代表絕對不能下的位置,2代表需要判斷才知道能否下的位置。程序首次打開,執(zhí)行initialize()函數(shù)初始化棋局,用戶可以直接走棋或者選擇單人模式等一些功能,當(dāng)用戶點擊棋盤某一位置時,響應(yīng)mousePressEvent(QMouseEvent *e)函數(shù),判斷鼠標(biāo)點擊位置,如果能下棋則執(zhí)行onestep(int x,int y)函數(shù)在該方格走一步棋。并交由對方(可能是另一名玩家,或者電腦走棋。)mousePressEvent(QMouseEve

36、nt *e)函數(shù)的執(zhí)行過程如下:首先通過點擊鼠標(biāo)位置獲取點擊坐標(biāo),并判斷該處是否能下子,不能下子退出該函數(shù)。該位置能下子,執(zhí)行onestep(judgepos(x),judgepos(y)走一步棋。玩家走一步棋之后,如果是單人模式執(zhí)行,則交由電腦走棋。電腦走棋首先進(jìn)行難度判斷,并結(jié)合著棋局步數(shù)判斷,選擇不同的函數(shù)進(jìn)行搜索,搜索結(jié)束,電腦執(zhí)行onestep(judgepos(x),judgepos(y)走一步棋,退出該函數(shù)。在調(diào)用onestep(int x,int y)函數(shù)時,程序首先通過mousePressEvent(QMouseEvent *e)函數(shù)獲得的(x,y)坐標(biāo),在棋盤(x,y)位置

37、放置一枚該方棋子,然后檢測周圍能翻轉(zhuǎn)的棋子并翻轉(zhuǎn)(reverse(int x,int y,int whom))、之后判斷出對方可走棋位置(canbedrop(int x,int y,int whom)),并交由對方走棋。reverse(int x,int y,int whom)翻轉(zhuǎn)函數(shù)會對該位置的八個方向做出判斷,選擇能翻轉(zhuǎn)的棋子,并進(jìn)行翻轉(zhuǎn),為了節(jié)省篇幅,再次舉出12點鐘方向的翻轉(zhuǎn)過程,其他方向類似。if (y1 & weizhixy-1.state = (-1)*whom) / for (int k=2;k=y;k+) if (weizhixy-k.state = 0 | weizhixy

38、-k.state = -2 |weizhixy-k.state = 2) break; if (weizhixy-k.state = whom) for (int i = 1; ik;i+) weizhixy-i.state = whom; break; 而判斷可下子位置函數(shù)canbedrop(int x,int y,int whom)的思路和翻轉(zhuǎn)函數(shù)類似,也是進(jìn)行8方向的判斷。為了使判斷可走棋位置的循環(huán)減少,在此增加了一個cube(int x,int y)函數(shù)的處理,黑白棋只能在有子位置的相鄰位置才可能放置棋子,開局時棋子周圍的8個相鄰格子為cube狀態(tài)(2),然后每走一步棋,把該步棋周圍的

39、8個子,和之前標(biāo)記為2和0的位置,全部標(biāo)記為2,然后進(jìn)行canbedrop(int x,int y,int whom)搜索時,就只需要在標(biāo)記為2的格子進(jìn)行8方向判斷,并把該處位置標(biāo)記為0,等待對方下棋。走棋行進(jìn)過程中,可隨時通過點擊棋盤上方的功能控制菜單,進(jìn)行悔棋(backward())、悔棋回復(fù)(forward())、單人雙人模式切換(doubletosingle())、難度選擇、顯示提示位置等功能?;谄搴突谄寤貜?fù)函數(shù),實質(zhì)上建立一個數(shù)組,記錄每步棋全盤棋子的各個位置的狀態(tài)值,并進(jìn)行悔棋和恢復(fù)。每走一步棋,自動調(diào)用繪圖函數(shù)(paintEvent(QPaintEvent *e))進(jìn)行界面重繪。

40、如果是單人模式,前面的mousePressEvent(QMouseEvent *e)有介紹,玩家走完會判斷,如果輪到電腦走棋,則執(zhí)行響應(yīng)的AI算法,選擇最佳走棋位置,并在該處走一步棋,交由玩家繼續(xù)走棋。AI算法分為startserch(),負(fù)責(zé)開局1-10步,middleserch()負(fù)責(zé)11-50步,50步以后直至終局由endserch()負(fù)責(zé)。startserch()函數(shù)主要通過對程序中搜集的棋譜進(jìn)行比較,如果有該開局模式,則按棋譜走棋,沒有則自動調(diào)用middleserch()的方法進(jìn)行搜索。在這些算法中還會用到如下一些子函數(shù):count(int x)統(tǒng)計標(biāo)記為x的一方棋子個數(shù);middl

41、emain(int x)中期搜索函數(shù)的主要搜索過程;endmain()終局搜索函數(shù)的主要搜索過程;valuemiddle()中期搜索的綜合估值函數(shù);mobility()行動力函數(shù);danger()危險位置函數(shù)。實際游戲開發(fā)中,高質(zhì)量的AI程序,都會再加有一些其他子函數(shù)來更好的實現(xiàn)AI算法,在我的程序中,缺少這些高級算法。游戲結(jié)束時,直觀顯示雙方棋子個數(shù),由于黑白棋是靠子數(shù)多少決定勝負(fù),因此為了美觀我沒有加入對話框提示輸贏。此時可以點擊新游戲重新開局,或選擇退出。5.4 電腦戰(zhàn)術(shù)分析在這一節(jié)中將介紹計算機(jī)是如何對棋盤進(jìn)行分析,然后選擇一個合理的位置進(jìn)行下棋的。5.4.1 棋盤掃描想要計算機(jī)能夠與

42、人對弈黑白棋,對棋盤的掃描是最基本的操作。前面已經(jīng)介紹了通過cube(int x,int y)和canbedrop(int x,int y,int whom)進(jìn)行掃描的方法,對棋盤的掃描工作就比較簡單了,這里就不再累述。5.4.2判斷行動力在前面的章節(jié)分析中已經(jīng)提到,黑白棋的正確戰(zhàn)術(shù)應(yīng)該是盡量削弱對手的行動力,讓對手全無好棋可下,同時增加自己的行動力。那么如何能讓計算機(jī)懂得這個道理呢?這就要求計算機(jī)具有“思考”的能力。首先計算機(jī)調(diào)用檢測行動力的函數(shù)mobility(),檢測自己的行動力,也就是將當(dāng)前棋盤所有能落子的位置找出來,然后在對這些位置逐步進(jìn)行分析。分析的過程就是先假設(shè)計算機(jī)在某個位置上

43、落子,然后馬上再次調(diào)用檢測行動力函數(shù),不過這次是檢測對手的行動力。意思就是如果計算機(jī)在這里落子,看看對手的行動力如何,如果對手的行動力太大,對手有很多位置可以選擇,那么就不應(yīng)該在這里落子。如此對所有能落子的位置進(jìn)行檢測,找出一個能讓對手行動力變得最小的位置落子,該函數(shù)mobility()原理為對棋盤進(jìn)行搜索,找出所有標(biāo)志為0的格子的個數(shù),即為該處行動力。該函數(shù)原型如下:int MyForm:mobility() int move = 0; for (int i=0;i8;i+) for (int j=0;j8;j+) if (weizhiij.state=0) move+; return mo

44、ve;5.4.3選擇最佳位置落子使用了一些戰(zhàn)術(shù),使計算機(jī)能夠了解當(dāng)前棋局的情況,最終的目的讓計算機(jī)能夠選擇一個合理的位置落子。在本程序里在棋局的不同時期,所采用的選擇方法也是不同的,在程序開局時,優(yōu)先選擇棋譜庫中的固定套路。而在中期時則以多種估值通過賦予權(quán)值,統(tǒng)計出綜合估值,選取最大估值位置落棋。到了后期,局面已經(jīng)完全可以窮舉,采用最大食子法,以能吃掉對手最多棋子為準(zhǔn)。第六章 系統(tǒng)測試系統(tǒng)測試的目的主要在于發(fā)現(xiàn)錯誤,找出軟件的缺陷和隱患,是確保軟件質(zhì)量的重要方法。在完成黑白棋游戲之后,分別對游戲中各個進(jìn)行了測試,主要是檢驗該游戲在各種情況下中的功能能否實現(xiàn),是否滿足黑白棋游戲規(guī)則的走棋,從而驗

45、證該系統(tǒng)確實符合預(yù)訂的需求, 軟件測試就是在軟件投入運(yùn)行前,對軟件需求分析、設(shè)計規(guī)格說明和編碼的最終復(fù)查,是軟件質(zhì)量保證的關(guān)鍵步驟。早在1973年, W.Hetael曾經(jīng)指出,測試是對程序或系統(tǒng)能否完成特定任務(wù)建立信心的過程。系統(tǒng)在開發(fā)過程中采用了多種措施保證軟件質(zhì)量,但是實際開發(fā)過程中還是不可避免地會產(chǎn)生差錯。系統(tǒng)??赡茈[藏著錯誤和缺陷,若將未經(jīng)周密測試的系統(tǒng)投入運(yùn)行,將會造成難以想象的后果。因此系統(tǒng)測試是管理系統(tǒng)開發(fā)過程中為保證軟件質(zhì)量必須進(jìn)行的工作。大量統(tǒng)計資料表明,系統(tǒng)測試的工作量往往占管理系統(tǒng)開發(fā)總工作量的40%以上。因此必須重視測試工作。6.1雙人模式下的測試雙人模式是游戲進(jìn)行的基

46、礎(chǔ),因此此部分的測試較多,且具有代表性。6.1.1 悔棋和悔棋恢復(fù)測試正常情況下,黑白棋雙人模式中悔棋可以悔棋至初始棋局,并能恢復(fù)至玩家最后一次落子的棋局。在悔棋中途,如果玩家改變落子,則只能恢復(fù)至該處,不能也不應(yīng)該繼續(xù)回復(fù)原本沒有恢復(fù)的棋步。6.1.2 PASS情況下的悔棋恢復(fù)PASS情況下的悔棋恢復(fù),就要先設(shè)計出一個有pass情況的棋局出來,然后選擇悔棋,看是否正?;谄濉?.2 單人模式下的測試單人模式是雙人模式的一個特殊情況,因此有些測試和雙人模式一樣,不用反復(fù)測試,只需測試對方走棋是否符合規(guī)則就行。備注,單人模式測試由于是電腦配合走棋,因此某些環(huán)境不容易還原,在程序開發(fā)中進(jìn)行過測試,并

47、將測試結(jié)果統(tǒng)計如下,在此就另外不附圖說明。6.2.1 PASS情況的測試由于單人模式需要進(jìn)行思考,所以中途可能會造成遇到PASS情況,致使該步走棋方發(fā)生錯誤,比如本來該白棋走的結(jié)果卻是黑棋走。經(jīng)過測試,測試失敗。查找原因,每次電腦思考都是固定套用每次落子切換走棋方的方法,致使一方PASS,本不該切換走棋方的,仍然切換的錯誤情況,后經(jīng)改進(jìn)為每步棋由哪方走棋的數(shù)組記錄,錯誤得以解決。6.2.2 游戲正常測試本測試,測試電腦AI是否能選擇正確位置走棋,結(jié)果發(fā)現(xiàn)在某些未知情況下,電腦會在本不能下子處下子。測試失敗。查找原因,暫時為查明,但該BUG位于AI算法函數(shù)中,這點是確定的,因此程序AI算法部分,有待改進(jìn)。6.2.3 悔棋測試由于單人模式每次需要同時悔棋兩步,因此也要單獨測試,經(jīng)過測試,符合要求,測試成功!6.3 綜合測試報告從以上的測試方法和測試結(jié)果可以看出,該游戲的在雙人模式下能完全正確的運(yùn)行,與當(dāng)初的預(yù)想一致?;旧蠈崿F(xiàn)了需求分析和系統(tǒng)設(shè)計中所提到的所有功能(計時功能暫未開發(fā))。單人模式下存在一處bug,但影響到程序的可執(zhí)行性,應(yīng)該得到修正。第七章 總結(jié)和展望7.1 總結(jié)本程序能以友好的界面運(yùn)行于Windows系統(tǒng)、Linux系統(tǒng)的兩大桌面環(huán)境(Gnome和KDE)、以與Mac系統(tǒng)(Mac

溫馨提示

  • 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

提交評論