基于Android的中國象棋的設計與實現(xiàn)_第1頁
基于Android的中國象棋的設計與實現(xiàn)_第2頁
基于Android的中國象棋的設計與實現(xiàn)_第3頁
基于Android的中國象棋的設計與實現(xiàn)_第4頁
基于Android的中國象棋的設計與實現(xiàn)_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上實 訓 報 告實訓項目名稱基于Android象棋游戲的開發(fā)與測試二 級 學 院 信息工程學院 專 業(yè) 班 級 11級計科(2)班 姓 名 完圓圓、李城城、孫超、胡迪 學 號 、14、20、08 日 期 2014-11-19 項目名稱基于安卓象棋游戲的開發(fā)與測試地點教13 603報 告 內(nèi) 容在本報告中,首先介紹了安卓的現(xiàn)狀以及開發(fā)的相關(guān)知識,其次是關(guān)于開發(fā)游戲過程中用到的開發(fā)工具和系統(tǒng)的運行環(huán)境配置等。通過對Android系統(tǒng)架構(gòu)和應用開發(fā)進行初步研究,設計一款中國象棋游戲。在對系統(tǒng)進行詳細需求分析的基礎上,確定了系統(tǒng)的功能和性能要求,對游戲的菜單界面、屏幕繪制、時間

2、控制、布局算法和動畫等進行了設計,并最終實現(xiàn)了一個界面友好、高效穩(wěn)定和富有娛樂性的手機益智游戲。最后,實現(xiàn)的是對本次游戲的測試并列舉了測試用列以及給出了測試結(jié)果。教師評語成績: 教師簽名: 摘 要 中國象棋是一款智力休閑游戲,具有歷史悠久而且擁有巨大的游戲愛好者群體,他們以中國象棋陶冶情操、鍛煉智力、體驗象棋帶來的快樂,中國象棋還是一個老少皆宜的娛樂游戲。隨著手持設備、智能手機的普及,搭載Android操作系統(tǒng)的智能手機也已經(jīng)走進了千家萬戶,當人們閑暇偶爾需要娛樂時,卻發(fā)現(xiàn)沒有實物象棋,該軟件不失為一個很好的替代品,供大家進行娛樂享受,尤其是在現(xiàn)在這個快節(jié)奏的社會中 ,人們更滿足于手機的使用,

3、可以方便地隨意移動,不像實物象棋那樣靜靜的坐著。 本論文通過實際應用軟件的開發(fā)深入分析和研究Android開發(fā)技術(shù)。實現(xiàn)中國象棋的人機會話。本文實現(xiàn)了中國象棋在計算機中表示問題,基于Android平臺應用,人機對戰(zhàn)模擬現(xiàn)實中的人人對戰(zhàn);討論走棋規(guī)則和著法的實現(xiàn)等一系列問題,最終電腦能夠通過產(chǎn)生著法,搜索,估計來產(chǎn)生一步最優(yōu)的走棋,實現(xiàn)人機會話的目的。關(guān)鍵字:中國象棋,Android,智能手機,人機對戰(zhàn)目錄專心-專注-專業(yè)1 緒論1.1 研究背景(1) 中國象棋背景中國象棋發(fā)展至今已有兩千三、四百年的歷史,早在戰(zhàn)國時期就有正式的記載,堪稱中國的國粹。中國象棋具有悠久的歷史,深的人們的喜愛,象棋的

4、愛好者也更是數(shù)不勝數(shù),遠在戰(zhàn)國中國象棋便在貴族階層廣為流傳,早期的象棋是象征著當時戰(zhàn)斗場面的游戲,后來這種觀念慢慢被改變,經(jīng)過千年的流傳不斷的完善和改進,成為人們休閑娛樂、鍛煉腦力思維不可獲取的好方式。中國象棋體現(xiàn)的是一種策略,方寸之間包含天地玄機,人生哲理,使人越是細玩越覺其味悠然深遠。由于簡單的行棋規(guī)則,趣味性強,便捷的載體,使得象棋成為雅俗共賞的競技項目。因此,也成為流行極為廣泛的棋藝活動。是我國正式開展的78個之一,為促進該項目在世界范圍內(nèi)的普及和推廣,在中國古代,象棋被列為士大夫們的修身之藝,現(xiàn)在則被視為怡神益智的一種有益的活動。有著數(shù)以億計的愛好者。它不僅能豐富文化生活,陶冶情操,

