基于Android的數(shù)獨(dú)游戲設(shè)計(jì)說(shuō)明_第1頁(yè)
基于Android的數(shù)獨(dú)游戲設(shè)計(jì)說(shuō)明_第2頁(yè)
基于Android的數(shù)獨(dú)游戲設(shè)計(jì)說(shuō)明_第3頁(yè)
基于Android的數(shù)獨(dú)游戲設(shè)計(jì)說(shuō)明_第4頁(yè)
基于Android的數(shù)獨(dú)游戲設(shè)計(jì)說(shuō)明_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、. . . . 學(xué)生班級(jí)學(xué)號(hào)專 業(yè)計(jì)算機(jī)科學(xué)與技術(shù)課程設(shè)計(jì)題目基于Android的數(shù)獨(dú)游戲設(shè)計(jì)評(píng)語(yǔ)組長(zhǎng)簽字:成績(jī)?nèi)掌?014 年 月 日課程設(shè)計(jì)任務(wù)書學(xué) 院信息科學(xué)與工程學(xué)院專 業(yè)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)生班級(jí)學(xué)號(hào)課程設(shè)計(jì)題目基于Android的數(shù)獨(dú)游戲設(shè)計(jì)實(shí)踐教學(xué)要求與任務(wù):能夠運(yùn)用Java語(yǔ)言設(shè)計(jì)數(shù)獨(dú)游戲,實(shí)現(xiàn)基本游戲效果。會(huì)搭建Android的開發(fā)環(huán)境,并學(xué)會(huì)運(yùn)用 Eclipse開發(fā)工具相關(guān)Android程序進(jìn)行開發(fā);深入了解Android項(xiàng)目生成的文件之間的關(guān)系和它們的作用。工作計(jì)劃與進(jìn)度安排:第一階段:20學(xué)時(shí)。設(shè)計(jì)階段。學(xué)生根據(jù)所選題目,查閱有關(guān) 資料,綜合所學(xué)的理論知識(shí),完成

2、整體設(shè)計(jì)與具體設(shè)計(jì)。第二階段:8學(xué)時(shí)。調(diào)試測(cè)試階段。上機(jī)調(diào)試測(cè)試,要求學(xué)生務(wù) 必認(rèn)真,思想高度集中,調(diào)試成功后,整理、編寫設(shè)計(jì)資料與實(shí)驗(yàn) 報(bào)告。 第三階段:4學(xué)時(shí)。驗(yàn)收答辯。指導(dǎo)教師: 2014 年 月 日專業(yè)負(fù)責(zé)人:2014 年 月 日學(xué)院教學(xué)副院長(zhǎng):2014 年 月 日摘要移動(dòng)互聯(lián)網(wǎng)時(shí)代的到來(lái)極大的改變了我們的生活,而Android是一種以Linux為基礎(chǔ)的開放源碼操作系統(tǒng)迅速占領(lǐng)了智能機(jī)操作系統(tǒng),所以在android環(huán)境下開發(fā)顯得尤為必要。Android是開放性體系架構(gòu),不僅具有非常好的開發(fā)、調(diào)試環(huán)境,而且還支持各種可擴(kuò)展的用戶體驗(yàn),包括豐富的圖形組件、多媒體支持功能以與強(qiáng)大的瀏覽器。因

3、此,對(duì)于軟件從業(yè)人員來(lái)說(shuō),Android平臺(tái)具有無(wú)限的吸引力。本文就在分析討論Android手機(jī)軟件開發(fā)技術(shù)原理的基礎(chǔ)上,為用戶開發(fā)出基于Android平臺(tái)的數(shù)獨(dú)游戲的軟件。通過(guò)對(duì)Android系統(tǒng)架構(gòu)和應(yīng)用開發(fā)進(jìn)行初步研究,設(shè)計(jì)一款數(shù)獨(dú)游戲。在對(duì)系統(tǒng)進(jìn)行詳細(xì)需求分析的基礎(chǔ)上,確定了系統(tǒng)的功能和性能要求,對(duì)游戲的開機(jī)動(dòng)畫,菜單界面、屏幕繪制、時(shí)間控制、布局算法等進(jìn)行了設(shè)計(jì)。本文詳細(xì)介紹了在Android平臺(tái)上以Java為語(yǔ)言編寫游戲的過(guò)程,最終實(shí)現(xiàn)了一個(gè)界面友好、操作簡(jiǎn)單的手機(jī)益智游戲。關(guān)鍵詞:Android 數(shù)獨(dú) 智能機(jī)目錄1、開發(fā)工具與環(huán)境52、系統(tǒng)分析與設(shè)計(jì)92.1數(shù)獨(dú)游戲背景92.2游

4、戲功能簡(jiǎn)介93、系統(tǒng)詳細(xì)設(shè)計(jì)123.1 歡迎界面的設(shè)計(jì)和實(shí)現(xiàn)123.2 游戲界面相關(guān)類的實(shí)現(xiàn)173.3 數(shù)獨(dú)算法類的實(shí)現(xiàn)193.4 游戲的測(cè)試和運(yùn)行234、總結(jié)28參考文獻(xiàn)291、開發(fā)工具與環(huán)境Android 是谷歌公司發(fā)布的手機(jī)操作系統(tǒng),它是基于Linux 平臺(tái)的開源手機(jī)操作系統(tǒng),谷歌公司將要把其打造為基于移動(dòng)終端的真正開放的移動(dòng)軟件平臺(tái),不僅擁有移動(dòng)所需要的工作軟件,而且在專利權(quán)方面能夠不侵犯他人權(quán)利去推動(dòng)移動(dòng)互聯(lián)網(wǎng)的創(chuàng)新。谷歌公司為了開發(fā)Android,與開放手機(jī)聯(lián)盟進(jìn)行了合作,手機(jī)開放聯(lián)盟由全球30 多家移動(dòng)開發(fā)和手機(jī)應(yīng)用的領(lǐng)先企業(yè)組成。谷歌公司不僅僅和運(yùn)營(yíng)商達(dá)成了合作關(guān)系、而且與設(shè)備

