基于QT的黑白棋游戲程序設(shè)計與實現(xiàn)_第1頁
基于QT的黑白棋游戲程序設(shè)計與實現(xiàn)_第2頁
基于QT的黑白棋游戲程序設(shè)計與實現(xiàn)_第3頁
基于QT的黑白棋游戲程序設(shè)計與實現(xiàn)_第4頁
基于QT的黑白棋游戲程序設(shè)計與實現(xiàn)_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、學號:2008840217本 科 畢 業(yè) 論 文(設(shè) 計)基于qt的黑白棋游戲程序設(shè)計與實現(xiàn)作者姓名指導(dǎo)教師所學專業(yè)計算機科學與技術(shù)班級所屬院系信息學院學習年限2008年9月至2012年7月二一二年六月目 錄1 引言11.1 系統(tǒng)開發(fā)背景11.2 黑白棋簡介21.2.1 黑白棋游戲規(guī)則21.2.2 黑白棋游戲簡介21.3 相關(guān)實現(xiàn)環(huán)境31.3.1 開發(fā)環(huán)境31.3.2 運行環(huán)境31.4 主要研究內(nèi)容31.5 系統(tǒng)開發(fā)的現(xiàn)實意義32 開發(fā)工具qt421 qt簡介422信號與槽43. 黑白棋需求分析731 黑白棋程序界面的需求73. 2黑白棋游戲規(guī)則的需求7第4章 黑白棋總體設(shè)計84.1 程序流程

2、圖84.2 主要模塊簡介85. 程序?qū)崿F(xiàn)105.1 界面實現(xiàn)105.2 功能按鈕的實現(xiàn)115.3主要函數(shù)125.4 電腦戰(zhàn)術(shù)分析145.4.1 棋盤掃描145.4.2判斷行動力145.4.3選擇最佳位置落子156.系統(tǒng)測試166.1雙人模式下的測試166.1.1 悔棋和悔棋恢復(fù)測試166.1.2 pass情況下的悔棋恢復(fù)166.2 單人模式下的測試166.2.1 pass情況的測試166.2.2 游戲正常測試176.2.3 悔棋測試176.3 綜合測試報告177. 總結(jié)和展望187.1 總結(jié)187.2展望18致謝19參考文獻20othello game based on the qt deve

3、lopment21基于qt的黑白棋游戲開發(fā) 學生姓名: 指導(dǎo)教師: 內(nèi)容提要 本程序使用的是面向?qū)ο蟮膓t庫的c+語言開發(fā),可以同時運行于linux和windows環(huán)境下的游戲程序。有雙人對弈,人機對弈,無限悔棋等功能,其中人機對弈包含難度選擇和先后手選擇。本論文首先指出了黑白棋游戲、linux桌面環(huán)境、qt開發(fā)環(huán)境的發(fā)展現(xiàn)狀,然后重點介紹了qt開發(fā)工具的使用、黑白棋的常見戰(zhàn)術(shù)、黑白棋程序的界面設(shè)計、規(guī)則設(shè)計、算法設(shè)計(包含搜索算法、局面估值、-減枝、散列表、mtd等當今主流算法)、終局搜索、以及作為一款游戲的其他必須功能,最后介紹了linux桌面環(huán)境 gui的發(fā)展趨勢。 本設(shè)計通過一個棋類游

4、戲的開發(fā),闡述了棋類游戲的開發(fā)過程,包括軟件開發(fā)的邏輯分析,程序設(shè)計,軟件實現(xiàn)和軟件測試幾個步驟。關(guān)鍵詞 黑白棋 linux 人工智能 qti山西大學商務(wù)學院本科畢業(yè)論文(設(shè)計)1 引言本章概述了黑白棋游戲開發(fā),對黑白棋的基本知識和相關(guān)開發(fā)環(huán)境做了一個簡介1.1 系統(tǒng)開發(fā)背景隨著網(wǎng)絡(luò)技術(shù)的日新月異和計算機的普及,當今的計算機技術(shù)也走上了平民化和娛樂化的時代,計算機技術(shù)再也不是只能由少數(shù)人掌握的深不可測的學問;同時個人計算機也由原來單純的數(shù)值計算和工業(yè)應(yīng)用逐漸轉(zhuǎn)變成像電視機一樣的家庭娛樂中心,伴隨著這種巨大的轉(zhuǎn)變計算機軟件的發(fā)展也走向了娛樂化。 尤其是游戲產(chǎn)業(yè)的發(fā)展已經(jīng)成為信息產(chǎn)業(yè)中發(fā)展勢頭最猛