5、在棋戰(zhàn)中,人們可以從攻與防、虛與實、整體與局部等復雜關(guān)系的變化中悟出某種哲理;更有助于開發(fā),啟迪思維,鍛煉辨證分析能力和培養(yǎng)頑強的意志。(2) Android系統(tǒng)簡介Android 系統(tǒng)構(gòu)架簡介:Android是一個基于Linux®V2.6內(nèi)核的交互性操作環(huán)境,同時它也是一個分層系統(tǒng),Android系統(tǒng)架構(gòu)顯示如下圖1.1。圖1.1系統(tǒng)架構(gòu)圖 應用層由所有的Android應用程序組成。其中包括電子郵件客戶端,SMS程序,地圖,瀏覽器,聯(lián)系人及其他。所有的應用程序都是用Java編程語言編寫的。 應用框架層定義了Android應用程序框架。所有的Android應用程序都是基于應用框架的。

6、Android應用框架包括:l 豐富及可擴展性的視圖,可以用來建立一個美觀的用戶界面,包括列表,網(wǎng)格,文本框,按鈕,甚至是嵌入到Web瀏覽器的應用程序。 l 一組內(nèi)容提供商,使應用程序能夠訪問其他應用程序的數(shù)據(jù)(如電話簿),或共享自己的數(shù)據(jù)。l 資源管理器提供了訪問的非編碼資源的途徑,如本地化的字符串,圖形,布局文件。l 通知管理器允許所有應用程序顯示定制的提示或通知在狀態(tài)欄里。l 活動管理器可以管理應用程序的生命周期,并提供一個通用的后臺堆棧導航。 庫層包括了一套被各類Android 系統(tǒng)組件使用的C / C + +庫并對應用程序框架提供支持。 Android 的運行環(huán)境包括一套核心庫和 J

7、ava 虛擬機(Dalvik虛擬機),已經(jīng)由谷歌重新設計和優(yōu)化來適合Android平臺。 Linux 內(nèi)核位于 Android 系統(tǒng)的底層并作為硬件和軟件之間的一個抽象層。它提供了核心系統(tǒng)服務,如安全,內(nèi)存管理,進程管理,網(wǎng)絡協(xié)議棧和驅(qū)動模型。此外,一些底層功能如 Dalvik 虛擬機線程管理也依賴于Linux內(nèi)核。1.2 本論文研究意義 中國象棋是一項智力和策略的游戲,以往都是人和人下棋,現(xiàn)在有了計算機我們可以和計算機競技,人可以與計算機進行對弈??刂朴嬎銠C的是人類,而人機會話綜合性很強的一門邊緣學科,它的中心任務是研究使計算機如何去做那些過去只能靠人的智力才能做的工作。因此,對游戲開發(fā)過程

8、中的人工智能技術(shù)的研究自然也就成了業(yè)界的一個熱門研究方向。 本次論文的研究,主要是對中國象棋在Android系統(tǒng)中的兼容行性,對游戲界面可觀性,游戲中人機會話的研究。對于游戲中的人機會話的要點:a 某種在及其上表示棋局的方法,讓程序知道會話的狀態(tài);b 產(chǎn)生合法的走棋法則,使得會話雙方公正,并可以判斷人類對手是否亂走;c 從所有和法定的走法中選擇最佳的走法的技術(shù);d 一種評估局面優(yōu)化的方法,同上面技術(shù)配合做出智能選擇;e 一個實現(xiàn)游戲的界面;通過對游戲的設計,來實現(xiàn)游戲中棋牌的表示,著法的生成,對著法的搜索,最后對局面的評估來實現(xiàn)中國象棋的人機會話。2 游戲系統(tǒng)開發(fā)平臺及搭建2.1 JDK和 E

9、clipse:JDK是Sun公司針對java開發(fā)員的產(chǎn)品。自從Java推出以來,JDK已經(jīng)成為使用最廣泛的java SDK。JDK是整個java的核心。包括運行環(huán)境Java工具和Java基礎類庫。JDK是學好Java的第一步。安裝Eclipse的開發(fā)環(huán)境需要JDK的支持,如果沒有JDK,則啟動Eclipse時會報告錯誤。在windows上安裝JDK非常簡單首先在Sun官網(wǎng)上下載,按照默認路徑進行安裝。安裝完成之后,可以在檢查JDK是否安裝成功。打開cmd窗口,輸入java version 查看JDK的版本信息。出現(xiàn)類似下面的畫面表示安裝成功了:圖 2.1 JDK測試Eclipse如果你還沒有E