5、制造商以與開發(fā)商保持長(zhǎng)期合作,目的就在于利用其優(yōu)勢(shì)建立移動(dòng)軟件平臺(tái),其特點(diǎn)是標(biāo)準(zhǔn)化、開放式的。Android是谷歌公司未來(lái)企業(yè)戰(zhàn)略的一部分,其目的是為了在任何時(shí)候任何地點(diǎn)能夠提供信息。Android應(yīng)用程序與其他很多計(jì)算機(jī)平臺(tái)的應(yīng)用程序不同,他們沒(méi)有唯一的啟動(dòng)入口,一個(gè)Android應(yīng)用程序是由多個(gè)不同組件組合而成,組件間通過(guò)Intent實(shí)現(xiàn)通信。Android系統(tǒng)的基本組件包括Activity、Service、Broadcast Receiver和Content Provider等,要實(shí)現(xiàn)組件間通信,還需要Intent消息組件。并不是每個(gè)Android應(yīng)用程序都必須具備這四個(gè)組件,很多時(shí)候只

6、需要這四種中的某幾種就可以了。除此之外,應(yīng)用程序的所有組件還都必須在AndroidManifest.xml中聲明8。這是一個(gè)XML配置文件,這個(gè)配置文件用于定義應(yīng)用程序的組件、組件的功能與必要條件等。這個(gè)配置文件是任何一個(gè)Android應(yīng)用程序所必需的。1.1 ActivityActivity 可以說(shuō)是開發(fā)人員最常用的組件,同時(shí)也屬于Android 最基本的組成部分之一。Android 程序中,一般一個(gè)Activity 代表手機(jī)屏幕上的一屏。舉例來(lái)說(shuō),如果將手機(jī)比作一個(gè)瀏覽器,那么一個(gè)Activity 就相當(dāng)于一個(gè)網(wǎng)頁(yè)。在Activity 中,可以添加多個(gè)視圖,然后為這些視圖添加一些事件處理。

7、這些視圖可以是按鈕、文本框、列表等??梢钥吹?,Activity 的概念和網(wǎng)頁(yè)的概念相當(dāng)類似。一般一個(gè)Android 應(yīng)用是由多個(gè)Activity 組成,同時(shí)這些Activity 相互之間可以進(jìn)行跳轉(zhuǎn),例如,按下某個(gè)Activity 中的Button 按鈕后,可能會(huì)跳轉(zhuǎn)到一個(gè)其他的Activity。不過(guò)和網(wǎng)頁(yè)跳轉(zhuǎn)稍有不同,Activity之間的跳轉(zhuǎn)可以有返回值,例如,在Activity A 跳轉(zhuǎn)到Activity B 后,那么當(dāng)Activity B運(yùn)行結(jié)束時(shí),可能會(huì)返回給Activity A 一個(gè)值。在多個(gè)Activity 交流的過(guò)程中,這種返回機(jī)制是相當(dāng)實(shí)用的。當(dāng)用戶進(jìn)入一個(gè)新的屏幕時(shí),之前的

8、屏幕會(huì)轉(zhuǎn)入暫停狀態(tài),并且保存在歷史堆棧中。正是由于歷史堆棧的存在,用戶可以通過(guò)返回操作,返回到之前打開過(guò)的所有屏幕。Android默認(rèn)的是將應(yīng)用程序從開始到當(dāng)前的每一個(gè)屏幕都保存到堆棧中,不過(guò)與此同時(shí),Android還提供了很方便的機(jī)制,讓開發(fā)人員自定義某個(gè)屏幕是否需要保存到歷史堆棧。Activity 的跳轉(zhuǎn)實(shí)現(xiàn),必須借助于Intent 類。因此Intent 在Android 應(yīng)用中占據(jù)的地位是極其重要的。簡(jiǎn)單來(lái)說(shuō),一個(gè)Intent 就是對(duì)一個(gè)將要執(zhí)行的操作請(qǐng)求的抽象描述。Intent 的描述,主要包含有兩個(gè)數(shù)據(jù)結(jié)構(gòu):動(dòng)作(action)和動(dòng)作對(duì)應(yīng)的數(shù)據(jù)(data)。動(dòng)作有很多種,系統(tǒng)中最常見

9、的動(dòng)作類型有:MAIN(表明該Activity 是應(yīng)用程序的入口)、VIEW、PICK、EDIT 等等;而動(dòng)作對(duì)應(yīng)的數(shù)據(jù)一般以URI 的形式表示,例如:要查看某一個(gè)網(wǎng)頁(yè),則需要?jiǎng)?chuàng)建Intent,它的動(dòng)作類型為VIEW,對(duì)應(yīng)的數(shù)據(jù)應(yīng)該是該網(wǎng)頁(yè)的網(wǎng)址。值得一提的是,有一個(gè)類叫IntentFilter,它是Intent的相關(guān)類。如果說(shuō)Intent是一個(gè)有效的操作請(qǐng)求,那么一個(gè)IntentFiler則用于描述一個(gè)Activity(或者Intent Receiver等)能夠接收哪些Intent的請(qǐng)求。比如系統(tǒng)瀏覽器的Activity用于查看某一個(gè)網(wǎng)頁(yè),那么它用于接收Intent的IntentFilter

10、,要定義類型為VIEW的動(dòng)作并且能夠過(guò)濾表示一個(gè)網(wǎng)頁(yè)網(wǎng)址的URI。通常IntentFilter要被注冊(cè)在AndroidManifest.xml文件中。Activity 之間的跳轉(zhuǎn)正是通過(guò)解析各種Intent 來(lái)實(shí)現(xiàn)的。例如一個(gè)Activity 調(diào)用startActivity(intent)方法,希望跳轉(zhuǎn)到其他的Activity 時(shí),會(huì)觸發(fā)系統(tǒng)的Intent 解析過(guò)程,在所有安裝的應(yīng)用程序中已注冊(cè)的IntentFilter 中查找,并最終挑選出能夠匹配Intent 的Activity。然后這個(gè)新的Activity 因?yàn)榻邮盏絀ntent 的請(qǐng)求而開始運(yùn)行,完成Activity 的跳轉(zhuǎn)。這種跳轉(zhuǎn)機(jī)

