基于android數(shù)獨(dú)游戲設(shè)計(jì)_畢業(yè)設(shè)計(jì)論文.doc
畢業(yè)設(shè)計(jì)(論文) 題題 目目: 基于 Android 數(shù)獨(dú)游戲設(shè)計(jì) I 基于 Android 數(shù)獨(dú)游戲設(shè)計(jì) 摘摘 要要 移動(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)大的瀏覽器。因此, 對(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)關(guān)鍵鍵詞詞:Android 數(shù)獨(dú) 智能機(jī) II The design of Sudoku game based on Android Abstract Arrival of the mobile Internet era has greatly changed our lives, and Android is a Linux- based system quickly occupied the smartphone operation system, Android development is particularly necessary under the circumstances. Androids biggest feature is its open architecture, not only has a very good development and debugging environment, but also supports a variety of scalable user experience, including rich graphical components, multimedia support, and powerful browser. Therefore, for software professionals, Android platform has unlimited appeal. In this thesis, the analysis and discussion of Android mobile phone software development technology provide users with better platform to the Sudoku based on Android meteorological software. Through the Android system structure and application development for preliminary research, we designed a Sudoku game. In the system based on the analysis of the detailed requirements, we design the game in the game menu interface, the screen rendering, time control and layout algorithm. This thesis describes the whole development process of Android based smart phone game using Google Android SDK. Finally, we have the software with friendly interface and simple operation. Key Words: Android ; Sudoku ; Smartphone III 目 錄 摘 要I Abstract.II 第一章 緒論.1 1.1 研究背景1 1.1.1 手機(jī)游戲的發(fā)展以及特征1 1.1.2 數(shù)獨(dú)游戲背景2 1.2 Android 手機(jī)游戲的市場(chǎng)價(jià)值.2 1.3 本文主要工作及章節(jié)結(jié)構(gòu).3 第二章 Android 平臺(tái)概述.4 2.1 Android 系統(tǒng)簡(jiǎn)介4 2.2 Android 系統(tǒng)特性4 2.3 Android 操作系統(tǒng)框架結(jié)構(gòu).5 2.3.1 應(yīng)用程序6 2.3.2 應(yīng)用程序框架6 2.3.3 庫(kù)與運(yùn)行環(huán)境7 2.3.4 內(nèi)核7 2.4 Android 應(yīng)用程序構(gòu)成.8 2.4.1Activity8 2.4.2 Broadcast Receiver9 2.4.3 Service10 2.4.4 Content Provider10 2.5 Android 應(yīng)用程序的生命周期.11 第三章 數(shù)獨(dú)游戲的設(shè)計(jì).13 3.1 游戲功能簡(jiǎn)介13 3.2 游戲策劃以及準(zhǔn)備工作14 3.3 游戲的架構(gòu).16 3.3.1 各類的介紹16 3.3.2 游戲的框架簡(jiǎn)介18 IV 第四章 基于 Android 平臺(tái)數(shù)獨(dú)游戲的實(shí)現(xiàn).19 4.1 歡迎界面的設(shè)計(jì)和實(shí)現(xiàn).19 4.1.1 主類 KLSDActivity 實(shí)現(xiàn)19 4.1.2 歡迎界面 WelcomeView 類的實(shí)現(xiàn)20 4.1.3 WelcomeViewDrawThread 類和 WelcomeViewGoThread 類的實(shí)現(xiàn)21 4.1.4 HelpView 類和 AboutView 類的實(shí)現(xiàn)22 4.2 游戲界面相關(guān)類的實(shí)現(xiàn).23 4.2.1 游戲界面 GameView 的實(shí)現(xiàn)24 4.2.2 時(shí)間線程 TimeThread 的實(shí)現(xiàn)25 4.3 數(shù)獨(dú)算法類的實(shí)現(xiàn).25 4.3.1 數(shù)獨(dú)算法基本邏輯26 4.3.2 檢測(cè)填充結(jié)果27 4.4 游戲的測(cè)試和運(yùn)行.29 4.4.1 游戲測(cè)試概述29 4.4.2 測(cè)試環(huán)境30 4.4.3 游戲運(yùn)行結(jié)果31 第五章 總結(jié)和展望.35 5.1 總結(jié).35 5.2 展望.35 參考文獻(xiàn).36 致 謝.37 南京工業(yè)大學(xué)本科生畢業(yè)設(shè)計(jì)(論文) 1 第一章 緒論 1.11.1 研究背景研究背景 1.1.1 手機(jī)游戲的發(fā)展以及特征 手機(jī)游戲,是指用戶運(yùn)行在移動(dòng)終端的應(yīng)用程序,具有網(wǎng)絡(luò)連接功能,能 夠滿足用戶隨時(shí)隨地進(jìn)行游行的需求,它需要一定的硬件環(huán)境和一定的系統(tǒng)環(huán) 境作為其運(yùn)行的基礎(chǔ)。手機(jī)游戲吸引用戶最大的特點(diǎn)就是其便利性,由于其是 移動(dòng)終端,所以用戶可以隨時(shí)隨地進(jìn)行游戲。正是因?yàn)槠浔憷裕謾C(jī)游戲市 場(chǎng)有了很大的發(fā)展。在美國(guó),手機(jī)游戲作為美國(guó)手機(jī)用戶最喜歡的移動(dòng)應(yīng)用之 一,在iPhone和Android等智能終端推出后發(fā)展迅速。 手機(jī)游戲常見(jiàn)的特征可以總結(jié)如下: 1.龐大的潛在用戶群:全球在使用的移動(dòng)電話已經(jīng)超過(guò) 10 億部,而且這個(gè) 數(shù)字每天都在不斷增加。在除美國(guó)之外的各個(gè)發(fā)達(dá)國(guó)家,手機(jī)用戶都比計(jì)算機(jī) 用戶多。手機(jī)游戲潛在的市場(chǎng)比其他任何平臺(tái),比如 PlayStation 和 GameBoy 都要大。 2.便攜性與移動(dòng)性:在控制臺(tái)游戲時(shí)代,GameBoy 熱銷的一個(gè)原因就是便 攜性人們可以隨時(shí)隨地沉浸在自己喜歡的游戲中,還可以隨時(shí)隨地?fù)屬?gòu)自 己喜歡的裝備或?qū)櫸?。和游戲控制臺(tái)或者 PC 相比,手機(jī)雖然可能不是一個(gè)理想 的游戲設(shè)備,但畢竟人們總是隨時(shí)隨身攜帶,這樣手機(jī)游戲很可能成為人們消 遣時(shí)間的首選。手機(jī)便攜性、移動(dòng)性的特征更能滿足用戶隨時(shí)隨地玩游戲的需 求,用戶利用排隊(duì)、等車的時(shí)間進(jìn)行游戲,手機(jī)游戲碎片化的特性凸顯。調(diào)查 顯示,29.8%的用戶在用手機(jī)玩游戲以后電腦端玩游戲的時(shí)間減少,手機(jī)游戲已 經(jīng)開始搶奪電腦游戲時(shí)間。22.4%的用戶手機(jī)游戲時(shí)間越來(lái)越長(zhǎng),僅有 10%的用 戶時(shí)間變短,手機(jī)游戲已逐漸成為一種普遍的娛樂(lè)方式。 3.支持網(wǎng)絡(luò):因?yàn)槭謾C(jī)是網(wǎng)絡(luò)設(shè)備,在一定限制因素下可以實(shí)現(xiàn)多人在線 游戲。隨著移動(dòng)網(wǎng)絡(luò)的發(fā)展,移動(dòng)游戲也越來(lái)越多的被大家接受,對(duì)于之前長(zhǎng) 期通知市場(chǎng)的掌機(jī)來(lái)說(shuō)造成了不少的沖擊。市場(chǎng)研究公司 IDC 和 App Annie 報(bào) 第一章 緒論 2 告顯示 2013 年第一季度 iOS 和 Android 平臺(tái)游戲業(yè)務(wù)營(yíng)收是掌機(jī)的 3 倍。 1.1.2 數(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)單,只需要在空格處填寫19的數(shù)字,并保證每個(gè)數(shù)字 在每個(gè)九宮格內(nèi)只出現(xiàn)一次,而一般的游戲過(guò)程是系統(tǒng)隨機(jī)生成一個(gè)棋局,然 后玩家需要在空白處填上相應(yīng)的數(shù)字使其滿足游戲規(guī)則。由于此類游戲操作簡(jiǎn) 單,不需要特定的語(yǔ)言基礎(chǔ),也不需要進(jìn)行數(shù)字運(yùn)算且可玩性高、鍛煉思維、 開發(fā)大腦,所以很快風(fēng)靡全球。 1.21.2 AndroidAndroid 手機(jī)游戲的市場(chǎng)價(jià)值手機(jī)游戲的市場(chǎng)價(jià)值 Android 是 Google 開發(fā)的基于 Linux 平臺(tái)的開源手機(jī)操作系統(tǒng)。它包括操 作系統(tǒng)、用戶界面和應(yīng)用程序移動(dòng)電話工作所需的全部軟件,而且不存在 任何以往阻礙移動(dòng)產(chǎn)業(yè)創(chuàng)新的專有權(quán)障礙2。Google 與開放手機(jī)聯(lián)盟合作開發(fā) 了 Android,這個(gè)聯(lián)盟由包括中國(guó)移動(dòng)、摩托羅拉、高通、宏達(dá)電和 T-Mobile 在內(nèi)的 30 多家技術(shù)和無(wú)線應(yīng)用的領(lǐng)軍企業(yè)組成。Google 通過(guò)與運(yùn)營(yíng)商、設(shè)備 制造商、開發(fā)商和其他有關(guān)各方結(jié)成深層次的合作伙伴關(guān)系,希望借助建立標(biāo) 準(zhǔn)化、開放式的移動(dòng)電話軟件平臺(tái),在移動(dòng)產(chǎn)業(yè)內(nèi)形成一個(gè)開放式的生態(tài)系統(tǒng)。 Android平臺(tái)上的游戲相比應(yīng)用軟件,不需要進(jìn)行嚴(yán)格的市場(chǎng)細(xì)分,不需要 針對(duì)目標(biāo)用戶量身定制。這是因?yàn)橛螒蛲婕业暮诵男枨笫墙y(tǒng)一的,那就是:娛 樂(lè)與打發(fā)時(shí)間(乃至更高層面的競(jìng)技需求和群體認(rèn)同需求),這種需求附著于特 南京工業(yè)大學(xué)本科生畢業(yè)設(shè)計(jì)(論文) 3 定的社會(huì)發(fā)展階段,不受地域的限制,甚至于能夠穿透文化壁壘。因此,絕大 多數(shù)種類的游戲都具備傳染性與普適性,每一個(gè)售出的游戲都將會(huì)點(diǎn)燃周圍潛 在玩家的激情,最終吞噬整個(gè)需求市場(chǎng)。由此可知,幾乎每一個(gè)Android手機(jī)用 戶都是游戲的需求者,都是潛在的顧客,現(xiàn)今的1000多萬(wàn)Android用戶不過(guò)是冰 山一角,隨著Android手機(jī)市場(chǎng)進(jìn)一步壯大,游戲的市場(chǎng)容量將具備更大的增長(zhǎng) 空間3。 1.31.3 本文主要工作及章節(jié)結(jié)構(gòu)本文主要工作及章節(jié)結(jié)構(gòu) 整篇論文共分為六個(gè)部分,其主要內(nèi)容安排如下: 第一章 引言。介紹論文的研究背景、目的和意義。包括課題的背景資料 簡(jiǎn)介、國(guó)內(nèi)外研究現(xiàn)狀和發(fā)展趨勢(shì)、深入地介紹了課題研究的價(jià)值。 第二章 Android 平臺(tái)概述。這部分主要是介紹了智能手機(jī)系統(tǒng)現(xiàn)狀、 Android 的功能特征、Android 系統(tǒng)的特點(diǎn)以及 Android 的體系結(jié)構(gòu)。 第三章 數(shù)獨(dú)游戲的設(shè)計(jì)。對(duì)游戲相關(guān)策劃,功能以及架構(gòu)進(jìn)行介紹。 第四章 數(shù)獨(dú)游戲的實(shí)現(xiàn)。這部分主要介紹了游戲的界面、游戲中的邏輯 處理以及該游戲今后的改進(jìn)和優(yōu)化。 第五章 總結(jié)和展望。對(duì)整篇論文加以總結(jié)與回顧以及對(duì)未來(lái)的展望。 第二章 Android 平臺(tái)概述 4 第二章 Android 平臺(tái)概述 本章將介紹Android 這個(gè)基于Linux開發(fā)平臺(tái),首先我們會(huì)介紹 Android 操作系統(tǒng),然后講述其特性,接著講述其系統(tǒng)框架,其次我們會(huì)重點(diǎn)介紹其應(yīng) 用程序的構(gòu)成模塊,最后會(huì)介紹其生命周期。 2.12.1 AndroidAndroid 系統(tǒng)簡(jiǎn)介系統(tǒng)簡(jiǎ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è)備制造商以及開發(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)能夠提供信息 4。 2.22.2 AndroidAndroid 系統(tǒng)特性系統(tǒng)特性 Android系統(tǒng)特性如下所示: 1.應(yīng)用框架:Android系統(tǒng)組件,用于開發(fā)流程,兩個(gè)特性:可重用性和可 替代性。 2.Dalvik 虛擬機(jī):在Android系統(tǒng)中, Dalvik虛擬機(jī)是一種Java 虛擬機(jī), 是Google公司自主開發(fā),其代號(hào)為Dalvik,占用資源比較小,運(yùn)行效率比較高。 3.集成瀏覽器:引擎 WebKit,其特性是開源。 4.優(yōu)化圖形:強(qiáng)大的自定義二維圖形庫(kù)?;贠penGL ES 1.0 標(biāo)準(zhǔn)的3D 圖 形功能,在移動(dòng)3D 開發(fā)中有著至關(guān)重要的地位。 5.SQLite 數(shù)據(jù)庫(kù):SQLite 提供結(jié)構(gòu)化的數(shù)據(jù)存儲(chǔ)。它是一款輕型免費(fèi)的 南京工業(yè)大學(xué)本科生畢業(yè)設(shè)計(jì)(論文) 5 且開源的數(shù)據(jù)庫(kù),設(shè)計(jì)目標(biāo)是嵌入式的。它具備占用資源低、需要的內(nèi)存空間 少、處理速度較快,并且還支持事務(wù)處理功能等優(yōu)點(diǎn)。 6.多媒體支持:支持各種通用的音視頻和靜態(tài)圖像格式 (MPEG4、MP3、JPG、PNG、GIF、AAC、H.264、AMR)。 7.GSM 技術(shù):(依賴硬件)Global System for Mobile Communications,全 球移動(dòng)通訊系統(tǒng),俗稱全球通,是第二代移動(dòng)通信技術(shù),其開發(fā)目的是讓全球各 地可以共同使用一個(gè)移動(dòng)電話網(wǎng)絡(luò)標(biāo)準(zhǔn),讓用戶使用一部手機(jī)就能行遍全球。 8.藍(lán)牙,EDGE,3G,and Wi-Fi:(依賴硬件)藍(lán)牙和Wi-Fi 都是一種短距離 的無(wú)線連接技術(shù),在短距離內(nèi)可以實(shí)現(xiàn)話音和數(shù)據(jù)的無(wú)線傳輸。EDGE(Enhanced Data Rate for GSM Evolution),是增強(qiáng)型數(shù)據(jù)速率GSM 演進(jìn)技術(shù)。 9.Camera,GPS,Compass,and Accelerometer:(依賴硬件)GPS(Global Positioning System),即全球定位系統(tǒng)。它是一個(gè)由覆蓋全球的24 顆衛(wèi)星組 成的衛(wèi)星系統(tǒng)。Compass是一個(gè)開放源代碼的Java 搜索引擎框架。 10.強(qiáng)大的開發(fā)環(huán)境:包括一個(gè)設(shè)備模擬器,調(diào)試工具,內(nèi)存和性能檢測(cè), 以及Eclipse 11.IDE 的開發(fā)插件。Eclipse集成開發(fā)環(huán)境。 2.32.3 AndroidAndroid 操作系統(tǒng)框架結(jié)構(gòu)操作系統(tǒng)框架結(jié)構(gòu) Android 作為一個(gè)開源的移動(dòng)設(shè)備的平臺(tái),其軟件層次結(jié)構(gòu)自上而下分為 四個(gè)層次,分別是:應(yīng)用程序(Application)、應(yīng)用程序框架(Application Framework)、各種庫(kù)(Libraries)和Android 運(yùn)行環(huán)境(RunTime)、Linux 內(nèi)核 (Linux Kernel)。 第二章 Android 平臺(tái)概述 6 圖 2.1 Google 手機(jī)操作系統(tǒng)平臺(tái)-Android 的架構(gòu)模型 2.3.1 應(yīng)用程序 突破傳統(tǒng)思維,提供更好的用戶體驗(yàn)。Android 將會(huì)移植一系列的核心應(yīng) 用,包括E-mail 客戶端,SMS 程序,日歷,GPS 地圖,瀏覽器,聯(lián)系人等等。 所有的應(yīng)用程序都是由Java語(yǔ)言完成的。應(yīng)用程序是無(wú)界限的,可以在平 等條件下創(chuàng)建,還可以輕松地嵌入Web,可以并行運(yùn)行5。 2.3.2 應(yīng)用程序框架 Android 應(yīng)用程序由一個(gè)或多個(gè)組件組成,Android 的應(yīng)用程序框架為應(yīng) 用程序?qū)拥拈_發(fā)者提供APIs,它實(shí)際上是一個(gè)應(yīng)用程序的框架。由于上層的應(yīng) 用程序是以Java 構(gòu)建的,因此本層次提供的首先包含了UI 程序中所需要的各 種控件: 例如:Views(視圖組件)包括lists(列表),grids(柵格),text boxes(文 本框),buttons(按鈕)等。甚至一個(gè)嵌入式的Web 瀏覽器。 一個(gè) Android 的應(yīng)用程序可以利用應(yīng)用程序框架中的以下幾個(gè)部分: Activity(活動(dòng)),Broadcast Receiver(廣播接收者),Service(服務(wù)), Content Provider(內(nèi)容提供者) 南京工業(yè)大學(xué)本科生畢業(yè)設(shè)計(jì)(論文) 7 2.3.3 庫(kù)與運(yùn)行環(huán)境 Android 包含一套C/C+庫(kù),能被系統(tǒng)中不同的組件使用。這些功能通過(guò) Android應(yīng)用框架展現(xiàn)給開發(fā)人員。下面列出一些核心庫(kù): (1)System C library:從BSD 繼承來(lái)的標(biāo)準(zhǔn)C 系統(tǒng)函數(shù)庫(kù),也是系統(tǒng)中最 為底層的庫(kù),是專門為基于嵌入式Linux 的設(shè)備制定的。 (2)Media Framework:該庫(kù)支持多種常用的音頻、視頻格式的回放和錄制, 同時(shí)支持靜態(tài)圖片文件,包括MPEG4、H.264、MP3、AAC、AMR、JPG 和PNG 等。 (3)Surface Manager:用于管理不同應(yīng)用對(duì)圖形顯示子系統(tǒng)和2D 和3D 圖 形層的訪問(wèn)。 (4)WebKit:一個(gè)時(shí)尚的web 瀏覽器引擎,為Android 瀏覽器和內(nèi)嵌的web view 提供實(shí)現(xiàn)。 (5)SGL:隱藏的2D 圖形引擎。 (6)3D libraries:基于OpenGL ES 1.0 APIs 實(shí)現(xiàn)的庫(kù),該庫(kù)可以使用硬 件3D 加速,或者高度優(yōu)化的3D 軟加速。 (7)FreeType:位圖和向量模式的字體繪制。 (8)SQLite:一個(gè)強(qiáng)大的,輕量的關(guān)系型數(shù)據(jù)庫(kù)引擎,用于所有的應(yīng)用。 Android 運(yùn)行時(shí)Android 包含一組核心庫(kù),提供了Java 語(yǔ)言核心庫(kù)內(nèi)的大 部分功能。Android運(yùn)行環(huán)境主要指的是虛擬機(jī)技術(shù)Dalvik。Dalvik虛擬機(jī) 依賴Linux kernel來(lái)實(shí)現(xiàn)一些潛在功能,例如線程和底層內(nèi)存管理。Dalvik虛 擬機(jī)和一般Java虛擬機(jī)(JavaVM)不同,它執(zhí)行的不是Java標(biāo)準(zhǔn)的字節(jié)碼而是 Dalvik可執(zhí)行格式(.dex)中執(zhí)行文件,該格式的文件經(jīng)過(guò)優(yōu)化占用很小的內(nèi)存。 在執(zhí)行的過(guò)程中,每一個(gè)應(yīng)用程序即一個(gè)進(jìn)程(Linux 的一個(gè)Process) 。二者 最大的區(qū)別在于Java VM 是以基于棧的虛擬機(jī)(Stack-based),而Dalvik是基于 寄存器的虛擬機(jī)(Register-based)6。顯然,后者最大的好處在于可以根據(jù)硬 件實(shí)現(xiàn)更大的優(yōu)化,這更適合移動(dòng)設(shè)備的特點(diǎn)。每個(gè)Android應(yīng)用程序都在 Dalvik VM的一個(gè)實(shí)例中運(yùn)行,這個(gè)實(shí)例駐留在一個(gè)由Linux內(nèi)核管理的進(jìn)程中。 第二章 Android 平臺(tái)概述 8 2.3.4 內(nèi)核 Android使用Linux2.6 內(nèi)核來(lái)提供系統(tǒng)的核心服務(wù),例如:安全機(jī)制,內(nèi) 存管理,進(jìn)程管理,網(wǎng)絡(luò)堆棧。Android更多的是需要一些與移動(dòng)設(shè)備相關(guān)的驅(qū) 動(dòng)程序。其主要的驅(qū)動(dòng)有:顯示驅(qū)動(dòng)(Display Driver)、Flash內(nèi)存驅(qū)動(dòng)(Flash Memory Driver)、照相機(jī)驅(qū)動(dòng)(Camera Driver)、音頻驅(qū)動(dòng)(Audio Driver)、 Wi-Fi驅(qū)動(dòng)(Camera Driver)、鍵盤驅(qū)動(dòng)(KeyBoard Driver)、藍(lán)牙驅(qū)動(dòng) (Bluetooth Driver)、Binder IPC驅(qū)動(dòng)(Android一個(gè)特殊的驅(qū)動(dòng)程序,具有單 獨(dú)的設(shè)備節(jié)點(diǎn),提供進(jìn)程間通訊的功能)7。 2.42.4 AndroidAndroid 應(yīng)用程序構(gòu)成應(yīng)用程序構(gòu)成 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í)候只需要這四種中 的某幾種就可以了。除此之外,應(yīng)用程序的所有組件還都必須在 AndroidManifest.xml中聲明8。這是一個(gè)XML配置文件,這個(gè)配置文件用于定 義應(yīng)用程序的組件、組件的功能及必要條件等。這個(gè)配置文件是任何一個(gè) Android應(yīng)用程序所必需的。 2.4.1 Activity Activity 可以說(shuō)是開發(fā)人員最常用的組件,同時(shí)也屬于Android 最基本的 組成部分之一。Android 程序中,一般一個(gè)Activity 代表手機(jī)屏幕上的一屏。 舉例來(lái)說(shuō),如果將手機(jī)比作一個(gè)瀏覽器,那么一個(gè)Activity 就相當(dāng)于一個(gè)網(wǎng)頁(yè)。 在Activity 中,可以添加多個(gè)視圖,然后為這些視圖添加一些事件處理。這些 視圖可以是按鈕、文本框、列表等。可以看到,Activity 的概念和網(wǎng)頁(yè)的概念 相當(dāng)類似。一般一個(gè)Android 應(yīng)用是由多個(gè)Activity 組成,同時(shí)這些Activity 南京工業(yè)大學(xué)本科生畢業(yè)設(shè)計(jì)(論文) 9 相互之間可以進(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í),之 前的屏幕會(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)中最常見(jiàn)的動(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,要定義類型為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)?接收到Intent 的請(qǐng)求而開始運(yùn)行,完成Activity 的跳轉(zhuǎn)。這種跳轉(zhuǎn)機(jī)制提供 了兩個(gè)關(guān)鍵好處: 第二章 Android 平臺(tái)概述 10 (1)操作請(qǐng)求被Intent 封裝起來(lái),方便Activity 重復(fù)利用。 (2)相互跳轉(zhuǎn)的多個(gè)Activity 之間實(shí)現(xiàn)了松耦合。只要IntentFilier 保持 不變,一個(gè)ctivity 可以隨意修改,而不用擔(dān)心其他Activity 找不到它。 2.4.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 Receiver 來(lái)進(jìn)行處理。 Broadcast Receiver不能生成UI,也就是說(shuō)對(duì)于用戶來(lái)說(shuō)是透明的,用戶 是看不到的。Broadcast Receiver只能通過(guò)NotificationManager來(lái)通知用戶這 些事件發(fā)生了。Broadcast Receiver既可以在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 Broadcast廣播給其他應(yīng)用程序。 2.4.3 Service Service是一種程序,它可以運(yùn)行很長(zhǎng)時(shí)間,但是它卻沒(méi)有用戶界面,不可 交互,而且不能自己運(yùn)行。它需要通過(guò)某一個(gè)Activity或者其他的Context對(duì)象 來(lái)調(diào)用12。最常見(jiàn)的例子,比如說(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ò) Context.bindService()可以綁定一個(gè)Service。 2.4.4 Content Provider 對(duì)于數(shù)據(jù)存儲(chǔ),Android與其他的操作系統(tǒng)有一點(diǎn)不太一樣,即數(shù)據(jù)在 南京工業(yè)大學(xué)本科生畢業(yè)設(shè)計(jì)(論文) 11 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)Content Provider的抽象接口以 后,程序便可以將自己的數(shù)據(jù)暴露出去,其他程序只要有權(quán)限,就可以通過(guò)這 一套標(biāo)準(zhǔn)而統(tǒng)一的接口,讀取或是刪除該程序的數(shù)據(jù)13。 2.52.5 AndroidAndroid 應(yīng)用程序的生命周期應(yīng)用程序的生命周期 Android 應(yīng)用程序一個(gè)完整的生命周期是從應(yīng)用程序的創(chuàng)建到結(jié)束的全過(guò) 程,與其他系統(tǒng)不同,Android 應(yīng)用程序的生命周期是不受進(jìn)程本身控制的, 而是由Android 系統(tǒng)來(lái)決定的,Android 系統(tǒng)會(huì)根據(jù)應(yīng)用程序?qū)τ脩舻闹匾?及當(dāng)前系統(tǒng)的負(fù)載來(lái)決定生命周期的長(zhǎng)短。Android 系統(tǒng)的各個(gè)進(jìn)程重要程度 如圖2.2 所示。 前臺(tái)進(jìn)程可見(jiàn)進(jìn)程服務(wù)進(jìn)程后臺(tái)進(jìn)程空進(jìn)程 關(guān)鍵優(yōu)先級(jí)高優(yōu)先級(jí)低優(yōu)先級(jí) 圖 2.2 Android 應(yīng)用程序進(jìn)程優(yōu)先級(jí) (1)前臺(tái)進(jìn)程,是Android 系統(tǒng)中最重要的進(jìn)程,是與用戶正在進(jìn)行交互的 進(jìn)程。有以下四種情況:Activity 正在與用戶進(jìn)行交互;進(jìn)程被Activity 調(diào) 用,而且這個(gè)進(jìn)程正在與用戶進(jìn)行交互;進(jìn)程服務(wù)正在執(zhí)行聲明中的回調(diào)函數(shù), 如onCreate()、onStart()、onDestroy();進(jìn)程的Broadcast Receiver 在執(zhí)行 onReceive()函數(shù)。Android 系統(tǒng)在多個(gè)前臺(tái)進(jìn)程同時(shí)運(yùn)行時(shí),可能會(huì)出現(xiàn)資源 不足的情況,此時(shí)會(huì)清除部分前臺(tái)進(jìn)程,以保證主要的用戶界面能夠及時(shí)響應(yīng)。 (2)可見(jiàn)進(jìn)程,是指部分應(yīng)用程序界面能夠被用戶看見(jiàn),卻不在前臺(tái)與用戶 進(jìn)行交互,不影響界面事件的進(jìn)程。如果應(yīng)用程序進(jìn)程包含一個(gè)服務(wù),且這個(gè) 服務(wù)正被用戶可見(jiàn)的Activity 調(diào)用,則此進(jìn)程同樣被視為可見(jiàn)進(jìn)程。Android 進(jìn)程一般存在少量的可見(jiàn)進(jìn)程,只有在特殊情況下,Android 系統(tǒng)才會(huì)為保證 第二章 Android 平臺(tái)概述 12 前臺(tái)進(jìn)程的資源而清除可見(jiàn)進(jìn)程。 (3)服務(wù)進(jìn)程,服務(wù)進(jìn)程是指包含已啟動(dòng)服務(wù)的進(jìn)程。該進(jìn)程沒(méi)有用戶界面 并在后臺(tái)長(zhǎng)期運(yùn)行。除非Android 系統(tǒng)不能保證前臺(tái)進(jìn)程和可見(jiàn)進(jìn)程所必要的 資源,否則不會(huì)強(qiáng)行清除服務(wù)進(jìn)程。 (4)后臺(tái)進(jìn)程,后臺(tái)進(jìn)程是指不包括任何已經(jīng)啟動(dòng)的服務(wù),而且沒(méi)有任何用 戶可見(jiàn)的Activity 的進(jìn)程。Android 系統(tǒng)中一般存在數(shù)量較多的后臺(tái)進(jìn)程,在 系統(tǒng)資源緊張時(shí)系統(tǒng)將會(huì)優(yōu)先清除用戶較長(zhǎng)時(shí)間沒(méi)有見(jiàn)到的后臺(tái)進(jìn)程。 (5)空進(jìn)程,空進(jìn)程是不包含任何活躍組件的進(jìn)程,空進(jìn)程在系統(tǒng)緊張時(shí)會(huì) 被首先清除。但為了提高Android 應(yīng)用程序的啟動(dòng)速度,Android 系統(tǒng)會(huì)將空 進(jìn)程保存在系統(tǒng)內(nèi)存用,在用戶重新啟動(dòng)該程序時(shí),空進(jìn)程會(huì)被重新使用。 當(dāng)兩個(gè)應(yīng)用程序具有相同的優(yōu)先級(jí)時(shí),處于較低優(yōu)先級(jí)且運(yùn)行時(shí)間最長(zhǎng)的 進(jìn)程將會(huì)首先被終止。進(jìn)程的優(yōu)先級(jí)也受到進(jìn)程間依賴性的影響,如果一個(gè)應(yīng) 用程序依賴于第二個(gè)應(yīng)用程序所提供的服務(wù)或者內(nèi)容提供器,那么第二個(gè)應(yīng)用 程序至少會(huì)擁有與它所支持的這個(gè)應(yīng)用程序相同的優(yōu)先級(jí)。進(jìn)程的優(yōu)先級(jí)取決 于所有組件中優(yōu)先級(jí)最高的部分,進(jìn)程的優(yōu)先級(jí)會(huì)根據(jù)其他進(jìn)程的依賴關(guān)系而 變化。 南京工業(yè)大學(xué)本科生畢業(yè)設(shè)計(jì)(論文) 13 第三章 數(shù)獨(dú)游戲的設(shè)計(jì) 3.13.1 游戲功能簡(jiǎn)介游戲功能簡(jiǎn)介 數(shù)獨(dú)游戲的規(guī)則很簡(jiǎn)單,只需在空格處填入 19 的數(shù)字,并保證每個(gè)數(shù) 字在每個(gè)九宮格內(nèi)只能出現(xiàn)一次,且每個(gè)數(shù)字在每一行、每一列也只能出現(xiàn)一 次,而一般的游戲過(guò)程是系統(tǒng)隨機(jī)生成一個(gè)棋局,然后玩家需要在空白處填上 相應(yīng)的數(shù)字使其滿足游戲規(guī)則。游戲框架如下圖所示: 點(diǎn)擊圖標(biāo) 開機(jī)動(dòng)畫 計(jì)時(shí)區(qū)域 提示暫停 游戲區(qū)域 退出游戲 功能區(qū)域 開始游戲 菜單界面 幫助游戲關(guān)于游戲 退出換題 圖3.1 游戲框架圖 該游戲的運(yùn)行步驟如下。 1.啟動(dòng)游戲后首先進(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)入“幫助”界面,在“幫助”界 第三章 數(shù)獨(dú)游戲的設(shè)計(jì) 14 面介紹了游戲的基本規(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)一個(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.2 游戲策劃以及準(zhǔn)備工作游戲策劃以及準(zhǔn)備工作 3.2.1歡迎界面的策劃 歡迎界面的主要實(shí)現(xiàn)的是開機(jī)動(dòng)畫以及菜單選項(xiàng)的功能。在開機(jī)動(dòng)畫上準(zhǔn) 備實(shí)現(xiàn)動(dòng)態(tài)效果,利用圖片刷幀進(jìn)行實(shí)現(xiàn)。 在菜單界面實(shí)現(xiàn)游戲的功能選擇,菜單界面就是一張圖片,鼠標(biāo)點(diǎn)擊相應(yīng) 的區(qū)域?qū)崿F(xiàn)相應(yīng)的功能。在這里運(yùn)用到坐標(biāo)系,如下圖所示 南京工業(yè)大學(xué)本科生畢業(yè)設(shè)計(jì)(論文) 15 圖3.2 菜單界面 手機(jī)屏幕分辨率是480320,所以橫縱坐標(biāo)如圖所示。 當(dāng)點(diǎn)擊的區(qū)域坐落于60welcomeView.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)將歡迎界面的 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)效果。 4.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) super(activity); this.activity = activity;/得到activity的引用 surfaceHolder = this.getHolder();/獲得surfaceHolder getHolder().addCallback(this);/添加Callback接口的實(shí)現(xiàn) helpBitmap = BitmapFactory.decodeResource(getResources(), 南京工業(yè)大學(xué)本科生畢業(yè)設(shè)計(jì)(論文) 23 R.drawable.help); public void onDraw(Canvas canvas) /繪制方法 canvas.drawColor(Color.WHITE);/背景色 canvas.drawBitmap(helpBitmap, 0, 0, null);/繪制圖片 public boolean onTouchEvent(MotionEvent event) /鍵盤監(jiān)聽方法 if(event.getAction() = MotionEvent.ACTION_DOWN)/屏幕被按下 double x = event.getX(); double y = event.getY();/得到坐標(biāo) if(x270 return super.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)擊的是否為返回按鈕即可。當(dāng)玩家點(diǎn)擊返回按鈕時(shí),需要向activity 發(fā)送Handler 消息通知控制器切換屏幕。 4.24.2 游戲界面相關(guān)類的實(shí)現(xiàn)游戲界面相關(guān)類的實(shí)現(xiàn) 游戲界面實(shí)現(xiàn)游戲展示,計(jì)時(shí)界面展示,以及功能按鍵。流程圖如下圖所 示: 第四章 基于 Android 平臺(tái)數(shù)獨(dú)游戲的實(shí)現(xiàn) 24 開始 生成數(shù)獨(dú) 填數(shù)區(qū)域 換題 提示 提示暫停計(jì)時(shí) 暫停填數(shù) 檢測(cè) 退出 結(jié)束 是 否 是 否 是 否 是 否 圖 4.2 游戲界面流程圖 4.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)擊按鈕時(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)用工作。 南京工業(yè)大學(xué)本科生畢業(yè)設(shè)計(jì)(論文) 25 4.2.2 時(shí)間線程 TimeThread 的實(shí)現(xiàn) TimeThread線程主要用來(lái)更新界面中的時(shí)間,作為數(shù)獨(dú)游戲玩家計(jì)時(shí)功能, 代碼如下: public class TimeThread extends Thread GameView gameView;/聲明GameView的引用 boolean flag=true;/循環(huán)標(biāo)志位 public TimeThread(GameView gameView)/構(gòu)造器 this.gameView=gameView;/得到GameView的引用 public void run()/重寫的run方法 while(flag) gameView.time+;/時(shí)間自加 try Thread.sleep(1000);/睡眠一秒種 catch(Exception e)/捕獲異常 e.printStackTrace();/打印異常信息 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)一秒鐘 功能。 4.34.3 數(shù)獨(dú)算法類的實(shí)現(xiàn)數(shù)獨(dú)算法類的實(shí)現(xiàn) 數(shù)獨(dú)算法類主要實(shí)現(xiàn)數(shù)獨(dú)的生成以及填入數(shù)字的檢測(cè)功能,流程圖如下: 第四章 基于 Android 平臺(tái)數(shù)獨(dú)游戲的實(shí)現(xiàn) 26 開始 生成數(shù)獨(dú) 填入數(shù)字 符合規(guī)則 游戲成功 結(jié)束 是 否 圖 4.3 WelcomeView 類功能流程圖 4.3.1 數(shù)獨(dú)算法基本邏輯 本節(jié)將對(duì)數(shù)獨(dú)算法類ShuDuSuanFa.java 進(jìn)行解釋,該類基本上是數(shù)學(xué)計(jì)算, 通過(guò)一定的算法產(chǎn)生所需要的數(shù)獨(dú)數(shù)組,通過(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è)解的話,找到解即停止。 2.需要求出所有解,則需做“樹的遍歷”找到所有解。 回溯法的基本做法是搜索,或是一種組織得井井有條的,能避免不必要搜 索的窮舉式搜索法。這種方法適用于解一些組合數(shù)相當(dāng)大的問(wèn)題。 南京工業(yè)大學(xué)本科生畢業(yè)設(shè)計(jì)(論文) 27 回溯法在問(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)先策略搜索。 回溯法是一種搜索算法,其基本思路是:在一個(gè)問(wèn)題中,根據(jù)題意給出的 邊界條件劃定出所有可能解的范圍(稱為可能解) ,根據(jù)題意確定出約束條件。 利用程序順次在所有可能解中搜索時(shí)按照深度搜索的方式進(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)前層得所有可能解都不滿足約束條件,則回溯 到上一層,拋棄上一層的當(dāng)前可能解。 從以上分析中結(jié)合數(shù)獨(dú)問(wèn)題的規(guī)則,得出數(shù)獨(dú)問(wèn)題的約束條件為: 每一格的數(shù)值范圍僅限 1-9 每一格內(nèi)的數(shù)字在當(dāng)前行不允許重復(fù) 每一格內(nèi)的數(shù)字在當(dāng)前列不允許重復(fù) 每一格內(nèi)的數(shù)字在當(dāng)前小宮格內(nèi)不允許重復(fù) 由此,回溯法通過(guò)約束條件的篩選,在所有解中除掉不可能的解,從而獲 得問(wèn)題的一個(gè)或者全部解。 4.3.2 檢測(cè)填充結(jié)果 根據(jù)數(shù)獨(dú)游戲的規(guī)則,玩家填充 81 個(gè)宮格之后,要滿足所有行,所有列 和所有小九宮格內(nèi)不能出現(xiàn)重復(fù)的數(shù)字,并以此為條件進(jìn)行檢測(cè)。 第四