10、clipse的話,從官網(wǎng)上下載Eclipse IDE for Java Developers解壓之后即可使用。2.2 Android SDKAndroidSDK 提供了在 windows 平臺上的開發(fā)安卓應用程序的開發(fā)組件,也就是說,不論讀者使用什么樣的平臺都可以開發(fā)出安卓平臺的應用軟件,其中包含了安卓平臺上開發(fā)移動應用的各種工具集。它不僅包括了安卓模擬器和用于Eclipse的安卓開發(fā)工具插件(ADT),而且包括了各種用來調(diào)試,打包盒在模擬器上安裝應用的工具。安卓主要是以 java 語言為基礎,用戶可以使用 java 語言來開發(fā) 安卓平臺上的軟件應用。通過SDK提供的一些工具將其打包成安卓平臺

11、使用的apk文件,然后在使用SDK中的模擬器(Emulator)來模擬和測試軟件在安卓平臺運行情況和效果。安裝安卓的SDK,安裝好JDK和Eclipse后,打開Eclipse IDE。依次單擊Menu項中的windows->Android SDK Manager項,進入Android SDK Manager界面選擇Tool和需要的Android版本項進行更新安裝。2.3 ADTAndroid為Eclipse定制了一個插件,及ADT(Android Development Tools),目的是為用戶提供一個強大的綜合環(huán)境用于開發(fā)Android應用程序,ADT擴展了Eclipse的功能,可以

12、讓用戶快速的建立Android項目,創(chuàng)建應用程序界面,在基于Android API的基礎上添加組件,以及用SDK工具集調(diào)試應用程序,甚至導出簽名(或未簽名)的APKs以便發(fā)行應用程序。安裝Android Development Tool plug-in,打開 Eclipse IDE。依次單擊Menu項中的Help->Software Update項3 系統(tǒng)分析3.1 可行性研究本次實訓的題目是:基于Android象棋游戲的開發(fā)與測試;主要是在基于Android平臺開發(fā)一個手持設備應用游戲,使得游戲具有兼容性和人機對戰(zhàn);并對整個系統(tǒng)分析,設計過程給出一個論證。中國象棋游戲是棋牌類游戲,體現(xiàn)

13、的是一種策略。對于行棋走棋不同的棋子有不同走棋規(guī)則,走棋都必須按照走棋規(guī)則要求,雙方輪換走棋,吃子,將軍。本游戲設計無疑是模擬現(xiàn)實人人博弈,虛擬的替換了真實的棋子棋盤,由人來和電腦直接對弈;在一個人閑暇時也可以體驗博弈的樂趣。該應用游戲的設計主要從以下幾方面做起:系統(tǒng)流程分析、系統(tǒng)的功能設計、系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)設計。做好這些工作需要對Android開發(fā)平臺了解,并搭建平臺;深入了解數(shù)據(jù)結(jié)構(gòu)、Android應用程序以及各種組件(API)庫函數(shù)。3.2 界面的需求分析 通過以往手持設備游戲的體驗,和用戶對中國象棋游戲需求邏輯,游戲的功能以及操作方法把整個設計劃分成單元;先是運行游戲,進入歡迎游戲界面,

14、隨后單擊歡迎界面的圖片進入菜單界面,在菜單中可以點擊“打開聲音”/“關(guān)閉聲音”按鈕來控制聲音開關(guān),單擊“幫助”菜單可以進入幫助界面顯示游戲操作方法,而在菜單界面單擊“開始游戲”菜單將進入游戲主界面開始游戲,在游戲界面玩家可以通過單擊自己的棋子按照行棋規(guī)則來走棋,同時可以單擊聲音按鈕打開關(guān)閉聲音,當游戲一方的“將”或者敵方的“帥”被吃掉是,會出現(xiàn)游戲失敗或游戲勝利的界面,在游戲過程中玩家可以隨時通過單擊“退出”按鈕返回到游戲主菜單,主菜單中還可以點擊“退出游戲”結(jié)束關(guān)閉游戲。3.3 游戲走棋需求設計分析進入游戲界面,游戲提示當前走棋為“帥”或者“將”,雙方各走一著,直至分出勝負或者直接點擊退出結(jié)

15、束游戲,輪到走棋的一方,將某個棋子從一個交叉點走到另一個交叉點,或者吃掉對方的棋子而占領(lǐng)其交叉點,都算走一著,雙方各走一著即一個回合,吃子時,任何棋子走動,如果目標位置上有對方的棋子,就可以把對方的棋子拿出棋盤,即屏幕上消失在顯示自己的棋子。玩家走完棋后電腦相對應搜索出自己相對應的走法。程序需要讓計算機在輪到它走子的時候能夠執(zhí)行一步它認為最有利的著法,而不是亂走;那么它就要有在諸多可供選擇的著法,提供所有候選著法的列表就是著法生成器所要完成的。之后用搜索函數(shù)來搜索列表,并用局面評估函數(shù)逐一打分,最后就可以選擇出最佳著法并執(zhí)行。4 游戲系統(tǒng)的設計與實現(xiàn)4.1 類框架的設計通過對中國象棋游戲的了解