11、制提供了兩個(gè)關(guān)鍵好處:(1)操作請(qǐng)求被Intent 封裝起來(lái),方便Activity 重復(fù)利用。(2)相互跳轉(zhuǎn)的多個(gè)Activity 之間實(shí)現(xiàn)了松耦合。只要IntentFilier 保持不變,一個(gè)ctivity 可以隨意修改,而不用擔(dān)心其他Activity 找不到它。1.2 Broadcast Receiver應(yīng)用程序可以通過(guò)Broadcast Receiver 監(jiān)聽一個(gè)外部的事件,并做出響應(yīng)。例如,當(dāng)應(yīng)用程序需要對(duì)呼入這個(gè)外部事件做出反應(yīng)時(shí),可以利用Broadcast Receiver 進(jìn)行處理。再如,當(dāng)一個(gè)后臺(tái)下載任務(wù)成功的事件發(fā)生時(shí),需要提示用戶下載完成,仍然可以利用Broadcast R

12、eceiver 來(lái)進(jìn)行處理。Broadcast Receiver不能生成UI,也就是說(shuō)對(duì)于用戶來(lái)說(shuō)是透明的,用戶是看不到的。Broadcast Receiver只能通過(guò)NotificationManager來(lái)通知用戶這些事件發(fā)生了。BroadcastReceiver既可以在AndroidManifest.xml中注冊(cè),也可以在運(yùn)行時(shí)的代碼中使用Context.registerReceiver()進(jìn)行注冊(cè)。注冊(cè)完成之后,當(dāng)事件來(lái)臨的時(shí)候,即使程序沒(méi)有啟動(dòng),系統(tǒng)依然可以根據(jù)定義,自動(dòng)啟動(dòng)程序。各種應(yīng)用也可以通過(guò)使用Context.sendBroadcast()將它們自己的Intent Broadc

13、ast廣播給其他應(yīng)用程序。1.3 ServiceService是一種程序,它可以運(yùn)行很長(zhǎng)時(shí)間,但是它卻沒(méi)有用戶界面,不可交互,而且不能自己運(yùn)行。它需要通過(guò)某一個(gè)Activity或者其他的Context對(duì)象來(lái)調(diào)用12。最常見的例子,比如說(shuō)用戶正在運(yùn)行一個(gè)音樂(lè)播放器的程序,此時(shí)如果想瀏覽網(wǎng)頁(yè),那么,在用戶導(dǎo)航到Android的瀏覽器以后,雖然進(jìn)入了瀏覽器屏幕,但是歌曲的播放并沒(méi)有停止,而是在后臺(tái)繼續(xù)播放著。其實(shí)播放的動(dòng)作正是由播放音樂(lè)的Service執(zhí)行著。當(dāng)然,如果需要的話,Service也是可以停止。通過(guò)startService(Intent service)可以啟動(dòng)一個(gè)Service,通過(guò)C

14、ontext.bindService()可以綁定一個(gè)Service。1.4 Content Provider對(duì)于數(shù)據(jù)存儲(chǔ),Android與其他的操作系統(tǒng)有一點(diǎn)不太一樣,即數(shù)據(jù)在Android程序中都是私有的,這些數(shù)據(jù)包括文件類型和數(shù)據(jù)庫(kù)類型以與其他類型的數(shù)據(jù)。這樣系統(tǒng)和應(yīng)用程序的數(shù)據(jù)就各自獨(dú)立起來(lái),以避免受到某些不正常程序或是病毒的影響。不過(guò)這并不代表各應(yīng)用程序之間就因此而無(wú)法進(jìn)行數(shù)據(jù)交換了。當(dāng)某個(gè)應(yīng)用程序希望與其它的應(yīng)用共享其數(shù)據(jù)時(shí),Android提供的Content Provider就可以發(fā)揮作用了。在實(shí)現(xiàn)ContentProvider的抽象接口以后,程序便可以將自己的數(shù)據(jù)暴露出去,其他程

15、序只要有權(quán)限,就可以通過(guò)這一套標(biāo)準(zhǔn)而統(tǒng)一的接口,讀取或是刪除該程序的數(shù)據(jù)13。2、系統(tǒng)分析與設(shè)計(jì)2.1數(shù)獨(dú)游戲背景數(shù)獨(dú)的前身為“九宮格”,最早起源于中國(guó)。但當(dāng)時(shí)的算法比現(xiàn)在的更為復(fù)雜,要求縱向、橫向、斜向上的三個(gè)數(shù)字之和等于15,而不是數(shù)字不能重復(fù)。儒家典籍易經(jīng)中的“九宮圖”也是來(lái)源于此。到了18世紀(jì)末,瑞士數(shù)學(xué)家萊昂哈德·歐文又發(fā)明了一種叫做“拉丁方塊”的游戲,之后不久,美國(guó)的一家數(shù)字邏輯游戲雜志開始刊登這類游戲,使此類游戲得到良好發(fā)展,之后又在日本得到了廣泛的傳播。2004年,第一個(gè)“數(shù)獨(dú)”游戲被刊登上了英國(guó)泰晤士報(bào)的封面,此時(shí)開始數(shù)獨(dú)游戲才真正為世界所知曉。數(shù)獨(dú)游戲的規(guī)則很簡(jiǎn)單

