




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、. . . . 學(xué)生班級學(xué)號專 業(yè)計(jì)算機(jī)科學(xué)與技術(shù)課程設(shè)計(jì)題目基于Android的數(shù)獨(dú)游戲設(shè)計(jì)評語組長簽字:成績?nèi)掌?014 年 月 日課程設(shè)計(jì)任務(wù)書學(xué) 院信息科學(xué)與工程學(xué)院專 業(yè)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)生班級學(xué)號課程設(shè)計(jì)題目基于Android的數(shù)獨(dú)游戲設(shè)計(jì)實(shí)踐教學(xué)要求與任務(wù):能夠運(yùn)用Java語言設(shè)計(jì)數(shù)獨(dú)游戲,實(shí)現(xiàn)基本游戲效果。會搭建Android的開發(fā)環(huán)境,并學(xué)會運(yùn)用 Eclipse開發(fā)工具相關(guān)Android程序進(jìn)行開發(fā);深入了解Android項(xiàng)目生成的文件之間的關(guān)系和它們的作用。工作計(jì)劃與進(jìn)度安排:第一階段:20學(xué)時。設(shè)計(jì)階段。學(xué)生根據(jù)所選題目,查閱有關(guān) 資料,綜合所學(xué)的理論知識,完成
2、整體設(shè)計(jì)與具體設(shè)計(jì)。第二階段:8學(xué)時。調(diào)試測試階段。上機(jī)調(diào)試測試,要求學(xué)生務(wù) 必認(rèn)真,思想高度集中,調(diào)試成功后,整理、編寫設(shè)計(jì)資料與實(shí)驗(yàn) 報告。 第三階段:4學(xué)時。驗(yàn)收答辯。指導(dǎo)教師: 2014 年 月 日專業(yè)負(fù)責(zé)人:2014 年 月 日學(xué)院教學(xué)副院長:2014 年 月 日摘要移動互聯(lián)網(wǎng)時代的到來極大的改變了我們的生活,而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、此,對于軟件從業(yè)人員來說,Android平臺具有無限的吸引力。本文就在分析討論Android手機(jī)軟件開發(fā)技術(shù)原理的基礎(chǔ)上,為用戶開發(fā)出基于Android平臺的數(shù)獨(dú)游戲的軟件。通過對Android系統(tǒng)架構(gòu)和應(yīng)用開發(fā)進(jìn)行初步研究,設(shè)計(jì)一款數(shù)獨(dú)游戲。在對系統(tǒng)進(jìn)行詳細(xì)需求分析的基礎(chǔ)上,確定了系統(tǒng)的功能和性能要求,對游戲的開機(jī)動畫,菜單界面、屏幕繪制、時間控制、布局算法等進(jìn)行了設(shè)計(jì)。本文詳細(xì)介紹了在Android平臺上以Java為語言編寫游戲的過程,最終實(shí)現(xiàn)了一個界面友好、操作簡單的手機(jī)益智游戲。關(guān)鍵詞:Android 數(shù)獨(dú) 智能機(jī)目錄1、開發(fā)工具與環(huán)境52、系統(tǒng)分析與設(shè)計(jì)92.1數(shù)獨(dú)游戲背景92.2游
4、戲功能簡介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 游戲的測試和運(yùn)行234、總結(jié)28參考文獻(xiàn)291、開發(fā)工具與環(huán)境Android 是谷歌公司發(fā)布的手機(jī)操作系統(tǒng),它是基于Linux 平臺的開源手機(jī)操作系統(tǒng),谷歌公司將要把其打造為基于移動終端的真正開放的移動軟件平臺,不僅擁有移動所需要的工作軟件,而且在專利權(quán)方面能夠不侵犯他人權(quán)利去推動移動互聯(lián)網(wǎng)的創(chuàng)新。谷歌公司為了開發(fā)Android,與開放手機(jī)聯(lián)盟進(jìn)行了合作,手機(jī)開放聯(lián)盟由全球30 多家移動開發(fā)和手機(jī)應(yīng)用的領(lǐng)先企業(yè)組成。谷歌公司不僅僅和運(yùn)營商達(dá)成了合作關(guān)系、而且與設(shè)備
5、制造商以與開發(fā)商保持長期合作,目的就在于利用其優(yōu)勢建立移動軟件平臺,其特點(diǎn)是標(biāo)準(zhǔn)化、開放式的。Android是谷歌公司未來企業(yè)戰(zhàn)略的一部分,其目的是為了在任何時候任何地點(diǎn)能夠提供信息。Android應(yīng)用程序與其他很多計(jì)算機(jī)平臺的應(yīng)用程序不同,他們沒有唯一的啟動入口,一個Android應(yīng)用程序是由多個不同組件組合而成,組件間通過Intent實(shí)現(xiàn)通信。Android系統(tǒng)的基本組件包括Activity、Service、Broadcast Receiver和Content Provider等,要實(shí)現(xiàn)組件間通信,還需要Intent消息組件。并不是每個Android應(yīng)用程序都必須具備這四個組件,很多時候只
6、需要這四種中的某幾種就可以了。除此之外,應(yīng)用程序的所有組件還都必須在AndroidManifest.xml中聲明8。這是一個XML配置文件,這個配置文件用于定義應(yīng)用程序的組件、組件的功能與必要條件等。這個配置文件是任何一個Android應(yīng)用程序所必需的。1.1 ActivityActivity 可以說是開發(fā)人員最常用的組件,同時也屬于Android 最基本的組成部分之一。Android 程序中,一般一個Activity 代表手機(jī)屏幕上的一屏。舉例來說,如果將手機(jī)比作一個瀏覽器,那么一個Activity 就相當(dāng)于一個網(wǎng)頁。在Activity 中,可以添加多個視圖,然后為這些視圖添加一些事件處理。
7、這些視圖可以是按鈕、文本框、列表等??梢钥吹剑珹ctivity 的概念和網(wǎng)頁的概念相當(dāng)類似。一般一個Android 應(yīng)用是由多個Activity 組成,同時這些Activity 相互之間可以進(jìn)行跳轉(zhuǎn),例如,按下某個Activity 中的Button 按鈕后,可能會跳轉(zhuǎn)到一個其他的Activity。不過和網(wǎng)頁跳轉(zhuǎn)稍有不同,Activity之間的跳轉(zhuǎn)可以有返回值,例如,在Activity A 跳轉(zhuǎn)到Activity B 后,那么當(dāng)Activity B運(yùn)行結(jié)束時,可能會返回給Activity A 一個值。在多個Activity 交流的過程中,這種返回機(jī)制是相當(dāng)實(shí)用的。當(dāng)用戶進(jìn)入一個新的屏幕時,之前的
8、屏幕會轉(zhuǎn)入暫停狀態(tài),并且保存在歷史堆棧中。正是由于歷史堆棧的存在,用戶可以通過返回操作,返回到之前打開過的所有屏幕。Android默認(rèn)的是將應(yīng)用程序從開始到當(dāng)前的每一個屏幕都保存到堆棧中,不過與此同時,Android還提供了很方便的機(jī)制,讓開發(fā)人員自定義某個屏幕是否需要保存到歷史堆棧。Activity 的跳轉(zhuǎn)實(shí)現(xiàn),必須借助于Intent 類。因此Intent 在Android 應(yīng)用中占據(jù)的地位是極其重要的。簡單來說,一個Intent 就是對一個將要執(zhí)行的操作請求的抽象描述。Intent 的描述,主要包含有兩個數(shù)據(jù)結(jié)構(gòu):動作(action)和動作對應(yīng)的數(shù)據(jù)(data)。動作有很多種,系統(tǒng)中最常見
9、的動作類型有:MAIN(表明該Activity 是應(yīng)用程序的入口)、VIEW、PICK、EDIT 等等;而動作對應(yīng)的數(shù)據(jù)一般以URI 的形式表示,例如:要查看某一個網(wǎng)頁,則需要創(chuàng)建Intent,它的動作類型為VIEW,對應(yīng)的數(shù)據(jù)應(yīng)該是該網(wǎng)頁的網(wǎng)址。值得一提的是,有一個類叫IntentFilter,它是Intent的相關(guān)類。如果說Intent是一個有效的操作請求,那么一個IntentFiler則用于描述一個Activity(或者Intent Receiver等)能夠接收哪些Intent的請求。比如系統(tǒng)瀏覽器的Activity用于查看某一個網(wǎng)頁,那么它用于接收Intent的IntentFilter
10、,要定義類型為VIEW的動作并且能夠過濾表示一個網(wǎng)頁網(wǎng)址的URI。通常IntentFilter要被注冊在AndroidManifest.xml文件中。Activity 之間的跳轉(zhuǎn)正是通過解析各種Intent 來實(shí)現(xiàn)的。例如一個Activity 調(diào)用startActivity(intent)方法,希望跳轉(zhuǎn)到其他的Activity 時,會觸發(fā)系統(tǒng)的Intent 解析過程,在所有安裝的應(yīng)用程序中已注冊的IntentFilter 中查找,并最終挑選出能夠匹配Intent 的Activity。然后這個新的Activity 因?yàn)榻邮盏絀ntent 的請求而開始運(yùn)行,完成Activity 的跳轉(zhuǎn)。這種跳轉(zhuǎn)機(jī)
11、制提供了兩個關(guān)鍵好處:(1)操作請求被Intent 封裝起來,方便Activity 重復(fù)利用。(2)相互跳轉(zhuǎn)的多個Activity 之間實(shí)現(xiàn)了松耦合。只要IntentFilier 保持不變,一個ctivity 可以隨意修改,而不用擔(dān)心其他Activity 找不到它。1.2 Broadcast Receiver應(yīng)用程序可以通過Broadcast Receiver 監(jiān)聽一個外部的事件,并做出響應(yīng)。例如,當(dāng)應(yīng)用程序需要對呼入這個外部事件做出反應(yīng)時,可以利用Broadcast Receiver 進(jìn)行處理。再如,當(dāng)一個后臺下載任務(wù)成功的事件發(fā)生時,需要提示用戶下載完成,仍然可以利用Broadcast R
12、eceiver 來進(jìn)行處理。Broadcast Receiver不能生成UI,也就是說對于用戶來說是透明的,用戶是看不到的。Broadcast Receiver只能通過NotificationManager來通知用戶這些事件發(fā)生了。BroadcastReceiver既可以在AndroidManifest.xml中注冊,也可以在運(yùn)行時的代碼中使用Context.registerReceiver()進(jìn)行注冊。注冊完成之后,當(dāng)事件來臨的時候,即使程序沒有啟動,系統(tǒng)依然可以根據(jù)定義,自動啟動程序。各種應(yīng)用也可以通過使用Context.sendBroadcast()將它們自己的Intent Broadc
13、ast廣播給其他應(yīng)用程序。1.3 ServiceService是一種程序,它可以運(yùn)行很長時間,但是它卻沒有用戶界面,不可交互,而且不能自己運(yùn)行。它需要通過某一個Activity或者其他的Context對象來調(diào)用12。最常見的例子,比如說用戶正在運(yùn)行一個音樂播放器的程序,此時如果想瀏覽網(wǎng)頁,那么,在用戶導(dǎo)航到Android的瀏覽器以后,雖然進(jìn)入了瀏覽器屏幕,但是歌曲的播放并沒有停止,而是在后臺繼續(xù)播放著。其實(shí)播放的動作正是由播放音樂的Service執(zhí)行著。當(dāng)然,如果需要的話,Service也是可以停止。通過startService(Intent service)可以啟動一個Service,通過C
14、ontext.bindService()可以綁定一個Service。1.4 Content Provider對于數(shù)據(jù)存儲,Android與其他的操作系統(tǒng)有一點(diǎn)不太一樣,即數(shù)據(jù)在Android程序中都是私有的,這些數(shù)據(jù)包括文件類型和數(shù)據(jù)庫類型以與其他類型的數(shù)據(jù)。這樣系統(tǒng)和應(yīng)用程序的數(shù)據(jù)就各自獨(dú)立起來,以避免受到某些不正常程序或是病毒的影響。不過這并不代表各應(yīng)用程序之間就因此而無法進(jìn)行數(shù)據(jù)交換了。當(dāng)某個應(yīng)用程序希望與其它的應(yīng)用共享其數(shù)據(jù)時,Android提供的Content Provider就可以發(fā)揮作用了。在實(shí)現(xiàn)ContentProvider的抽象接口以后,程序便可以將自己的數(shù)據(jù)暴露出去,其他程
15、序只要有權(quán)限,就可以通過這一套標(biāo)準(zhǔn)而統(tǒng)一的接口,讀取或是刪除該程序的數(shù)據(jù)13。2、系統(tǒng)分析與設(shè)計(jì)2.1數(shù)獨(dú)游戲背景數(shù)獨(dú)的前身為“九宮格”,最早起源于中國。但當(dāng)時的算法比現(xiàn)在的更為復(fù)雜,要求縱向、橫向、斜向上的三個數(shù)字之和等于15,而不是數(shù)字不能重復(fù)。儒家典籍易經(jīng)中的“九宮圖”也是來源于此。到了18世紀(jì)末,瑞士數(shù)學(xué)家萊昂哈德·歐文又發(fā)明了一種叫做“拉丁方塊”的游戲,之后不久,美國的一家數(shù)字邏輯游戲雜志開始刊登這類游戲,使此類游戲得到良好發(fā)展,之后又在日本得到了廣泛的傳播。2004年,第一個“數(shù)獨(dú)”游戲被刊登上了英國泰晤士報的封面,此時開始數(shù)獨(dú)游戲才真正為世界所知曉。數(shù)獨(dú)游戲的規(guī)則很簡單
16、,只需要在空格處填寫19的數(shù)字,并保證每個數(shù)字在每個九宮格只出現(xiàn)一次,而一般的游戲過程是系統(tǒng)隨機(jī)生成一個棋局,然后玩家需要在空白處填上相應(yīng)的數(shù)字使其滿足游戲規(guī)則。由于此類游戲操作簡單,不需要特定的語言基礎(chǔ),也不需要進(jìn)行數(shù)字運(yùn)算且可玩性高、鍛煉思維、開發(fā)大腦,所以很快風(fēng)靡全球。2.2游戲功能簡介數(shù)獨(dú)游戲的規(guī)則很簡單,只需在空格處填入19 的數(shù)字,并保證每個數(shù)字在每個九宮格只能出現(xiàn)一次,且每個數(shù)字在每一行、每一列也只能出現(xiàn)一次,而一般的游戲過程是系統(tǒng)隨機(jī)生成一個棋局,然后玩家需要在空白處填上相應(yīng)的數(shù)字使其滿足游戲規(guī)則。游戲框架如下圖所示:圖3.1 游戲框架圖該游戲的運(yùn)行步驟如下。1.啟動游戲后首先
17、進(jìn)入的便是歡迎界面的動畫,在歡迎界面中,“點(diǎn)擊屏幕繼續(xù)”閃動,達(dá)到提示的效果。2.在游戲界面點(diǎn)擊屏幕,便進(jìn)入菜單界面。3.在菜單界面單擊“關(guān)于游戲”菜單可進(jìn)入“關(guān)于”界面,在“關(guān)于”界面中介紹了該游戲的目標(biāo)平臺與開發(fā)日期。4.在菜單界面單擊“幫助游戲”菜單可進(jìn)入“幫助”界面,在“幫助”界面介紹了游戲的基本規(guī)則。5.在菜單界面單擊“開始游戲”菜單可進(jìn)入游戲界面。6.當(dāng)在游戲過程中單擊“暫?!卑粹o時,便進(jìn)入暫停狀態(tài)。7在游戲過程中隨時可以通過“換題”按鈕來更換題目。8.當(dāng)玩家單擊“放棄”按鈕時,會提示玩家是否真的需要退出游戲,然后根據(jù)玩家的選擇進(jìn)行操作。9.當(dāng)玩家單擊“提示”按鈕時,界面上會出現(xiàn)一
18、個紅心表示當(dāng)前可以提示玩家輸入數(shù)字,此時再單擊空白處,便會自動填上正確答案。10.當(dāng)玩家將界面中所有的空白全部填滿數(shù)字時,系統(tǒng)會自動判斷所填寫的數(shù)字正確與否,當(dāng)有錯誤時,會出現(xiàn)游戲失敗界面;當(dāng)全部填寫正確時,會出現(xiàn)游戲勝利界面。11.在勝利或者失敗狀態(tài)時,玩家可以通過點(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類來實(shí)現(xiàn)的KLSDActivity繼承自Activity 類,它提供了整個游戲的入口。并且在游戲運(yùn)行過程中
19、也隨時需要KLSDActivity的管理。組成該類的成員變量如下所示:WelcomeView welcomeView; GameView gameView; AboutView aboutView; HelpView helpView; Handler myHandler 以上類都是對View的繼承,其中WelcomeView是對歡迎動畫界面的引用,GameView是對游戲界面的引用,AboutView是對目錄界面的引用,HelpView是對幫助界面的引用,Handler Handler主要負(fù)責(zé)線程之間的通信,通過接受消息來更新UI線程中的控件。這里使用Handler類主要實(shí)現(xiàn)的是根據(jù)接收到的
20、消息做出相應(yīng)的切換視圖操作,從而控制調(diào)度各個視圖的顯示。Handler機(jī)制使得線程間的通信通過Message和Runnable對象來傳遞和處理。在此模塊的實(shí)現(xiàn)中,Handler傳遞的消息容被封裝到一個Message對象中,Message中包含了消息的描述和任何形式的可以被Handler發(fā)送的數(shù)據(jù)對象,其最主要的字段是what,此字段由用戶自己定義,為消息類型碼,接收方可以根據(jù)該字段的值來確定收到的消息是關(guān)于什么的。這里重點(diǎn)實(shí)現(xiàn)了Handler類中的handleMessage()方法,此方法用來接收并處理消息,接收的參數(shù)為一個Message對象。在這里定義了Message的what字段,根據(jù)接收
21、到的what字段的值來切換到不同的界面,從而實(shí)現(xiàn)對整個游戲運(yùn)行的管理。下面介紹KLSDActivity的成員函數(shù):onCreat():此函數(shù)是Activity 類的入口函數(shù),在此函數(shù)中先將手機(jī)設(shè)置成全屏模式,然后切換到加載界面并在后臺初始化歡迎動畫界面。initWelcomeView():此函數(shù)實(shí)現(xiàn)歡迎界面的切換。initGameView():此函數(shù)實(shí)現(xiàn)游戲界面的切換。initHelpView():此函數(shù)初始化幫助界面。initAboutView():此函數(shù)初試化關(guān)于界面。上面介紹了實(shí)現(xiàn)控制調(diào)度模塊的KLSDActivity 類,可以看出這里主要通過Android中的Handler 機(jī)制來控制
22、當(dāng)前屏幕顯示哪一個界面,從而完成控制調(diào)度功能。3.1.2 歡迎界面WelcomeView類的實(shí)現(xiàn)歡迎界面WelcomeView類實(shí)現(xiàn)的是開機(jī)動畫的功能,簡要流程圖如下:圖4.1 WelcomeView類功能流程圖歡迎界面是通過WelcomeView 類實(shí)現(xiàn)的。該類繼承自SurfaceView 類,采用雙緩沖機(jī)制進(jìn)行繪圖。它可以控制表面的格式,比如大小,顯示在屏幕中的位置,最關(guān)鍵是的提供了SurfaceHolder 類,使用getHolder 方法獲取。在用WelcomeView 繪制之前必須使用lockCanvas()方法鎖定畫布,并得到畫布,然后在畫布上繪制;當(dāng)繪制完成后,需要使用unloc
23、kCanvasAndPost 方法來解鎖畫布,于是才能顯示在屏幕上。BitmapID創(chuàng)建了存放動畫幀圖片ID 的數(shù)組,將其存放到數(shù)組中方便管理,在之后進(jìn)行系統(tǒng)維護(hù)時,如需新增動畫幀,只需在此數(shù)組中添加新的ID 即可。在WelcomeView 類中,public WelcomeView(KLSDActivity activity) 是此類的構(gòu)造器,主要用來初始化刷幀線程、動畫線程、以與初始化圖片,onDraw()方法主要用來繪制屏幕,按次序分別歡迎動畫以與菜單界面。onTouchEvent()方法為屏幕的監(jiān)聽方法,該方法通過玩家單擊位置的坐標(biāo)判斷出玩家單擊的是菜單界面的哪些區(qū)域,并根據(jù)單擊的按鈕
24、向Activity 的Handler 發(fā)送消息。3.1.3 WelcomeViewDrawThread類和WelcomeViewGoThread類的實(shí)現(xiàn)為了實(shí)現(xiàn)歡迎界面的動畫效果,這里設(shè)計(jì)了WelcomeViewDrawThread類,這個類主要負(fù)責(zé)界面的定時刷新,而WelcomeViewGoThread類負(fù)責(zé)動畫的生成。WelcomeViewDrawThread類和WelcomeViewGoThread類的生繼承自Thread 類,重寫了Thread 類里的run()方法,都是通過run()方法實(shí)現(xiàn)功能。WelcomeViewDrawThread其run()方法的代碼如下:publicvoi
25、d run() /重寫的run方法Canvas c;/聲明畫布while (this.flag) /循環(huán) c = null;try /鎖定整個畫布 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時,結(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á)最后時,將其減10,然后繼續(xù)進(jìn)行循環(huán)。同時,判斷drawIndex是否為5,這樣每循環(huán)5次改變drawString的值,從而實(shí)現(xiàn)文字的閃動效果。3.1.4 HelpView類和AboutView類的實(shí)現(xiàn)游戲中關(guān)于游戲幫助和游戲說明,我們分別通過HelpView類和AboutView類的實(shí)現(xiàn)。HelpView類和AboutView類都是通過onDraw()方法來繪制界面。由于這兩個類在很大程度上是相似的,所以下面只分析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)并對圖片資源進(jìn)行初始化。onDraw()為重寫的繪制方法,在該方法中,首先繪制白色背景,然后將幫助界面的背景圖片繪制到指定位置。onTouchEvent()為重寫的鍵盤監(jiān)聽方法,當(dāng)玩家點(diǎn)擊屏幕時,會調(diào)用該方法來處理玩家的屏幕事件,在“幫助”界面中該方法實(shí)現(xiàn)比較簡單,只是判斷玩家點(diǎn)擊的是否為返
32、回按鈕即可。當(dāng)玩家點(diǎn)擊返回按鈕時,需要向activity 發(fā)送Handler 消息通知控制器切換屏幕。3.2 游戲界面相關(guān)類的實(shí)現(xiàn)游戲界面實(shí)現(xiàn)游戲展示,計(jì)時界面展示,以與功能按鍵。流程圖如下圖所示:圖4.2游戲界面流程圖3.2.1 游戲界面GameView的實(shí)現(xiàn)首先理解下GameView的運(yùn)行思路,GameView在初始化時候讀取相關(guān)圖片信息,包括背景圖片,數(shù)獨(dú)背景框圖片等等,在初始化同時,啟動GameViewDrawThread線程進(jìn)行刷幀,TimeThread 線程來更新界面中的時間。當(dāng)玩家點(diǎn)擊背景框空白位置,需要繪制數(shù)字鍵盤時,會啟動DrawKeyThread 線程繪制數(shù)字鍵盤。當(dāng)玩家點(diǎn)
33、擊按鈕時候,相關(guān)方法會被調(diào)用。以上的過程都需要KLSDActivity的參與管理。GameView 同樣繼承自SurfaceView 類,其關(guān)鍵也是實(shí)現(xiàn)onDraw()方法。onDraw()方法分別繪制游戲界面背景圖片,數(shù)字背景框,選題提示等等按鈕,時間顯示區(qū)域等。DrawKey()方法實(shí)現(xiàn)了數(shù)字鍵盤的繪制,保證在點(diǎn)擊空白框時候有圓盤數(shù)字選框出現(xiàn)。通過surfaceCreated()和surfaceDestroyed()兩個方法負(fù)責(zé)相關(guān)線程的啟動和調(diào)用工作。3.2.2 時間線程TimeThread的實(shí)現(xiàn)TimeThread線程主要用來更新界面中的時間,作為數(shù)獨(dú)游戲玩家計(jì)時功能,代碼如下: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+;/時間自加tryThread.sleep(1000);/睡眠一秒種catch(Exception e)/捕獲異常e.printStackTrace();/打印異常信
35、息TimeThread 類的實(shí)現(xiàn)比較簡單,只需每隔一秒鐘通過gameView.time自加更改一下GameView 中表示時間的屬性即可。public TimeThread(GameView gameView) 為時間線程的構(gòu)造器,在構(gòu)造器中先得到GameView的引用。然后重寫run()方法,通過時間的自加,實(shí)現(xiàn)一秒鐘功能。3.3 數(shù)獨(dú)算法類的實(shí)現(xiàn)數(shù)獨(dú)算法類主要實(shí)現(xiàn)數(shù)獨(dú)的生成以與填入數(shù)字的檢測功能,流程圖如下:圖4.3 WelcomeView類功能流程圖3.3.1數(shù)獨(dú)算法基本邏輯本節(jié)將對數(shù)獨(dú)算法類ShuDuSuanFa.java進(jìn)行解釋,該類基本上是數(shù)學(xué)計(jì)算,通過一定的算法產(chǎn)生所需要的數(shù)獨(dú)數(shù)
36、組,通過特定的接口供其他類使用。該類的目的是創(chuàng)建一個二維數(shù)組來表示數(shù)獨(dú)矩陣。使矩陣的每行、每列、每塊都沒有重復(fù)的數(shù)字。算法的簡單思路是先隨機(jī)取出一個09 的數(shù)字,然后檢查其所在的行、列、塊是否都符合要求。當(dāng)符合要求時繼續(xù)填充下一個,而當(dāng)不符合要求時,再次隨機(jī)取出一個沒有取出過的數(shù)字,再判斷。當(dāng)9 個數(shù)字都取出過后還沒有找到符合要求的數(shù)字時,進(jìn)行回退處理,即將最后一個取出的符合要求的數(shù)字進(jìn)行重新取值,直到所有數(shù)字全部填充完畢。在求解數(shù)獨(dú)時候,運(yùn)用到回溯法,將所有的解(問題的解空間)按照一定結(jié)構(gòu)排列,再進(jìn)行搜索。一般解空間構(gòu)造成為為樹狀結(jié)構(gòu),用深度優(yōu)先的策略搜索,一般有兩種方式:1.只需要一個解的
37、話,找到解即停止。2.需要求出所有解,則需做“樹的遍歷”找到所有解?;厮莘ǖ幕咀龇ㄊ撬阉?,或是一種組織得井井有條的,能避免不必要搜索的窮舉式搜索法。這種方法適用于解一些組合數(shù)相當(dāng)大的問題。回溯法在問題的解空間樹中,按深度優(yōu)先策略,從根結(jié)點(diǎn)出發(fā)搜索解空間樹。算法搜索至解空間樹的任意一點(diǎn)時,先判斷該結(jié)點(diǎn)是否包含問題的解。如果肯定不包含,則跳過對該結(jié)點(diǎn)為根的子樹的搜索,逐層向其祖先結(jié)點(diǎn)回溯;否則,進(jìn)入該子樹,繼續(xù)按深度優(yōu)先策略搜索?;厮莘ㄊ且环N搜索算法,其基本思路是:在一個問題中,根據(jù)題意給出的邊界條件劃定出所有可能解的圍(稱為可能解),根據(jù)題意確定出約束條件。利用程序順次在所有可能解中搜索時按照
38、深度搜索的方式進(jìn)行。即在第一層選定一個滿足約束條件的解,然后以該可能解為出發(fā)點(diǎn),搜索第二層的一個可能解(試探)。如果搜索到第二層的一個可能解,則繼續(xù)搜索第三層得一個可能解。依次類推,直到所有層得可能解都被找到,則得到了該問題的一個完整解。如果第二層所有的肯可能解都不滿足約束條件,則返回第一層,放棄原有的可能解,使用第一層的下一個可能解(回溯)。一次類推,尋找第二層的一個可能解?;厮莘ㄏ鄬τ谄渌F舉的特點(diǎn)在于,不必把問題的每一層的所有可能解都遍歷一遍,只要當(dāng)前的可能解不滿足約束條件就拋棄該解,尋求下一個可能解,而不必求解其余的下層解。當(dāng)當(dāng)前層得所有可能解都不滿足約束條件,則回溯到上一層,拋棄上一
39、層的當(dāng)前可能解。從以上分析中結(jié)合數(shù)獨(dú)問題的規(guī)則,得出數(shù)獨(dú)問題的約束條件為:每一格的數(shù)值圍僅限1-9每一格的數(shù)字在當(dāng)前行不允許重復(fù)每一格的數(shù)字在當(dāng)前列不允許重復(fù)每一格的數(shù)字在當(dāng)前小宮格不允許重復(fù)由此,回溯法通過約束條件的篩選,在所有解中除掉不可能的解,從而獲得問題的一個或者全部解。3.3.2 檢測填充結(jié)果根據(jù)數(shù)獨(dú)游戲的規(guī)則,玩家填充81個宮格之后,要滿足所有行,所有列和所有小九宮格不能出現(xiàn)重復(fù)的數(shù)字,并以此為條件進(jìn)行檢測。列檢測首先對各列進(jìn)行檢測,提供了檢測列9個數(shù)字是否有重復(fù)數(shù)據(jù)的方法checkLine (),該方法以此遍歷列中的9個數(shù)字,當(dāng)遍歷到某個數(shù)字時,檢測該數(shù)字后面的數(shù)字是否出現(xiàn)重復(fù)。
40、比如,當(dāng)檢測到第3個數(shù)字是7時,則檢測第4-9個數(shù)字是否出現(xiàn)7,如果出現(xiàn)重復(fù)則停止檢測,只有既可以避免重復(fù)檢測,又可以避免遺漏。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;行檢測類似于對列數(shù)據(jù)的檢測,還需要對每行進(jìn)行檢測,因此程序提供了對行數(shù)據(jù)的檢測方法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;小九宮格檢測除了對行和列的重復(fù)數(shù)據(jù)檢測之外,還需要對小九宮格的所有數(shù)字進(jìn)行檢測,避免出現(xiàn)重復(fù)現(xiàn)象。檢測原理與行,列檢測一樣,但需要計(jì)算九宮格數(shù)字的位置。Row和Col指定了檢測九宮格的位置,數(shù)獨(dú)單元格中一共有3×3個九宮格,Row和Col的圍為0到2。用以下程序完成九宮格重復(fù)數(shù)字的檢測。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 游戲的測試和運(yùn)行3.4.1游戲測試概述當(dāng)游戲軟件制作完成之后,為了驗(yàn)證本游戲是否存在缺陷
43、、能否達(dá)到預(yù)期的設(shè)計(jì)標(biāo),我們還需要在預(yù)設(shè)環(huán)境(如:模擬環(huán)境或真實(shí)移動終端設(shè)備)中進(jìn)行調(diào)試和運(yùn)行,以發(fā)現(xiàn)游戲中可能存在的問題和不足、解決這些缺陷,從而完善軟件功能并進(jìn)而提升產(chǎn)品質(zhì)量。作為軟件測試的重要組成部分,游戲測試具備軟件測試的一切共同特性,但由于游戲本身又具有一定的特殊性,因而游戲測試主要由兩個部分組成:(1)傳統(tǒng)的軟件測試由于測試是軟件開發(fā)過程中極為重要的組成部分,因而針對軟件本身的測試貫穿于軟件存在的整個生命周期。首先,程序員需要在程序設(shè)計(jì)開發(fā)過程中按階段對產(chǎn)生的模塊集中測試,以保證系統(tǒng)各模塊能實(shí)現(xiàn)各自的功能,在此階段軟件的測試一般主要集中在程序的細(xì)節(jié)部分。當(dāng)軟件制作開發(fā)出來之后,為保
44、證軟件整體的完善性,還需要在軟件工程理論的指導(dǎo)下對整個系統(tǒng)進(jìn)行測試,這階段的測試主要有黑盒測試和白盒測試。所謂黑盒測試就是把要測試的對象當(dāng)作一個黑盒子,不需要知道里面是怎么處理的,只要對輸入和輸出數(shù)據(jù)進(jìn)行測試,這種測試方案屬于高端測試,主要是在操作層面對游戲進(jìn)行測試;而白盒測試正好相反,基于白盒測試的測試方案屬于低端測試,是對各種設(shè)計(jì)細(xì)節(jié)方面的測試,測試者必須對測試對象的部處理過程非常了解,對里面所有的分支和循環(huán)進(jìn)行實(shí)驗(yàn)從而達(dá)到測試的目的。在進(jìn)行軟件測試的過程中,測試人員應(yīng)根據(jù)需要把墨盒和白盒測試有效的結(jié)合,以達(dá)到發(fā)現(xiàn)軟件錯誤并進(jìn)而完善軟件的目的。(2)對游戲性的測試由于游戲特別是在很大程度上
45、是對現(xiàn)實(shí)世界的一種模擬,因而它不但包含了人類社會的一部分特性,同時還涉與娛樂性、可玩性等獨(dú)有特點(diǎn),所以針對游戲的測試還包括三個部分:游戲情節(jié)的測試:主要是針對體現(xiàn)游戲主線的故事情節(jié)和游戲世界中的任務(wù)系統(tǒng)等進(jìn)行測試。游戲世界的平衡測試:平衡性主要體現(xiàn)在經(jīng)濟(jì)平衡、能力平衡(包含技能、屬性等等),測試的目的是為了能保證游戲世界的公平競爭。游戲文化的測試:比如整個游戲世界的風(fēng)格,是中國文化主導(dǎo),還是日風(fēng)格等等,大到游戲整體,小到NPC 對話,比如一個書生,他的對話就必需斯文,不可以用江湖語言。目前在游戲開發(fā)過程中,對游戲性的測試主要有以下幾種實(shí)現(xiàn)途徑:一是通過部測試人員對以下的三個方面進(jìn)行測試,由于他
46、們往往都是經(jīng)過精選而來的職業(yè)玩家,對游戲有很深的認(rèn)識,因而也能較好完成游戲的測試目標(biāo);二是邀請一定數(shù)量的玩家或游戲媒體人員對外圍系統(tǒng)進(jìn)行測試,其目的主要是測試游戲的可玩性和易用性,與一些外圍的Bug;三是通過大圍的測和公測,讓更多的玩家進(jìn)行試玩。3.4.2測試環(huán)境本游戲的測試環(huán)境包括兩種,一種是基于 Android 虛擬設(shè)備AVD 的測試,在測試之前,首先要創(chuàng)建一個AVD。在測試游戲時選用的是基于Android 2.3的AVD。還有一種便是基于 Android 手機(jī)的測試,在測試之前,需要首先將游戲文件夾下的bin 目錄下的游戲的apk 文件通過數(shù)據(jù)線傳到Android 手機(jī)上,然后通過Android 手機(jī)上的第三方文件瀏覽器找到需要安裝的apk 文件,即可安裝。本人在基于 Android 手機(jī)的測試時,選用的手機(jī)為SONY WT19I,SONY WT19I的主要參數(shù)為:主屏尺寸:3.2 英寸;主屏色彩:彩屏,1600萬
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 許昌職業(yè)技術(shù)學(xué)院《實(shí)驗(yàn)設(shè)計(jì)方法》2023-2024學(xué)年第一學(xué)期期末試卷
- 山東省單縣一中2024-2025學(xué)年高三適應(yīng)性月考(七)英語試題含解析
- 煙臺幼兒師范高等??茖W(xué)?!赌突鸩牧瞎に噷W(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 江蘇省鹽城市響水縣2025年初三第二學(xué)期第二次綜合練習(xí)化學(xué)試題文試卷含解析
- 天津現(xiàn)代職業(yè)技術(shù)學(xué)院《英語語言學(xué)概論》2023-2024學(xué)年第二學(xué)期期末試卷
- 廈門醫(yī)學(xué)院《測繪學(xué)科》2023-2024學(xué)年第二學(xué)期期末試卷
- 電商培訓(xùn)合同范文
- 二零二五版借款補(bǔ)充合同
- 二零二五版房屋裝修半包合同范文
- 二零二五山地租賃合同范例
- 2025年中國數(shù)控轉(zhuǎn)臺行業(yè)市場規(guī)模及投資前景預(yù)測分析報告
- 建筑工程技術(shù)畢業(yè)實(shí)踐報告3000字
- 2024年出版專業(yè)資格考試《基礎(chǔ)知識》(中級)真題及答案
- 中國加速康復(fù)外科臨床實(shí)踐指南2021
- 山東省大教育聯(lián)盟學(xué)校2024-2025學(xué)年高三下學(xué)期開學(xué)檢測化學(xué)試題(原卷版+解析版)
- 2025教科版六年級科學(xué)下冊全冊教案【含反思】
- DB43T-稻-再-油生產(chǎn)技術(shù)規(guī)程
- 急診醫(yī)學(xué)知到智慧樹章節(jié)測試課后答案2024年秋云南中醫(yī)藥大學(xué)
- 2024-2030年中國建筑減隔震行業(yè)發(fā)展全面調(diào)研與未來趨勢分析報告
- 中國慢性冠脈綜合征患者診斷及管理指南2024版解讀
- 2025廣西柳鋼集團(tuán)招聘易考易錯模擬試題(共500題)試卷后附參考答案
評論
0/150
提交評論