16、,對基于Android技術(shù)的中國象棋人機對弈游戲的需求分析,游戲?qū)崿F(xiàn)的理解并結(jié)合自己對知識點所掌握的程度;對中國象棋游戲總體設計,主要由三個類組成:共有類,輔助界面相關(guān)類,游戲界面相關(guān)類。共有類是Activity的實現(xiàn)類ChessActivity,該類是通過擴展基類Activity得到的,是整個游戲的控制器,也是整個游戲程序的入口;輔助界面相關(guān)類由WelcomeView歡迎界面類(該類為游戲歡迎界面的實現(xiàn)類,主要負責歡迎界面的繪制工作),HelpView幫助界面類(該類為幫助界面的實現(xiàn)類),MenuView菜單界面類(該類為菜單界面的實現(xiàn)類,負責繪制菜單界面以及對菜單界面的屏幕進行監(jiān)聽)三個類

17、實現(xiàn);游戲界面相關(guān)類由GameView游戲界面類(該類為游戲程序中最主要的類,負責繪制游戲過程中所有的信息,如棋盤、棋子、各個按鈕以及勝利或失敗菜單等),GuiZe象棋規(guī)則類(該類是象棋規(guī)則的實現(xiàn)類,其中包含所有棋子的走棋規(guī)則以及當前棋牌所有可能走法),ChessMove走法類(該類為棋子的走法的封裝類,包括棋子的名稱,出發(fā)點以及目標點)。之間關(guān)系如圖4.1所示:圖4.1游戲類圖4.2 共有類ChessActivity的實現(xiàn)該類的主要作用是通過接受Handler消息變量,根據(jù)各個界面發(fā)送的Handler消息的類型判斷所需要執(zhí)行的操作。在適當?shù)臅r間初始化相應的用戶界面,各個界面初始化方法被調(diào)用時

18、,并根據(jù)其他界面的需求直接將用戶界面切換到相應的界面4.3 輔助界面相關(guān)類的實現(xiàn)該游戲的第一個用戶界面即歡迎界面如圖4.2所示,通過WelcomeView類來實現(xiàn)該界面加載了一個歡迎中國象棋圖片,并通過監(jiān)聽菜單圖片,向Activity發(fā)送Handler消息通知控制器切換用戶界面;然后切換到菜單界面MenuView。圖 4.2 游戲歡迎界面 MenuView類中通過監(jiān)聽“開始游戲”切換到游戲界面;通過監(jiān)聽“打開聲音”/“關(guān)閉聲音”進行聲音的打開與關(guān)閉,與此同時“打開聲音”、“關(guān)閉聲音”按鈕進行切換;通過監(jiān)聽“幫助”來切換都幫助界面;通過監(jiān)聽“退出游戲”結(jié)束游戲用行退出游戲。幫助界面HelpVie

19、w,該類中加載圖片,圖片中顯示該游戲“怎么玩”同時監(jiān)聽“返回”按鈕,向Activity發(fā)送Handler消息通知控制器切換用戶界面從而返回到菜單界面,如圖4.3所示。圖 4.3 菜單界面4.4 游戲界面相關(guān)類的實現(xiàn)游戲界面GameView,該類是整個程序中最主要的類,該類首先是繪制屏幕上的內(nèi)容棋盤和對應的棋子。提示一方先走;當“黑帥”或者“紅將”被吃的話,彈出您贏了或者您輸了通過監(jiān)聽結(jié)束游戲切換到菜單界面?;蛘唿c擊退出按鈕也可結(jié)束游戲切換至菜單界面。監(jiān)聽聲音按鈕來控制聲音的開與關(guān)并以紅色顯示聲音開,消失即為關(guān),如圖4.4所示。圖4.4游戲界面4.5 中國象棋的規(guī)則及走法的實現(xiàn)(1) 行棋規(guī)則中