16、,只需要在空格處填寫19的數(shù)字,并保證每個(gè)數(shù)字在每個(gè)九宮格只出現(xiàn)一次,而一般的游戲過(guò)程是系統(tǒng)隨機(jī)生成一個(gè)棋局,然后玩家需要在空白處填上相應(yīng)的數(shù)字使其滿足游戲規(guī)則。由于此類游戲操作簡(jiǎn)單,不需要特定的語(yǔ)言基礎(chǔ),也不需要進(jìn)行數(shù)字運(yùn)算且可玩性高、鍛煉思維、開發(fā)大腦,所以很快風(fēng)靡全球。2.2游戲功能簡(jiǎn)介數(shù)獨(dú)游戲的規(guī)則很簡(jiǎn)單,只需在空格處填入19 的數(shù)字,并保證每個(gè)數(shù)字在每個(gè)九宮格只能出現(xiàn)一次,且每個(gè)數(shù)字在每一行、每一列也只能出現(xiàn)一次,而一般的游戲過(guò)程是系統(tǒng)隨機(jī)生成一個(gè)棋局,然后玩家需要在空白處填上相應(yīng)的數(shù)字使其滿足游戲規(guī)則。游戲框架如下圖所示:圖3.1 游戲框架圖該游戲的運(yùn)行步驟如下。1.啟動(dòng)游戲后首先

17、進(jìn)入的便是歡迎界面的動(dòng)畫,在歡迎界面中,“點(diǎn)擊屏幕繼續(xù)”閃動(dòng),達(dá)到提示的效果。2.在游戲界面點(diǎn)擊屏幕,便進(jìn)入菜單界面。3.在菜單界面單擊“關(guān)于游戲”菜單可進(jìn)入“關(guān)于”界面,在“關(guān)于”界面中介紹了該游戲的目標(biāo)平臺(tái)與開發(fā)日期。4.在菜單界面單擊“幫助游戲”菜單可進(jìn)入“幫助”界面,在“幫助”界面介紹了游戲的基本規(guī)則。5.在菜單界面單擊“開始游戲”菜單可進(jìn)入游戲界面。6.當(dāng)在游戲過(guò)程中單擊“暫?!卑粹o時(shí),便進(jìn)入暫停狀態(tài)。7在游戲過(guò)程中隨時(shí)可以通過(guò)“換題”按鈕來(lái)更換題目。8.當(dāng)玩家單擊“放棄”按鈕時(shí),會(huì)提示玩家是否真的需要退出游戲,然后根據(jù)玩家的選擇進(jìn)行操作。9.當(dāng)玩家單擊“提示”按鈕時(shí),界面上會(huì)出現(xiàn)一

18、個(gè)紅心表示當(dāng)前可以提示玩家輸入數(shù)字,此時(shí)再單擊空白處,便會(huì)自動(dòng)填上正確答案。10.當(dāng)玩家將界面中所有的空白全部填滿數(shù)字時(shí),系統(tǒng)會(huì)自動(dòng)判斷所填寫的數(shù)字正確與否,當(dāng)有錯(cuò)誤時(shí),會(huì)出現(xiàn)游戲失敗界面;當(dāng)全部填寫正確時(shí),會(huì)出現(xiàn)游戲勝利界面。11.在勝利或者失敗狀態(tài)時(shí),玩家可以通過(guò)點(diǎn)擊屏幕任意位置返回歡迎界面。12.在菜單界面單擊“退出游戲”便可退出該游戲。3、系統(tǒng)詳細(xì)設(shè)計(jì)3.1 歡迎界面的設(shè)計(jì)和實(shí)現(xiàn)3.1.1 主類KLSDActivity實(shí)現(xiàn)在本游戲設(shè)計(jì)中,控制調(diào)度模塊主要是由KLSDActivity類來(lái)實(shí)現(xiàn)的KLSDActivity繼承自Activity 類,它提供了整個(gè)游戲的入口。并且在游戲運(yùn)行過(guò)程中

19、也隨時(shí)需要KLSDActivity的管理。組成該類的成員變量如下所示:WelcomeView welcomeView; GameView gameView; AboutView aboutView; HelpView helpView; Handler myHandler 以上類都是對(duì)View的繼承,其中WelcomeView是對(duì)歡迎動(dòng)畫界面的引用,GameView是對(duì)游戲界面的引用,AboutView是對(duì)目錄界面的引用,HelpView是對(duì)幫助界面的引用,Handler Handler主要負(fù)責(zé)線程之間的通信,通過(guò)接受消息來(lái)更新UI線程中的控件。這里使用Handler類主要實(shí)現(xiàn)的是根據(jù)接收到的

20、消息做出相應(yīng)的切換視圖操作,從而控制調(diào)度各個(gè)視圖的顯示。Handler機(jī)制使得線程間的通信通過(guò)Message和Runnable對(duì)象來(lái)傳遞和處理。在此模塊的實(shí)現(xiàn)中,Handler傳遞的消息容被封裝到一個(gè)Message對(duì)象中,Message中包含了消息的描述和任何形式的可以被Handler發(fā)送的數(shù)據(jù)對(duì)象,其最主要的字段是what,此字段由用戶自己定義,為消息類型碼,接收方可以根據(jù)該字段的值來(lái)確定收到的消息是關(guān)于什么的。這里重點(diǎn)實(shí)現(xiàn)了Handler類中的handleMessage()方法,此方法用來(lái)接收并處理消息,接收的參數(shù)為一個(gè)Message對(duì)象。在這里定義了Message的what字段,根據(jù)接收

21、到的what字段的值來(lái)切換到不同的界面,從而實(shí)現(xiàn)對(duì)整個(gè)游戲運(yùn)行的管理。下面介紹KLSDActivity的成員函數(shù):onCreat():此函數(shù)是Activity 類的入口函數(shù),在此函數(shù)中先將手機(jī)設(shè)置成全屏模式,然后切換到加載界面并在后臺(tái)初始化歡迎動(dòng)畫界面。initWelcomeView():此函數(shù)實(shí)現(xiàn)歡迎界面的切換。initGameView():此函數(shù)實(shí)現(xiàn)游戲界面的切換。initHelpView():此函數(shù)初始化幫助界面。initAboutView():此函數(shù)初試化關(guān)于界面。上面介紹了實(shí)現(xiàn)控制調(diào)度模塊的KLSDActivity 類,可以看出這里主要通過(guò)Android中的Handler 機(jī)制來(lái)控制