5、烈最具前景的一個分支,而游戲廳也漸漸被網(wǎng)吧擠出了正常的營業(yè)市場,游戲除了單純的個人娛樂功能之外,也逐漸向互動的方向發(fā)展。游戲的功能不斷按照玩家的需求和愛好擴展延伸進化,如今運行在各種平臺上不同名稱,不同內(nèi)容,不同形式的游戲不僅僅為廣大游戲愛好者提供了豐富的選擇,而且為游戲開發(fā)商帶來了豐厚的回報,游戲產(chǎn)業(yè)吸引著許多程序員去開發(fā)更多更新的游戲。 基于游戲發(fā)展的歷史和前景,我決定用c+語言開發(fā)一款小游戲,游戲內(nèi)容來自網(wǎng)絡(luò)上日漸流行的一種智力游戲黑白棋。我希望把平時界面簡單、選項復(fù)雜的游戲,在linux里面做成漂亮的、簡單的游戲程序,以給linux玩家一個新的選擇。隨著計算機處理速度的飛速提高,人們很

6、早就提出了疑問:計算機是否會超越人類?世界國際象棋棋王卡斯帕羅夫與美國ibm公司的rs6000(深藍)計算機系統(tǒng)于1997年5月11日進行了六局“人機大戰(zhàn)”,結(jié)果“深藍”以3.5比2.5的總比分獲勝。比賽結(jié)束了給人們留下了深刻的思考;下棋要獲勝要求選手要有很強的思維能力、記憶能力、豐富的下棋經(jīng)驗,還得及時做出反應(yīng),迅速進行有效的處理,否則一著出錯滿盤皆輸,這顯然是個“智能”問題。盡管開發(fā)“深藍”計算機的ibm專家也認為它離智能計算機還相差甚遠,但它以高速的并行的計算能力(20108步秒棋的計算速度)。實現(xiàn)了人類智力的計算機上的部分模擬。那么計算機已經(jīng)超過了人類嗎?本文著重介紹了黑白棋的設(shè)計與開

7、發(fā),讓您對計算機棋手的智能有更深入的了解。11.2 黑白棋簡介黑白棋,又叫反棋(reversi)、奧賽羅棋(othello),蘋果棋,翻轉(zhuǎn)棋。黑白棋起源中世紀的英國,18世紀傳入日本,并在日本得到了發(fā)展?,F(xiàn)在,黑白棋在西方和日本很流行。游戲通過相互翻轉(zhuǎn)對方的棋子,最后以棋盤上誰的棋子多來判斷勝負。它的游戲規(guī)則簡單,因此上手很容易,但是它的變化又非常復(fù)雜。有一種說法是:只需要幾分鐘學會它,卻需要一生的時間去精通它。 黑白棋不僅能增強思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。黑白棋既有現(xiàn)代休閑的明顯特征“短、平、快”,又有古典哲學的高深學問“陰陽易理”;它既有簡單易學的特性,為人民群眾所喜

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

9、使勁吃子,這實際上是犯了短視的錯誤。每一步都盡可能吃更多的子,我們把這種下法叫做大食策略(maximum disc strategy)。除了大食策略以外,還有其它幾種常用的策略以及重要位置和術(shù)語,它們是:穩(wěn)定子 - 位置策略(stable discs - positional strategy)楔入(wedges)行動力策略(mobility)余裕手(tempo,waiting moves)爬邊(creeping along edges) 奇偶性(parity) 非平衡邊(unbalanced edges)四通陷阱(stoner traps) 從黑白棋的游戲規(guī)則上看,應(yīng)該盡量使自己的棋子多于對