20、國象棋分為紅黑雙方,以楚河漢界為分界線,雙方各執(zhí)16字,分別為2車2馬2相2仕2炮1將5卒,各自走法不同,具體如下:馬:只可以走“日”字方格,因此一匹馬的最理想落子點有8個,但存在絆馬腿的情況,即從馬的位置到要走到的目標位置,順著此方向,“日”字方格有兩個方向,即兩格長度和一個長度,馬緊挨的兩格長度方向的位置不能有子,否則即被絆住,不能走動。若目標位置為空,即可走過,若為對方的棋子,即可吃掉。圖4.5馬的走法紅黑馬規(guī)則走法的介紹:case 10:/紅馬 case 3:/黑馬if(!(Math.abs(toX-fromX)=1 && Math.abs(toY-fromY)=2)|

21、 (Math.abs(toX-fromX)=2 && Math.abs(toY-fromY)=1)return false;/馬走的不是日字時if(toX-fromX=2)/向右走i=fromX+1;/移動j=fromY;else if(fromX-toX=2)/向左走i=fromX-1;/移動j=fromY;else if(toY-fromY=2)/向下走i=fromX;/移動j=fromY+1;else if(fromY-toY=2)/向上走i=fromX;/移動j=fromY-1;if(qiziji != 0)return false;/絆馬腿break;炮:只可以走直線

22、,且一步可以走任意距離,其起始點與目標點之間不得存在其他棋子。炮吃子的條件是與目標棋子在一條直線上,且兩子之間必須有且只有一個棋子作為“跳板”,讓炮進行跳躍式攻擊。紅黑炮規(guī)則走法的介紹:圖4.6炮的走法case 11:/紅砲case 4:/黑炮if(fromY!=toY && fromX!=toX)/炮走直線return false;/返回falseif(qizitoYtoX = 0)/不吃子時if(fromY = toY)/橫線if(fromX < toX)/想右走for(i = fromX + 1; i < toX; i+)if(qizifromYi != 0)

23、return false;/返回falseelse/向走走for(i = toX + 1; i < fromX; i+)if(qizifromYi!=0)return false;/返回falseelse/豎線if(fromY < toY)/向下走for(j = fromY + 1; j < toY; j+)if(qizijfromX != 0)return false;/返回falseelse/向上走for(j = toY + 1; j < fromY; j+)if(qizijfromX != 0)return false;/返回falseelse/吃子時int co

24、unt=0;if(fromY = toY)/走的是橫線if(fromX < toX)/向右走for(i=fromX+1;i<toX;i+)if(qizifromYi!=0)count+;if(count != 1)return false;/返回falseelse/向左走for(i=toX+1;i<fromX;i+)if(qizifromYi != 0)count+;if(count!=1)return false;/返回falseelse/走的是豎線if(fromY<toY)/向下走for(j=fromY+1;j<toY;j+)if(qizijfromX!=0)

25、count+;/返回falseif(count!=1)return false;/返回falseelse/向上走for(j=toY+1;j<fromY;j+)if(qizijfromX != 0)count+;/返回falseif(count!=1)return false;/返回falsebreak;象、相:只可以在己方陣營走動,且僅限于7個點,即己方“田”字格上的7個點,走的是斜線,走動時,起始點與目標點構(gòu)成一條斜線,若該斜線的中點位置存在其他棋子,則被絆住無法走動。圖4.7象的走法case 6:/黑象if(toY>4)/不能過河return false;if(Math.abs

26、(fromX-toX) != 2 | Math.abs(fromY-toY) != 2)/相走“田”字return false;if(qizi(fromY+toY)/2(fromX+toX)/2 != 0)return false;/相眼處有棋子break;case 13:/紅相if(toY<5)/不能過河return false;/返回falseif(Math.abs(fromX-toX) != 2 | Math.abs(fromY-toY) != 2)/相走“田”字return false;/返回falseif(qizi(fromY+toY)/2(fromX+toX)/2 != 0)

27、return false;/相眼處有棋子break;將、帥:只可以在己方陣營走動,且僅限于9個點,即己方底三行中三列形成的9個交叉點,也就是俗稱的“九宮”,一步只可以走動一個方格的直線距離作為本方的主將,鎮(zhèn)守大本營,雙方的主將是不能夠處于同一條直線而主將之間不存在其他的棋子進行隔擋。圖4.8將帥的走法case 1:/黑帥if(toY>2|toX<3|toX>5)/出了九宮格return false;if(Math.abs(fromY-toY)+Math.abs(toX-fromX)>1)/只能走一步return false;break;case 8:/紅將if(toY&

28、lt;7|toX>5|toX<3)/出了九宮格return false;if(Math.abs(fromY-toY)+Math.abs(toX-fromX)>1)/只能走一步return false;break;(2) 棋盤的表示針對棋盤的設計,每一種棋子對應一個固定的值用以識別該棋子的類型,那么設計就根據(jù)紅黑雙方的棋子以及每個類型的棋子,設計規(guī)則類(GuiZe類,調(diào)用其中的canMove方法用以判斷某一步走棋的是否可行。規(guī)則類的設計則采用了常規(guī)的辦法,因為棋子的種類只有7種,且紅黑雙方處于棋盤的兩端,某些棋子走動時的方向不一樣,設計時就要進行分類討論設計,供存在14中不同的

29、判別方法來對所以的棋子走法進行判別是否可行,每一個判別方法都對應于其獨有的判斷算法。棋盤上各種棋子以及棋盤的初始布局的設計采用10*9的數(shù)組來進行標識,如下圖4.9所示 : 圖 4.9棋盤初始布局各個數(shù)字的對應關(guān)系如下:0-無棋子;1-黑方的帥;2-黑方的車;3-黑方的馬;4-黑方的炮;5-黑方的士;6-黑方的象;7-黑方的卒;8-紅方的將;9-紅方的車;10-紅方的馬;11-紅方的炮;12-紅方的士;13-紅方的相;14-紅方的兵。坐標(0,0)到坐標(8,4)之間的坐標代表楚河漢界的一方,坐標(0,5)到坐標(8,9)之間的坐標代表楚河漢界的另一方,即紅黑雙方各自的領(lǐng)土。電腦走棋時通過構(gòu)造

30、一個走法類ChessMove,創(chuàng)建一個對象調(diào)用NegamaxEngine類中的Search()函數(shù)根據(jù)當前局勢查詢一個最好的走法記錄棋子的原有位置坐標、目標位置坐標、棋子類型并對該對象進行初始化。然后根據(jù)該對象記錄的原有位置坐標和目標位置坐標進行數(shù)據(jù)改變達到行棋目的。玩家走棋是通過對屏幕進行監(jiān)聽,從而記錄棋子類型,原有位置坐標和目標位置坐標,通過調(diào)用規(guī)則類GuiZe中的CanMove判斷該棋子走法是否可行符合棋子走棋規(guī)則,可行就改變原有位置和目標位置數(shù)據(jù),達到行棋的目的輪到走棋的一方,游戲界面當前位置顯示走棋一方的“黑帥”或者“紅將”,將某個棋子從一個交叉點走到另一個交叉點,或者吃掉對方的棋子

31、而占領(lǐng)其交叉點,這樣一方走棋結(jié)束當前位置顯示改變輪到另一方走棋。任何棋子走動,如果目標位置上有對方的棋子,就可以把對方的棋子拿出棋盤,即在10*9數(shù)組中相應位置的數(shù)字變?yōu)樽约浩遄铀鶎臄?shù)字,自己棋子原來所在的位置對應數(shù)組的數(shù)字變?yōu)?,刷幀線程不斷的刷新界面改變屏幕顯示,這樣對方的棋子就被吃掉,在屏幕上消失在對應顯示自己的棋子;如果目標位置上沒有對方棋子,10*9數(shù)組對應目標位置數(shù)字改變,原有位置數(shù)字變?yōu)?,刷幀線程更新界面改變顯示。4.6 游戲人機對戰(zhàn)的實現(xiàn)(1) 首先產(chǎn)生所有可能的走法,定義一個ArrayList容器,把可能的走法放入ArrayList容器里面。public List<