22、當(dāng)前屏幕顯示哪一個(gè)界面,從而完成控制調(diào)度功能。3.1.2 歡迎界面WelcomeView類的實(shí)現(xiàn)歡迎界面WelcomeView類實(shí)現(xiàn)的是開機(jī)動(dòng)畫的功能,簡(jiǎn)要流程圖如下:圖4.1 WelcomeView類功能流程圖歡迎界面是通過(guò)WelcomeView 類實(shí)現(xiàn)的。該類繼承自SurfaceView 類,采用雙緩沖機(jī)制進(jìn)行繪圖。它可以控制表面的格式,比如大小,顯示在屏幕中的位置,最關(guān)鍵是的提供了SurfaceHolder 類,使用getHolder 方法獲取。在用WelcomeView 繪制之前必須使用lockCanvas()方法鎖定畫布,并得到畫布,然后在畫布上繪制;當(dāng)繪制完成后,需要使用unloc

23、kCanvasAndPost 方法來(lái)解鎖畫布,于是才能顯示在屏幕上。BitmapID創(chuàng)建了存放動(dòng)畫幀圖片ID 的數(shù)組,將其存放到數(shù)組中方便管理,在之后進(jìn)行系統(tǒng)維護(hù)時(shí),如需新增動(dòng)畫幀,只需在此數(shù)組中添加新的ID 即可。在WelcomeView 類中,public WelcomeView(KLSDActivity activity) 是此類的構(gòu)造器,主要用來(lái)初始化刷幀線程、動(dòng)畫線程、以與初始化圖片,onDraw()方法主要用來(lái)繪制屏幕,按次序分別歡迎動(dòng)畫以與菜單界面。onTouchEvent()方法為屏幕的監(jiān)聽方法,該方法通過(guò)玩家單擊位置的坐標(biāo)判斷出玩家單擊的是菜單界面的哪些區(qū)域,并根據(jù)單擊的按鈕

24、向Activity 的Handler 發(fā)送消息。3.1.3 WelcomeViewDrawThread類和WelcomeViewGoThread類的實(shí)現(xiàn)為了實(shí)現(xiàn)歡迎界面的動(dòng)畫效果,這里設(shè)計(jì)了WelcomeViewDrawThread類,這個(gè)類主要負(fù)責(zé)界面的定時(shí)刷新,而WelcomeViewGoThread類負(fù)責(zé)動(dòng)畫的生成。WelcomeViewDrawThread類和WelcomeViewGoThread類的生繼承自Thread 類,重寫了Thread 類里的run()方法,都是通過(guò)run()方法實(shí)現(xiàn)功能。WelcomeViewDrawThread其run()方法的代碼如下:publicvoi

25、d run() /重寫的run方法Canvas c;/聲明畫布while (this.flag) /循環(huán) c = null;try /鎖定整個(gè)畫布 c = this.surfaceHolder.lockCanvas(null);synchronized (this.surfaceHolder) /同步 welcomeView.onDraw(c);/調(diào)用繪制方法 finally /用finally保證一定被執(zhí)行if (c != null) /更新屏幕顯示容this.surfaceHolder.unlockCanvasAndPost(c); try Thread.sleep(sleepSpan);

26、/睡眠指定毫秒數(shù) catch(Exception e)/捕獲異常 e.printStackTrace();/打印異常信息 分析其代碼,這里主要控制c值的變化,當(dāng)其值為null時(shí),結(jié)合WelcomeView 類里的onDraw()方法,繪制背景圖片,繪制完成后,c值不為null,解鎖屏幕,將畫布置空,c值又為null,釋放和更新屏幕顯示的容,從而實(shí)現(xiàn)刷幀作用。WelcomeViewGoThread類中run()方法代碼如下所示:publicvoid run() /重寫的run方法法while (flag) /循環(huán) welcomeView.drawIndex+;/自加if(welcomeView.

27、drawIndex>welcomeView.bitmapsID.length-1) welcomeView.drawIndex = welcomeView.bitmapsID.length-10; if(welcomeView.drawIndex%5 = 0) welcomeView.drawString = !welcomeView.drawString; try Thread.sleep(sleepSpan);/睡眠 catch(Exception e) e.printStackTrace();/打印異常信息 分析該類的run()方法,控制drawIndex的值,每次循環(huán)將歡迎界面的

28、drawIndex 加1,然后判斷是否到達(dá)數(shù)組的最后,當(dāng)?shù)竭_(dá)最后時(shí),將其減10,然后繼續(xù)進(jìn)行循環(huán)。同時(shí),判斷drawIndex是否為5,這樣每循環(huán)5次改變drawString的值,從而實(shí)現(xiàn)文字的閃動(dòng)效果。3.1.4 HelpView類和AboutView類的實(shí)現(xiàn)游戲中關(guān)于游戲幫助和游戲說(shuō)明,我們分別通過(guò)HelpView類和AboutView類的實(shí)現(xiàn)。HelpView類和AboutView類都是通過(guò)onDraw()方法來(lái)繪制界面。由于這兩個(gè)類在很大程度上是相似的,所以下面只分析HelpView類,代碼如下所示:public HelpView(KLSDActivity activity) supe

29、r(activity);this.activity = activity;/得到activity的引用surfaceHolder = this.getHolder();/獲得surfaceHoldergetHolder().addCallback(this);/添加Callback接口的實(shí)現(xiàn)helpBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.help);publicvoid onDraw(Canvas canvas) /繪制方法canvas.drawColor(Color.WHITE);/背景色canvas.

30、drawBitmap(helpBitmap, 0, 0, null);/繪制圖片publicboolean onTouchEvent(MotionEvent event) /鍵盤監(jiān)聽方法if(event.getAction() = MotionEvent.ACTION_DOWN)/屏幕被按下double x = event.getX();double y = event.getY();/得到坐標(biāo)if(x>270 && x<310 && y>440 && y<480)/點(diǎn)擊確定按鈕activity.myHandler.sen