10、手的,很容易就得到了一個戰(zhàn)術(shù),就是每步棋都落在能吃掉對手棋子最多的位置,但是經(jīng)過幾局后,你就會發(fā)現(xiàn)這并不是一個好的方法。1.3 相關(guān)實現(xiàn)環(huán)境本程序采用qt庫及其開發(fā)環(huán)境,使用c+語言開發(fā)運行于linux系統(tǒng)kde桌面環(huán)境下的黑白棋游戲。 經(jīng)過實際檢測,qt強大的跨平臺性,已經(jīng)保證了同樣的代碼在windows xp下、linux gnome下、linux kde下,幾乎不用修改就能正常運行。1.3.1 開發(fā)環(huán)境 qt 4.7.4 (4.7.4) mingw編譯器1.3.2 運行環(huán)境microsoft® windows xppentium(r) dual-core cpu 250g硬盤1

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

12、怎么走;然后再假設(shè)我走另外的某一步,如此反復(fù)下去。這個過程叫做搜索。1.5 系統(tǒng)開發(fā)的現(xiàn)實意義利用這次畢業(yè)設(shè)計的機會可以熟悉c+語言的各種特性,鍛煉程序設(shè)計的實踐能力,熟悉c+語言linux下的開發(fā)環(huán)境,熟悉前沿的linux圖形用戶界面的開發(fā),以及鞏固數(shù)據(jù)結(jié)構(gòu)和算法等課程的學習成果,并深入理解數(shù)據(jù)結(jié)構(gòu)和算法在程序設(shè)計中的核心地位。 同時,借助開發(fā)本游戲的過程,可以熟悉人工智能的程序?qū)崿F(xiàn),有助于掌握棋類所需人工智能的常見算法,隨著游戲產(chǎn)業(yè)的日益壯大,人工智能在游戲中的突出表現(xiàn),人工智能越來越得到世人的重視。在這次的人機對戰(zhàn)算法中,通過一定的算法,實現(xiàn)電腦的下棋及走棋運作,加深了對人工智能工作原理

13、的了解。 綜上所述,通過每次黑白棋的開發(fā),可以深入了解linux編程方法、加深了解算法。2 開發(fā)工具qt21 qt簡介qt是一個跨平臺的c+圖形用戶界面庫,由挪威trolltech公司出品,目前包括qt, 基于framebuffer的qt embedded,快速開發(fā)工具qt designer,國際化工具 qt linguist等部分qt支持所有unix系統(tǒng),當然也包括 linux,還支持 winnt/win2k,win95/98 平臺。1 qt是一個多平臺的c+圖形用戶界面應(yīng)用程序框架。它提供給應(yīng)用程序開發(fā)者建立藝術(shù)級的圖形用戶界面所需的所用功能。qt是完全面向?qū)ο蟮暮苋菀讛U展,并且允許真正地

14、組件編程。自從1996年早些時候,qt進入商業(yè)領(lǐng)域,它已經(jīng)成為全世界范圍內(nèi)數(shù)千種成功的應(yīng)用程序的基礎(chǔ)。qt也是流行的linux桌面環(huán)境kde 的基礎(chǔ),kde是所有主要的linux發(fā)行版的一個標準組件?;旧?,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-ux、digital unix (osf/

15、1、tru64)、irix、freebsd, bsd/os、sco、aix、os390、qnx 等等。面向?qū)ο螅?qt 的良好封裝機制使得qt的模塊化程度非常高,可重用性較好,對于用戶開發(fā)來說是非常方便的。qt提供了一種稱為signals/slots的安全類型來替代 callback,這使得各個元件之間的協(xié)同工作變得十分簡單。豐富的api: qt 包括多達250個以上的c+類,還提供基于模板的collections、 serialization、file、i/o device、directory management、date/time 類。甚至還包括正則表達式的處理功能。支持2d/3d圖形渲

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

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

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