32、;ChessMove> allPossibleMoves(int qizi)/產(chǎn)生所有可能的走法 List<ChessMove> ret = new ArrayList<ChessMove>();/用來裝所有可能的走法 for (int x = 0; x < 10; x+) for (int y = 0; y < 9; y+)/循環(huán)所有的棋牌位置 int chessman = qizixy; if (chessman != 0)/當次位置不為空時,即有棋子時 if(chessman > 7)/是紅方,即是玩家棋子時跳過 continue; . r

33、eturn ret.isEmpty() ? null : ret;/當ret中沒有走法時,返回空,有時返回ret(2) 利用隨機數(shù)從容器中取出一種走法,完成移動。public ChessMove searchAGoodMove(int qizi)/查詢一個好的走法List<ChessMove> ret = allPossibleMoves(qizi);/產(chǎn)生所有走法try Thread.sleep(1000);/睡眠四秒鐘,以便調(diào)試 catch (InterruptedException e) /捕獲異常e.printStackTrace();/打印堆棧信息return ret.g

34、et(int)(Math.random()*ret.size();4.7 系統(tǒng)流程圖游戲流程圖如圖4.10所示圖4.10系統(tǒng)流程圖5 運行測試5.1 測試用例表測試編號測試目標期望結(jié)果實際結(jié)果001測試象棋“馬”是否“絆馬腿”游戲過程中,“馬”在絆馬腿情況下不能移動。能實現(xiàn)“絆馬腿”002測試一方棋子能否被另一方吃掉,并消失棋子被吃后消失,吃子的棋子能代替被吃棋子的位置一方棋子能被另一方吃掉,并消失003測試對手的象棋“將”能否被將死,能結(jié)束游戲?qū)κ值南笃濉皩ⅰ北粚⑺溃⒊霈F(xiàn)提示“你贏了” ,結(jié)束游戲?qū)κ值南笃濉皩ⅰ北粚⑺?,能結(jié)束游戲004測試象棋“炮”是否能隔子吃掉對手的棋子,即“炮打隔子”