31、dEmptyMessage(2);returnsuper.onTouchEvent(event);public HelpView(KLSDActivity activity) 為“幫助”界面的構(gòu)造器,在構(gòu)造器中先得到activity 以與surfaceHolder的引用,然后添加Callback 接口的實(shí)現(xiàn)并對(duì)圖片資源進(jìn)行初始化。onDraw()為重寫的繪制方法,在該方法中,首先繪制白色背景,然后將幫助界面的背景圖片繪制到指定位置。onTouchEvent()為重寫的鍵盤監(jiān)聽方法,當(dāng)玩家點(diǎn)擊屏幕時(shí),會(huì)調(diào)用該方法來(lái)處理玩家的屏幕事件,在“幫助”界面中該方法實(shí)現(xiàn)比較簡(jiǎn)單,只是判斷玩家點(diǎn)擊的是否為返

32、回按鈕即可。當(dāng)玩家點(diǎn)擊返回按鈕時(shí),需要向activity 發(fā)送Handler 消息通知控制器切換屏幕。3.2 游戲界面相關(guān)類的實(shí)現(xiàn)游戲界面實(shí)現(xiàn)游戲展示,計(jì)時(shí)界面展示,以與功能按鍵。流程圖如下圖所示:圖4.2游戲界面流程圖3.2.1 游戲界面GameView的實(shí)現(xiàn)首先理解下GameView的運(yùn)行思路,GameView在初始化時(shí)候讀取相關(guān)圖片信息,包括背景圖片,數(shù)獨(dú)背景框圖片等等,在初始化同時(shí),啟動(dòng)GameViewDrawThread線程進(jìn)行刷幀,TimeThread 線程來(lái)更新界面中的時(shí)間。當(dāng)玩家點(diǎn)擊背景框空白位置,需要繪制數(shù)字鍵盤時(shí),會(huì)啟動(dòng)DrawKeyThread 線程繪制數(shù)字鍵盤。當(dāng)玩家點(diǎn)

33、擊按鈕時(shí)候,相關(guān)方法會(huì)被調(diào)用。以上的過(guò)程都需要KLSDActivity的參與管理。GameView 同樣繼承自SurfaceView 類,其關(guān)鍵也是實(shí)現(xiàn)onDraw()方法。onDraw()方法分別繪制游戲界面背景圖片,數(shù)字背景框,選題提示等等按鈕,時(shí)間顯示區(qū)域等。DrawKey()方法實(shí)現(xiàn)了數(shù)字鍵盤的繪制,保證在點(diǎn)擊空白框時(shí)候有圓盤數(shù)字選框出現(xiàn)。通過(guò)surfaceCreated()和surfaceDestroyed()兩個(gè)方法負(fù)責(zé)相關(guān)線程的啟動(dòng)和調(diào)用工作。3.2.2 時(shí)間線程TimeThread的實(shí)現(xiàn)TimeThread線程主要用來(lái)更新界面中的時(shí)間,作為數(shù)獨(dú)游戲玩家計(jì)時(shí)功能,代碼如下:pub

34、licclass TimeThread extends ThreadGameView gameView;/聲明GameView的引用boolean flag=true;/循環(huán)標(biāo)志位public TimeThread(GameView gameView)/構(gòu)造器this.gameView=gameView;/得到GameView的引用publicvoid run()/重寫的run方法while(flag)gameView.time+;/時(shí)間自加tryThread.sleep(1000);/睡眠一秒種catch(Exception e)/捕獲異常e.printStackTrace();/打印異常信

35、息TimeThread 類的實(shí)現(xiàn)比較簡(jiǎn)單,只需每隔一秒鐘通過(guò)gameView.time自加更改一下GameView 中表示時(shí)間的屬性即可。public TimeThread(GameView gameView) 為時(shí)間線程的構(gòu)造器,在構(gòu)造器中先得到GameView的引用。然后重寫run()方法,通過(guò)時(shí)間的自加,實(shí)現(xiàn)一秒鐘功能。3.3 數(shù)獨(dú)算法類的實(shí)現(xiàn)數(shù)獨(dú)算法類主要實(shí)現(xiàn)數(shù)獨(dú)的生成以與填入數(shù)字的檢測(cè)功能,流程圖如下:圖4.3 WelcomeView類功能流程圖3.3.1數(shù)獨(dú)算法基本邏輯本節(jié)將對(duì)數(shù)獨(dú)算法類ShuDuSuanFa.java進(jìn)行解釋,該類基本上是數(shù)學(xué)計(jì)算,通過(guò)一定的算法產(chǎn)生所需要的數(shù)獨(dú)數(shù)

36、組,通過(guò)特定的接口供其他類使用。該類的目的是創(chuàng)建一個(gè)二維數(shù)組來(lái)表示數(shù)獨(dú)矩陣。使矩陣的每行、每列、每塊都沒(méi)有重復(fù)的數(shù)字。算法的簡(jiǎn)單思路是先隨機(jī)取出一個(gè)09 的數(shù)字,然后檢查其所在的行、列、塊是否都符合要求。當(dāng)符合要求時(shí)繼續(xù)填充下一個(gè),而當(dāng)不符合要求時(shí),再次隨機(jī)取出一個(gè)沒(méi)有取出過(guò)的數(shù)字,再判斷。當(dāng)9 個(gè)數(shù)字都取出過(guò)后還沒(méi)有找到符合要求的數(shù)字時(shí),進(jìn)行回退處理,即將最后一個(gè)取出的符合要求的數(shù)字進(jìn)行重新取值,直到所有數(shù)字全部填充完畢。在求解數(shù)獨(dú)時(shí)候,運(yùn)用到回溯法,將所有的解(問(wèn)題的解空間)按照一定結(jié)構(gòu)排列,再進(jìn)行搜索。一般解空間構(gòu)造成為為樹狀結(jié)構(gòu),用深度優(yōu)先的策略搜索,一般有兩種方式:1.只需要一個(gè)解的