19、iona()消息,b部件執(zhí)行funtionb()函數(shù)。3. 黑白棋需求分析為了開發(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ī)則,主要有如下規(guī)則:

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

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

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

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

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

25、intevent(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ù)。而是通過信號與槽機制響應(yīng)相關(guān)函數(shù)。信號與槽的機制在2.3節(jié)中有介紹。再次我們要給新游戲按鈕與初始化函數(shù)建立聯(lián)系,即:qobject:connect(pushbutton_ne

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

27、nal(clicked(), 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(),點擊前進按鈕執(zhí)行前進函數(shù) qobject:connect(checkbox_tip, signal(clicked(), form, slot(update

28、(),點擊tip按鈕,執(zhí)行刷新函數(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) ,點擊單人游戲按鈕,改變該

29、組件狀態(tài)為選中模式,從而決定在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_s

30、ingle, signal(clicked(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

31、:connect(radio_double, 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ù)從

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

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

34、得的(x,y)坐標,在棋盤(x,y)位置放置一枚該方棋子,然后檢測周圍能翻轉(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)的棋子,并進行翻轉(zhuǎn),為了節(jié)省篇幅,再次舉出12點鐘方向的翻轉(zhuǎn)過程,其他方向類似。if (y>1 && weizhixy-1.state = (-1)*whom) /    

35、0;       for (int k=2;k<=y;k+)                    if (weizhixy-k.state = 0 | weizhixy-k.state = -2 |weizhixy-k.state = 2) break;        &

36、#160;   if (weizhixy-k.state = whom)                            for (int i = 1; i<k;i+)           

37、0;                        weizhixy-i.state = whom;                        &

38、#160;       break;                    而判斷可下子位置函數(shù)canbedrop(int x,int y,int whom)的思路和翻轉(zhuǎn)函數(shù)類似,也是進行8方向的判斷。 為了使判斷可走棋位置的循環(huán)減少,在此增加了一個cube(int x,int y)函數(shù)的處理,黑白棋只能在有子位置的相鄰位置才可能放置棋子,開局時棋子周圍的8

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

40、paintevent(qpaintevent *e))進行界面重繪。如果是單人模式,前面的mousepressevent(qmouseevent *e)有介紹,玩家走完會判斷,如果輪到電腦走棋,則執(zhí)行響應(yīng)的ai算法,選擇最佳走棋位置,并在該處走一步棋,交由玩家繼續(xù)走棋。ai算法分為startserch(),負責開局1-10步,middleserch()負責11-50步,50步以后直至終局由endserch()負責。 startserch()函數(shù)主要通過對程序中搜集的棋譜進行比較,如果有該開局模式,則按棋譜走棋,沒有則自動調(diào)用middleserch()的方法進行搜索。 在這些算法中還會用到如下一

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

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

43、出來,然后在對這些位置逐步進行分析。分析的過程就是先假設(shè)計算機在某個位置上落子,然后馬上再次調(diào)用檢測行動力函數(shù),不過這次是檢測對手的行動力。意思就是如果計算機在這里落子,看看對手的行動力如何,如果對手的行動力太大,對手有很多位置可以選擇,那么就不應(yīng)該在這里落子。如此對所有能落子的位置進行檢測,找出一個能讓對手行動力變得最小的位置落子,該函數(shù)mobility()原理為對棋盤進行搜索,找出所有標志為0的格子的個數(shù),即為該處行動力。該函數(shù)原型如下:int myform:mobility()    int move = 0;    for (

44、int i=0;i<8;i+) for (int j=0;j<8;j+)            if (weizhiij.state=0) move+;        return move;5.4.3選擇最佳位置落子使用了一些戰(zhàn)術(shù),使計算機能夠了解當前棋局的情況,最終的目的讓計算機能夠選擇一個合理的位置落子。在本程序里在棋局的不同時期,所采用的選擇方法也是不同的,在程序開局時,優(yōu)先選擇棋譜庫中的固定套路。 而在中期時則以多

45、種估值通過賦予權(quán)值,統(tǒng)計出綜合估值,選取最大估值位置落棋。到了后期,局面已經(jīng)完全可以窮舉,采用最大食子法,以能吃掉對手最多棋子為準。 6.系統(tǒng)測試系統(tǒng)測試的目的主要在于發(fā)現(xiàn)錯誤,找出軟件的缺陷和隱患,是確保軟件質(zhì)量的重要方法。在完成黑白棋游戲之后,分別對游戲中各個進行了測試,主要是檢驗該游戲在各種情況下中的功能能否實現(xiàn),是否滿足黑白棋游戲規(guī)則的走棋,從而驗證該系統(tǒng)確實符合預(yù)訂的需求, 軟件測試就是在軟件投入運行前,對軟件需求分析、設(shè)計規(guī)格說明和編碼的最終復(fù)查,是軟件質(zhì)量保證的關(guān)鍵步驟。早在1973年, w.hetael曾經(jīng)指出,測試是對程序或系統(tǒng)能否完成特定任務(wù)建立信心的過程。 系統(tǒng)在開發(fā)過程

46、中采用了多種措施保證軟件質(zhì)量,但是實際開發(fā)過程中還是不可避免地會產(chǎn)生差錯。系統(tǒng)中通??赡茈[藏著錯誤和缺陷,若將未經(jīng)周密測試的系統(tǒng)投入運行,將會造成難以想象的后果。因此系統(tǒng)測試是管理系統(tǒng)開發(fā)過程中為保證軟件質(zhì)量必須進行的工作。大量統(tǒng)計資料表明,系統(tǒng)測試的工作量往往占管理系統(tǒng)開發(fā)總工作量的40%以上。因此必須重視測試工作。6.1雙人模式下的測試雙人模式是游戲進行的基礎(chǔ),因此此部分的測試較多,且具有代表性。6.1.1 悔棋和悔棋恢復(fù)測試正常情況下,黑白棋雙人模式中悔棋可以悔棋至初始棋局,并能恢復(fù)至玩家最后一次落子的棋局。在悔棋中途,如果玩家改變落子,則只能恢復(fù)至該處,不能也不應(yīng)該繼續(xù)回復(fù)原本沒有恢復(fù)

47、的棋步。6.1.2 pass情況下的悔棋恢復(fù)pass情況下的悔棋恢復(fù),就要先設(shè)計出一個有pass情況的棋局出來,然后選擇悔棋,看是否正常悔棋。6.2 單人模式下的測試單人模式是雙人模式的一個特殊情況,因此有些測試和雙人模式相同,不用反復(fù)測試,只需測試對方走棋是否符合規(guī)則就行。 備注,單人模式測試由于是電腦配合走棋,因此某些環(huán)境不容易還原,在程序開發(fā)中進行過測試,并將測試結(jié)果統(tǒng)計如下,在此就另外不附圖說明。6.2.1 pass情況的測試由于單人模式需要進行思考,所以中途可能會造成遇到pass情況,致使該步走棋方發(fā)生錯誤,比如本來該白棋走的結(jié)果卻是黑棋走。經(jīng)過測試,測試失敗。 查找原因,每次電腦思

48、考都是固定套用每次落子切換走棋方的方法,致使一方pass,本不該切換走棋方的,仍然切換的錯誤情況,后經(jīng)改進為每步棋由哪方走棋的數(shù)組記錄,錯誤得以解決。6.2.2 游戲正常測試本測試,測試電腦ai是否能選擇正確位置走棋,結(jié)果發(fā)現(xiàn)在某些未知情況下,電腦會在本不能下子處下子。 測試失敗。 查找原因,暫時為查明,但該bug位于ai算法函數(shù)中,這點是確定的,因此程序ai算法部分,有待改進。6.2.3 悔棋測試由于單人模式每次需要同時悔棋兩步,因此也要單獨測試,經(jīng)過測試,符合要求,測試成功!6.3 綜合測試報告從以上的測試方法和測試結(jié)果可以看出,該游戲的在雙人模式下能完全正確的運行,與當初的預(yù)想一致。基本

49、上實現(xiàn)了需求分析和系統(tǒng)設(shè)計中所提到的所有功能(計時功能暫未開發(fā))。單人模式下存在一處bug,但影響到程序的可執(zhí)行性,應(yīng)該得到修正。7. 總結(jié)和展望7.1 總結(jié)本程序能以友好的界面運行于windows系統(tǒng)、linux系統(tǒng)的兩大桌面環(huán)境(gnome和kde)、以及mac系統(tǒng)(mac系統(tǒng)未經(jīng)測試,官方聲明說可以)。本程序可以實現(xiàn)雙人對戰(zhàn)、人機對戰(zhàn)、全局棋盤悔棋等黑白棋功能,界面友好。 雖然作為畢業(yè)設(shè)計的部分本設(shè)計已經(jīng)接近尾聲,但作為我的一個程序它僅僅是一個開始,本程序如果作為一個可發(fā)行版,還有以下幾部分需要完善:1. 加入計時功能 2.增加先后手選擇 3.完善ai算法。 對于計時功能和先后手選擇,很

50、容易實現(xiàn)。但考慮到實際應(yīng)用中這兩個也不是黑白棋必須的功能,就把時間主要放在了ai的開發(fā),而沒有完善這個細節(jié)。我們專業(yè)并未開設(shè)過與人工智能相關(guān)的課程,但由于我對此感興趣,在論文選題時毅然選擇了這個挑戰(zhàn)非常大的關(guān)于人工智能的題目,由于我自學能力和時間有限,現(xiàn)在的黑白棋ai部分還處于初級階段,但我會堅持不懈的努力,將黑白棋程序不斷完善。7.2展望計算機下棋是近年來人工智能領(lǐng)域的一個研究熱點,許多新的技術(shù)層出不窮,世界級的棋類大師被計算機打敗的例子屢見不鮮,隨著人工智能在計算機中的廣泛應(yīng)用,人們對計算機的棋力提出了更高的要求。 人工智能下棋技術(shù)經(jīng)過十余年的發(fā)展,取得了很多非常優(yōu)秀的研究成果。但無論是什

51、么樣的算法,計算機運算的速度都是一個不可回避的問題,深藍雖然戰(zhàn)勝了世界國際象棋棋王卡斯帕羅夫,為了提高深藍的下棋速度,所耗費的資源也是非常大的。那么提高算法的精確度,避免無謂的搜索是計算機下棋技術(shù)下一個需要解決的問題。 就像第一章提到的那樣,人工智能技術(shù)在不斷的發(fā)展、不斷前進,那么是否會有一天計算機的智慧超越人類?那時人類會處于怎樣的地位?會像電影里演的那樣電腦控制了地球,而人類成為奴隸嗎?這一切都不得而知,答案就由未來幾十年的計算機工程師來揭開。致謝必須感謝老師對我學習的支持,精神的支持。沒有他們的汗水,我是無法完成本科的學業(yè)的。感謝我的指導(dǎo)老師:張、劉老師。劉老師嚴謹求實、謙遜和藹、平易近人、處處為學生著想,令我敬佩。如果沒老師們的悉心指導(dǎo)也不會寫出本程序,更不會學到linux的編程和相關(guān)知識。我所取得的每一點進步都包含了張老師的心血。 感謝四年來教我知識的其他老師,在即將完成學業(yè)的時刻,我向所有教過我的老師表示衷心的感謝和崇高的敬意。 感謝同組的同學,雖然我們的畢業(yè)設(shè)計是彼此獨立開發(fā),但在畢業(yè)設(shè)計期間,經(jīng)常和他一起討論,相處的很融洽。 感謝所有幫助過我的其他人。四年的本科求學生涯使我完成了學士論文課題的研究工作和本文的撰寫工作,在這段期間得到了很多人的關(guān)懷和幫助,沒有他們的關(guān)懷和幫助很難想象能順

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論