35、“炮”隔子吃掉對手棋子“炮”能“炮打隔子”005測試游戲棋子是否能移動棋子從一個到另一個位置游戲棋子能移動006不同分辨率模擬器能否正常運行能夠正常運行不能正常運行007能否對將可以對將不能對將5.2 測試結(jié)果(1) 測試001“馬”是否“絆馬腿”測試結(jié)果如圖5.1所示圖5.1測試絆馬腿(2) 測試002一方棋子能否被另一方吃掉測試結(jié)果如圖5.2所示圖5.2測試吃子(3) 測試003“將”能否被將死測試結(jié)果如圖5.3所示圖5.3測試能否贏棋(4) 測試003“將”能否被將死測試結(jié)果如圖5.4所示圖5.4測試對將(5) 測試006不同分辨率模擬器能否正常運行如圖5.5所示圖5.5測試不同分辨率模

36、擬器6 小結(jié)三周的Android實訓,已接近尾聲。在這短暫的三周之內(nèi),有成功有失敗;有喜悅有心酸。在實訓老師的帶領(lǐng)下,我學到了很多。我們小組在老師的協(xié)助下最終成功的完成實訓項目。在這次實訓中讓我學到了,對于每一個項目開發(fā),都需端正態(tài)度,量力而行,發(fā)揮自己的長處,這樣不僅有利于促進團隊項目開發(fā)的進度,還有利于把自己代入這個項目中。當自己融于這個項目時,就能多思考。這樣是一個自我學習的過程,這里本來不會做,但是經(jīng)過這個項目或這個模塊后,這里也就會了,把不會的變成會的,把別人的知識變成自己的,這才是會學習。通過為期三周的Android實訓,這次的實訓讓我學到了很多知識。在項目中,除了讓我明白工作中需

37、要能力,素質(zhì),更重要的是學會如何去完成一個任務,懂得了享受工作。當遇到問題時要冷靜去想辦法一點一點的排除障礙,到最后取得成功,一種自信油然而生,這就是工作的樂趣。有時候也需要虛心請教,從別人身上能夠?qū)W到自己沒有的知識,每一次的挫折只能使我們更接近成功。在這次項目中讓我體會到了團隊合作的重要性,團隊合作注重溝通和信任,不能不屑于做一些小事,永遠要保持親和誠信,把專業(yè)理論運用到具體實踐中,不僅加深我對理論的掌握和運用,這是實訓中最大的收獲。剛開始接觸Android感覺到他很有意思,在界面開發(fā)和web也可以形成想通的架構(gòu),更加方便,視覺上也非常的酷,前期我通過大量的Android SDK開發(fā)范例和A

38、ndroid提供的API文檔中學習,通過這些例子的學習我從中發(fā)現(xiàn)了很多和以前Java相同的思想。在這為期三周的實訓中讓我學到了很多課堂上學不到的知識,讓我基本掌握了Android應用程序開發(fā)的一般流程。對常用控件基本掌握使用,對其事件的監(jiān)聽也基本掌握。學習Android不僅是對前沿開發(fā)技術(shù)的了解,也是對編程知識的一次提升。通過學習Android的控件、布局、Activity、Service等一系列基礎知識,對整個Android的開發(fā)有了大致的了解。通過這次的實訓,讓我學到了很多,因為我們都是第一次接觸Android,所以老師先給我們講的每一個程序我們都去認真編寫,通過這些小程序,讓我們知道了如