37、話,找到解即停止。2.需要求出所有解,則需做“樹的遍歷”找到所有解?;厮莘ǖ幕咀龇ㄊ撬阉鳎蚴且环N組織得井井有條的,能避免不必要搜索的窮舉式搜索法。這種方法適用于解一些組合數(shù)相當(dāng)大的問(wèn)題。回溯法在問(wèn)題的解空間樹中,按深度優(yōu)先策略,從根結(jié)點(diǎn)出發(fā)搜索解空間樹。算法搜索至解空間樹的任意一點(diǎn)時(shí),先判斷該結(jié)點(diǎn)是否包含問(wèn)題的解。如果肯定不包含,則跳過(guò)對(duì)該結(jié)點(diǎn)為根的子樹的搜索,逐層向其祖先結(jié)點(diǎn)回溯;否則,進(jìn)入該子樹,繼續(xù)按深度優(yōu)先策略搜索?;厮莘ㄊ且环N搜索算法,其基本思路是:在一個(gè)問(wèn)題中,根據(jù)題意給出的邊界條件劃定出所有可能解的圍(稱為可能解),根據(jù)題意確定出約束條件。利用程序順次在所有可能解中搜索時(shí)按照

38、深度搜索的方式進(jìn)行。即在第一層選定一個(gè)滿足約束條件的解,然后以該可能解為出發(fā)點(diǎn),搜索第二層的一個(gè)可能解(試探)。如果搜索到第二層的一個(gè)可能解,則繼續(xù)搜索第三層得一個(gè)可能解。依次類推,直到所有層得可能解都被找到,則得到了該問(wèn)題的一個(gè)完整解。如果第二層所有的肯可能解都不滿足約束條件,則返回第一層,放棄原有的可能解,使用第一層的下一個(gè)可能解(回溯)。一次類推,尋找第二層的一個(gè)可能解?;厮莘ㄏ鄬?duì)于其他窮舉的特點(diǎn)在于,不必把問(wèn)題的每一層的所有可能解都遍歷一遍,只要當(dāng)前的可能解不滿足約束條件就拋棄該解,尋求下一個(gè)可能解,而不必求解其余的下層解。當(dāng)當(dāng)前層得所有可能解都不滿足約束條件,則回溯到上一層,拋棄上一

39、層的當(dāng)前可能解。從以上分析中結(jié)合數(shù)獨(dú)問(wèn)題的規(guī)則,得出數(shù)獨(dú)問(wèn)題的約束條件為:每一格的數(shù)值圍僅限1-9每一格的數(shù)字在當(dāng)前行不允許重復(fù)每一格的數(shù)字在當(dāng)前列不允許重復(fù)每一格的數(shù)字在當(dāng)前小宮格不允許重復(fù)由此,回溯法通過(guò)約束條件的篩選,在所有解中除掉不可能的解,從而獲得問(wèn)題的一個(gè)或者全部解。3.3.2 檢測(cè)填充結(jié)果根據(jù)數(shù)獨(dú)游戲的規(guī)則,玩家填充81個(gè)宮格之后,要滿足所有行,所有列和所有小九宮格不能出現(xiàn)重復(fù)的數(shù)字,并以此為條件進(jìn)行檢測(cè)。列檢測(cè)首先對(duì)各列進(jìn)行檢測(cè),提供了檢測(cè)列9個(gè)數(shù)字是否有重復(fù)數(shù)據(jù)的方法checkLine (),該方法以此遍歷列中的9個(gè)數(shù)字,當(dāng)遍歷到某個(gè)數(shù)字時(shí),檢測(cè)該數(shù)字后面的數(shù)字是否出現(xiàn)重復(fù)。

40、比如,當(dāng)檢測(cè)到第3個(gè)數(shù)字是7時(shí),則檢測(cè)第4-9個(gè)數(shù)字是否出現(xiàn)7,如果出現(xiàn)重復(fù)則停止檢測(cè),只有既可以避免重復(fù)檢測(cè),又可以避免遺漏。publicboolean checkLine(int col)/ 檢查列是否符合要求 for(int j = 0;j < 8;j+) if(njcol = 0)continue; for(int k =j + 1;k< 9;k+)if(njcol = nkcol)returnfalse; returntrue;行檢測(cè)類似于對(duì)列數(shù)據(jù)的檢測(cè),還需要對(duì)每行進(jìn)行檢測(cè),因此程序提供了對(duì)行數(shù)據(jù)的檢測(cè)方法checkRow (),該方法代碼如下:publicboolea

41、n checkRow(int row)/檢查行是否符合要求for(int j = 0;j < 8;j+)if(nrowj = 0)continue; for(int k =j + 1;k < 9;k+)if(nrowj = nrowk)returnfalse; returntrue;小九宮格檢測(cè)除了對(duì)行和列的重復(fù)數(shù)據(jù)檢測(cè)之外,還需要對(duì)小九宮格的所有數(shù)字進(jìn)行檢測(cè),避免出現(xiàn)重復(fù)現(xiàn)象。檢測(cè)原理與行,列檢測(cè)一樣,但需要計(jì)算九宮格數(shù)字的位置。Row和Col指定了檢測(cè)九宮格的位置,數(shù)獨(dú)單元格中一共有3×3個(gè)九宮格,Row和Col的圍為0到2。用以下程序完成九宮格重復(fù)數(shù)字的檢測(cè)。pub

42、licboolean checkNine(int row,int col)/檢查3X3區(qū)域是否符合要求int j = row/3*3;/獲得左上角的坐標(biāo)int k = col/3*3;for(int i = 0;i < 8;i+)/循環(huán)比較if(nj + i/3k + i % 3 = 0)continue;for(int m = i+ 1;m < 9;m+)if(nj + i/3k + i % 3 = nj + m/3k + m % 3)returnfalse; returntrue; 3.4 游戲的測(cè)試和運(yùn)行3.4.1游戲測(cè)試概述當(dāng)游戲軟件制作完成之后,為了驗(yàn)證本游戲是否存在缺陷

43、、能否達(dá)到預(yù)期的設(shè)計(jì)標(biāo),我們還需要在預(yù)設(shè)環(huán)境(如:模擬環(huán)境或真實(shí)移動(dòng)終端設(shè)備)中進(jìn)行調(diào)試和運(yùn)行,以發(fā)現(xiàn)游戲中可能存在的問(wèn)題和不足、解決這些缺陷,從而完善軟件功能并進(jìn)而提升產(chǎn)品質(zhì)量。作為軟件測(cè)試的重要組成部分,游戲測(cè)試具備軟件測(cè)試的一切共同特性,但由于游戲本身又具有一定的特殊性,因而游戲測(cè)試主要由兩個(gè)部分組成:(1)傳統(tǒng)的軟件測(cè)試由于測(cè)試是軟件開發(fā)過(guò)程中極為重要的組成部分,因而針對(duì)軟件本身的測(cè)試貫穿于軟件存在的整個(gè)生命周期。首先,程序員需要在程序設(shè)計(jì)開發(fā)過(guò)程中按階段對(duì)產(chǎn)生的模塊集中測(cè)試,以保證系統(tǒng)各模塊能實(shí)現(xiàn)各自的功能,在此階段軟件的測(cè)試一般主要集中在程序的細(xì)節(jié)部分。當(dāng)軟件制作開發(fā)出來(lái)之后,為保

44、證軟件整體的完善性,還需要在軟件工程理論的指導(dǎo)下對(duì)整個(gè)系統(tǒng)進(jìn)行測(cè)試,這階段的測(cè)試主要有黑盒測(cè)試和白盒測(cè)試。所謂黑盒測(cè)試就是把要測(cè)試的對(duì)象當(dāng)作一個(gè)黑盒子,不需要知道里面是怎么處理的,只要對(duì)輸入和輸出數(shù)據(jù)進(jìn)行測(cè)試,這種測(cè)試方案屬于高端測(cè)試,主要是在操作層面對(duì)游戲進(jìn)行測(cè)試;而白盒測(cè)試正好相反,基于白盒測(cè)試的測(cè)試方案屬于低端測(cè)試,是對(duì)各種設(shè)計(jì)細(xì)節(jié)方面的測(cè)試,測(cè)試者必須對(duì)測(cè)試對(duì)象的部處理過(guò)程非常了解,對(duì)里面所有的分支和循環(huán)進(jìn)行實(shí)驗(yàn)從而達(dá)到測(cè)試的目的。在進(jìn)行軟件測(cè)試的過(guò)程中,測(cè)試人員應(yīng)根據(jù)需要把墨盒和白盒測(cè)試有效的結(jié)合,以達(dá)到發(fā)現(xiàn)軟件錯(cuò)誤并進(jìn)而完善軟件的目的。(2)對(duì)游戲性的測(cè)試由于游戲特別是在很大程度上

45、是對(duì)現(xiàn)實(shí)世界的一種模擬,因而它不但包含了人類社會(huì)的一部分特性,同時(shí)還涉與娛樂(lè)性、可玩性等獨(dú)有特點(diǎn),所以針對(duì)游戲的測(cè)試還包括三個(gè)部分:游戲情節(jié)的測(cè)試:主要是針對(duì)體現(xiàn)游戲主線的故事情節(jié)和游戲世界中的任務(wù)系統(tǒng)等進(jìn)行測(cè)試。游戲世界的平衡測(cè)試:平衡性主要體現(xiàn)在經(jīng)濟(jì)平衡、能力平衡(包含技能、屬性等等),測(cè)試的目的是為了能保證游戲世界的公平競(jìng)爭(zhēng)。游戲文化的測(cè)試:比如整個(gè)游戲世界的風(fēng)格,是中國(guó)文化主導(dǎo),還是日風(fēng)格等等,大到游戲整體,小到NPC 對(duì)話,比如一個(gè)書生,他的對(duì)話就必需斯文,不可以用江湖語(yǔ)言。目前在游戲開發(fā)過(guò)程中,對(duì)游戲性的測(cè)試主要有以下幾種實(shí)現(xiàn)途徑:一是通過(guò)部測(cè)試人員對(duì)以下的三個(gè)方面進(jìn)行測(cè)試,由于他

46、們往往都是經(jīng)過(guò)精選而來(lái)的職業(yè)玩家,對(duì)游戲有很深的認(rèn)識(shí),因而也能較好完成游戲的測(cè)試目標(biāo);二是邀請(qǐng)一定數(shù)量的玩家或游戲媒體人員對(duì)外圍系統(tǒng)進(jìn)行測(cè)試,其目的主要是測(cè)試游戲的可玩性和易用性,與一些外圍的Bug;三是通過(guò)大圍的測(cè)和公測(cè),讓更多的玩家進(jìn)行試玩。3.4.2測(cè)試環(huán)境本游戲的測(cè)試環(huán)境包括兩種,一種是基于 Android 虛擬設(shè)備AVD 的測(cè)試,在測(cè)試之前,首先要?jiǎng)?chuàng)建一個(gè)AVD。在測(cè)試游戲時(shí)選用的是基于Android 2.3的AVD。還有一種便是基于 Android 手機(jī)的測(cè)試,在測(cè)試之前,需要首先將游戲文件夾下的bin 目錄下的游戲的apk 文件通過(guò)數(shù)據(jù)線傳到Android 手機(jī)上,然后通過(guò)Android 手機(jī)上的第三方文件瀏覽器找到需要安裝的apk 文件,即可安裝。本人在基于 Android 手機(jī)的測(cè)試時(shí),選用的手機(jī)為SONY WT19I,SONY WT19I的主要參數(shù)為:主屏尺寸:3.2 英寸;主屏色彩:彩屏,1600萬(wàn)

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論