39、何去創(chuàng)建一個Android項目,了解了Android項目里的每一個文件夾和文件的作用。在這次項目中讓我體會到了團隊合作的重要性,團隊合作注重溝通和信任。同時還讓我知道做任何事都需端正態(tài)度,量力而行,發(fā)揮自己的長處,這樣不僅有利于促進團隊項目開發(fā)的進度,還能讓我們知道我們自己的位置??傊谶@次的實訓中讓我學到了知識,同時也讓我學到了經(jīng)驗,這讓我在以后的工作中有重大幫助。參考文獻1 劉敏.  D. 西安電子科技大學 2011 2 王蕾.  D. 吉林大學 2011 3 施金蘭.  D. 華東師范大學 2011 4 趙建勛. &#

40、160;J. 現(xiàn)代商貿(mào)工業(yè). 2010(20) 5 李林濤,朱珊虹.  J. 新鄉(xiāng)學院學報(自然科學版). 2011(03) 6 叢秋波.  J. 電子設計技術(shù). 2010(07) 7 郭國勇.  D. 蘭州大學 2012 8 擺云.  D. 蘭州大學 2012 9 劉牛.  D. 蘭州大學 2012 10 王康.  D. 太原科技大學 2012 附錄:ChessActivity.javapackage com.example.chessgame;import android

41、.app.Activity;/引入相關(guān)的包import android.media.MediaPlayer;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.Window;import android.view.WindowManager;public class ChessActivity extends Activity boolean isSound = true;/是否播放聲音MediaPlayer startSound;/開始和菜單時的音樂M

42、ediaPlayer gamemusic;/游戲聲音Handler myHandler = new Handler()/用來更新UI線程中的控件 public void handleMessage(Message msg) if(msg.what = 1)/WelcomeView或HelpView或GameView傳來的消息,切換到MenuView initMenuView();/初始化并切換到菜單界面 else if(msg.what = 2)/MenuView傳來的消息,切換到GameView initGameView();/初始化并切換到游戲界面 else if(msg.what = 3

43、)/MenuView傳來的消息,切換到HelpView initHelpView();/初始化并切換到幫助界面 ; public void onCreate(Bundle savedInstanceState) /重寫的onCreate super.onCreate(savedInstanceState);/全屏requestWindowFeature(Window.FEATURE_NO_TITLE);getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN , WindowManager.LayoutParams.FLAG

44、_FULLSCREEN);startSound = MediaPlayer.create(this, R.raw.startsound);/加載歡迎聲音startSound.setLooping(true);/設置游戲聲音循環(huán)播放 gamemusic = MediaPlayer.create(this, R.raw.gamemusic);/游戲過程的背景聲音gamemusic.setLooping(true);/設置游戲聲音循環(huán)播放 this.initWelcomeView();/初始化歡迎界面 public void initWelcomeView()/初始化歡迎界面 this.setCon

45、tentView(new WelcomeView(this,this);/切換到歡迎界面 if(isSound)/需要播放聲音時 startSound.start();/播放聲音 public void initGameView()/初始化游戲界面 this.setContentView(new GameView(this,this); /切換到游戲界面 public void initMenuView()/初始化菜單界面 if(startSound != null)/停止 startSound.stop();/停止播放聲音 startSound = null; if(this.isSound

46、)/是否播放聲音 gamemusic.start();/播放聲音 this.setContentView(new MenuView(this,this);/切換View public void initHelpView()/初始化幫助界面 this.setContentView(new HelpView(this,this);/切換到幫助界面 ChessMove.javapackage com.example.chessgame;/* * 該類為棋子的一個走法 * 包含是什么棋子 * 起始點的位置 * 目標點的位置 * 以及估值時所用到的score */public class ChessMo

47、ve int ChessID;/表明是什么棋子int fromX;/起始的坐標int fromY;int toX;/目的地的坐標int toY;int score;/值,估值時會用到public ChessMove(int ChessID, int fromX,int fromY,int toX,int toY,int score)/構(gòu)造器this.ChessID = ChessID;/棋子的類型this.fromX = fromX;/棋子的起始坐標this.fromY = fromY;this.toX = toX;/棋子的目標點x坐標this.toY = toY;/棋子的目標點y坐標this

48、.score = score;SearchEngine.javapackage com.example.chessgame;public class SearchEngine /表示棋盤棋的分布 public static int m_curPosition = new int109; /記錄最佳走棋 public static ChessMove bestMove = new ChessMove(); /走法產(chǎn)生七器 public static GuiZe moveGen = new GuiZe(); /估值產(chǎn)生器 public static Eveluation m_eve = new Eveluation(); /搜索深度 public static int m_searchDepth; /當前搜索深度 public static int m_maxDepth; /移動棋子 public static void searchAgoodMove(int position) public static int makeMove(ChessMove data) int chessID;chessID = m_curPositiondata.toYdata.toX; m_curPositiondata.toY

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論