Android數(shù)獨(dú)游戲論文正文-畢業(yè)設(shè)計(jì)11_第1頁(yè)
Android數(shù)獨(dú)游戲論文正文-畢業(yè)設(shè)計(jì)11_第2頁(yè)
Android數(shù)獨(dú)游戲論文正文-畢業(yè)設(shè)計(jì)11_第3頁(yè)
Android數(shù)獨(dú)游戲論文正文-畢業(yè)設(shè)計(jì)11_第4頁(yè)
Android數(shù)獨(dú)游戲論文正文-畢業(yè)設(shè)計(jì)11_第5頁(yè)
已閱讀5頁(yè),還剩45頁(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)介

畢業(yè)設(shè)計(jì)(論文)原創(chuàng)性聲明本人鄭重聲明:所提交的畢業(yè)設(shè)計(jì)(論文),是本人在導(dǎo)師指導(dǎo)下,獨(dú)立進(jìn)行研究工作所取得的成果。除文中已注明引用的內(nèi)容外,本畢業(yè)設(shè)計(jì)(論文)不包含任何其他個(gè)人或集體已經(jīng)發(fā)表或撰寫過(guò)的作品成果。對(duì)本研究做出過(guò)重要貢獻(xiàn)的個(gè)人和集體,均已在文中以明確方式標(biāo)明并表示了謝意。論文作者簽名:日期:年月日摘要隨著手機(jī)行業(yè)發(fā)展蓬勃迅速,尤其是以Android系統(tǒng)為例,越來(lái)越多的手機(jī)搭載了Android智能系統(tǒng),該系統(tǒng)是以Linux為基礎(chǔ)的開放源代碼操作系統(tǒng),其開放性、不受運(yùn)營(yíng)商限制、豐富的硬件支持、良好的擴(kuò)展性,受到了外界良好評(píng)價(jià)與使用支持。Android的系統(tǒng)架構(gòu)分為三個(gè)部分:應(yīng)用部分,核心部分,底層部分。除了上述劃分方式以外,從系統(tǒng)實(shí)際的架構(gòu)模型來(lái)看,Android則可以分成以下幾個(gè)層次:①應(yīng)用層②框架層③運(yùn)行時(shí)④核心類庫(kù)⑤硬件抽象層⑥Linux內(nèi)核。本文主要闡述了以面向?qū)ο蟮某绦蜷_發(fā)語(yǔ)言Java,以eclipse為開發(fā)工具,基于Android系統(tǒng)開發(fā)一款數(shù)獨(dú)游戲。數(shù)獨(dú)是一種運(yùn)用紙、筆進(jìn)行演算的邏輯游戲。玩家需要根據(jù)9×9盤面上的已知數(shù)字,推理出所有剩余空格的數(shù)字,并滿足每一行、每一列、每一個(gè)粗線宮內(nèi)的數(shù)字均含1-9,不重復(fù)。每一道合格的數(shù)獨(dú)謎題都有且僅有一個(gè)唯一答案,推理方法也以此為基礎(chǔ),任何無(wú)解或者多解的題目都是不合格的。本程序?qū)崿F(xiàn)了難度選擇功能,計(jì)時(shí)功能,成績(jī)保存,重來(lái)功能等。關(guān)鍵詞:Android;手機(jī)游戲;數(shù)獨(dú)ABSTRACTWiththedevelopmentofmobilephoneindustryboomingrapidly,especiallyintheAndroidsystem,forexample,agrowingnumberofmobilephonewithAndroidintelligentsystem,thissystemisbasedontheLinuxopensourceoperatingsystem,itsopenness,withoutbeinglimitedbytheoperators,richhardwaresupport,goodexpansibility,goodevaluationandusethesupportbytheoutsideworld.Androidsystemarchitectureisdividedintothreeparts:thepart,thecorepart,thebottompart.Inadditiontotheclassifiedmethods,fromthepointofthearchitectureofthesystemmodel,theAndroidcanbedividedintothefollowingseverallevels:(1)theapplicationlayer(2)frameworklayer(3)theruntime(4)coreclasslibraries(5)hardwareabstractionlayer(6)Linuxkernel.Thisarticlemainlyelaboratedinanobject-orientedprogramminglanguageJava,eclipseasthedevelopmenttool,developedasudokugamebasedonAndroidsystem.Sudokuisakindofusepaperandpenciltocalculuslogicgame.Playersneedtoaccordingto9x9knownfiguresonthedisksurface,reasoningoutalltherestofthespace,andsatisfyeachrow,everycolumn,everyhouseNumbersarethicklinewith1-9,don'trepeat.Everyqualifiedsudokupuzzlehasonlyoneandonlyoneanswer,reasoningmethodsandonthisbasis,thetopicofanykindofsolutionorsolutionisnotqualified.Thisprocedurerealizethefunctionofdifficultchoice,timingfunctions,performancepreservation,tofunction,etc.Keywords:Android;Mobilephonegames;Sudoku目錄TOC\o"1-3"\u第一章緒論 11.1游戲背景 11.2游戲簡(jiǎn)介 11.2.1數(shù)獨(dú)題目的數(shù)量 11.2.2數(shù)獨(dú)題目的最少組成 11.3手機(jī)游戲特征 21.4國(guó)內(nèi)外研究現(xiàn)狀 3本章小結(jié) 3第二章技術(shù)介紹 42.1Android簡(jiǎn)介 42.2Android平臺(tái)架構(gòu)與特征 42.2.1Android平臺(tái)特征 42.2.2Android平臺(tái)架構(gòu) 52.3Android應(yīng)用程序組件 7本章小結(jié) 8第三章系統(tǒng)分析與設(shè)計(jì) 93.1系統(tǒng)需求分析 93.1.1功能需求分析 93.1.2安全性需求分析 93.2系統(tǒng)的結(jié)構(gòu)設(shè)計(jì) 9本章小結(jié) 10第四章基于Android平臺(tái)數(shù)獨(dú)游戲的實(shí)現(xiàn) 114.1Android開發(fā)環(huán)境介紹 114.2Android開發(fā)平臺(tái)搭建步驟 114.3系統(tǒng)的主要功能 124.2游戲中主要類的簡(jiǎn)要介紹 144.2.1難易度選擇界面相關(guān)類 144.2.2數(shù)獨(dú)列表界面相關(guān)類 144.2.3游戲界面相關(guān)類 144.3游戲中主要功能詳解 154.3.1選擇難易度界面 154.3.2關(guān)卡選擇界面 174.3.3正式游戲界面 234.4數(shù)獨(dú)數(shù)據(jù)庫(kù)存儲(chǔ) 274.4.1數(shù)據(jù)庫(kù)代碼 274.4.2數(shù)據(jù)庫(kù)關(guān)系E-R圖 284.4.3游戲的數(shù)據(jù)檢測(cè) 29本章小結(jié) 29第五章游戲的測(cè)試和運(yùn)行 305.1游戲測(cè)試概述 305.2測(cè)試環(huán)境 315.3游戲運(yùn)行結(jié)果 31本章小結(jié) 33第六章總結(jié)和展望 346.1總結(jié) 346.2展望 34結(jié)束語(yǔ) 35致謝 36參考文獻(xiàn) 37附錄第一章緒論1.1游戲背景“九宮格”一詞想必大家并不陌生,它作為數(shù)獨(dú)的前身,最早起源于中國(guó)。但九宮格游戲較為復(fù)雜,需要從縱向、橫向、斜向三個(gè)方向的數(shù)字之和全部等于15,不適合現(xiàn)在快節(jié)奏的生活,所以人們對(duì)經(jīng)典的九宮格游戲進(jìn)行了改良,形成了數(shù)獨(dú)游戲。洛書河圖是我國(guó)目前已發(fā)現(xiàn)的最早的九宮格游戲記載,到了18世紀(jì)末,瑞士數(shù)學(xué)家萊昂哈德?歐文又發(fā)明了一種叫做“拉丁方塊”的游戲,之后不久,美國(guó)的一家雜志機(jī)構(gòu)也刊登了類似的游戲,從此這個(gè)游戲受到了更多的歡迎,之后日本市場(chǎng)也引進(jìn)了這個(gè)游戲,并進(jìn)行廣泛的傳播[1]。2004年,在英國(guó)《泰晤士報(bào)》上,第一個(gè)“數(shù)獨(dú)”游戲被刊登在此報(bào)上,從那時(shí)起數(shù)獨(dú)游戲才真正為世界所知曉,并且很快風(fēng)靡全球。其原因得益于此類游戲操作簡(jiǎn)單,不需要進(jìn)行復(fù)雜的數(shù)字運(yùn)算且可玩性高、鍛煉思維、開發(fā)大腦,也不需要特定的語(yǔ)言基礎(chǔ)。1.2游戲簡(jiǎn)介1.2.1數(shù)獨(dú)題目的數(shù)量到底有多少個(gè)9×9的拉丁方陣呢?答案是:5524751496156892842531225600個(gè)。但是由于數(shù)獨(dú)的規(guī)則是每行、每列、每個(gè)小九宮格都是要1到9之間的不同數(shù)字,這與拉丁方陣有很大不同,所以數(shù)獨(dú)的謎題要比拉丁方陣少很多。直到2005年底,數(shù)學(xué)家貝米耳(StanleyE.Bammel)與羅思坦(JeromeRothstein)才算出一共有6670903752021072936960種可能的數(shù)獨(dú)謎題[2]。為了慶賀這一結(jié)果,這兩個(gè)數(shù)學(xué)家專門寫了一份研究報(bào)告。但是在同一個(gè)數(shù)獨(dú)中,數(shù)獨(dú)是可以變換的,像行交換、列交換,還有可能是代碼交換(比如1和8交換、2和5、3和6……)。若進(jìn)行上述變換,用不了幾次就很難分清是否來(lái)自同一數(shù)獨(dú)了。為了解決這一難題,西澳大利亞大學(xué)教授GordonRoyle博士利用圖形理論,研究出了辨別數(shù)獨(dú)變換的方法。他將數(shù)獨(dú)謎題利用Nauty程序圖形的轉(zhuǎn)化來(lái)做比對(duì),該研究結(jié)果把利用這一方法將宮格內(nèi)的行交換、列交換、代碼交換等變換方法產(chǎn)生的等價(jià)題都扣除,最后計(jì)算出本質(zhì)上共有5472730538個(gè)不同的數(shù)獨(dú)謎題。此結(jié)果表明數(shù)獨(dú)謎題的數(shù)量之大,若全球每天通過(guò)互聯(lián)網(wǎng)和報(bào)紙刊登10000個(gè)本質(zhì)上不同的數(shù)獨(dú)謎題,仍需要花上一萬(wàn)多年才能全部羅列完這接近55億的數(shù)獨(dú)謎題。1.2.2數(shù)獨(dú)題目的最少組成好的數(shù)獨(dú)題目要求已知的數(shù)字是點(diǎn)對(duì)稱的,而且謎題要有唯一解甚至已知的數(shù)字越少越好。目前最好的紀(jì)錄是給定18個(gè)數(shù)字就可以產(chǎn)生出唯一解的數(shù)獨(dú)謎題。如果放寬條件到不需要點(diǎn)對(duì)稱,那么最少可以給定的數(shù)字是17個(gè)。許多玩家和學(xué)者對(duì)數(shù)獨(dú)游戲癡迷不已,當(dāng)然也包括很多計(jì)算機(jī)程序人員,他們?cè)诰W(wǎng)上提供了眾多免費(fèi)下載的數(shù)獨(dú)謎題程序。例如,才華橫溢的數(shù)學(xué)家和組合學(xué)家Zeilberger曾寫了一個(gè)在Maple上跑的程序供大家解出數(shù)獨(dú)謎題[3],可以發(fā)現(xiàn),難度高的題目不一定給出較少的數(shù)字,有時(shí)候提供的數(shù)字很多但仍然難度很高。反之,提供的數(shù)字少也許反而比較容易解題。也就是說(shuō),謎題的難易程度與提供的數(shù)字多少不是絕對(duì)相關(guān)的,謎題的難易程度和設(shè)計(jì)者的邏輯思維模式有關(guān)[4]。1.3手機(jī)游戲特征1.易于學(xué)習(xí):既然手機(jī)游戲面向的是普通消費(fèi)者而不是計(jì)算機(jī)專家,那么他們不可能深入的學(xué)習(xí)游戲技巧。因此手機(jī)游戲的控制應(yīng)當(dāng)盡量簡(jiǎn)單,且易于學(xué)習(xí)。即便游戲計(jì)劃的控制方式要求很多很復(fù)雜,開發(fā)商也應(yīng)當(dāng)考慮將其簡(jiǎn)化。與主機(jī)控制器相比,手機(jī)和平板電腦的按鍵和控制選項(xiàng)更少,這意味著手機(jī)游戲開發(fā)商需要進(jìn)行創(chuàng)新。許多成功游戲的控制都很簡(jiǎn)單。比如流行游戲《翼飛沖天》需要的玩家輸入便很簡(jiǎn)單,點(diǎn)擊屏幕可以使下坡加速,在上坡的時(shí)候放開即可[5]。2.可中斷性:多任務(wù)處理是手機(jī)生活方式的基本特征。在手機(jī)設(shè)備上,接到電話會(huì)導(dǎo)致游戲馬上退出,所以在游戲中采用智能中斷設(shè)置是必要之舉。如果用戶在接完電話后發(fā)現(xiàn)自己剛才的游戲狀態(tài)已消失,那么自然不會(huì)對(duì)游戲產(chǎn)生良好的印象。將來(lái)用戶再玩該游戲的可能性也會(huì)減小,因?yàn)閾?dān)心再接到電話導(dǎo)致他們前功盡棄。所以一個(gè)好的手機(jī)游戲應(yīng)該提供短時(shí)間的娛樂(lè)功能,并且允許用戶在游戲與工作模式之間順利切換。3.基于訂閱:手機(jī)游戲的盈利成功取決于他們巨大的使用量。一開始開發(fā)與設(shè)計(jì)每個(gè)游戲都是昂貴的。如果一個(gè)手機(jī)游戲開發(fā)者要贏利的話,重要的是消耗一個(gè)游戲引擎,多個(gè)標(biāo)題,基本的故事情節(jié)類似?;谟嗛喌挠螒蚴遣粩喈a(chǎn)生收入的最好方法。4.豐富的社會(huì)交互:不管一個(gè)游戲設(shè)計(jì)得多好,只要玩家找到了它的根本模式或者玩完了所有的游戲路徑很快就會(huì)厭煩這個(gè)游戲。對(duì)于一個(gè)基于訂閱的游戲,重要的是與別的玩家合作以增強(qiáng)所玩游戲的智力與隨機(jī)性。在今天紛繁復(fù)雜的多玩家游戲中具有豐富社會(huì)交互的游戲證明是成功的。5.好的網(wǎng)絡(luò)基礎(chǔ)設(shè)備:巨額的手機(jī)技術(shù)研發(fā)費(fèi)用都花在提高設(shè)備與網(wǎng)絡(luò)的可用性與可靠性上面。因此,手機(jī)設(shè)備硬件與網(wǎng)絡(luò)協(xié)議與桌面/控制臺(tái)世界(如全球定位系統(tǒng)(GPS)擴(kuò)展、條形碼掃描儀、與短消息服務(wù)(SMS)/多媒體信息服務(wù)(MMS)通訊)有著非常大的差別。好的手機(jī)游戲應(yīng)該利用那些更新的設(shè)備特征與網(wǎng)絡(luò)基礎(chǔ)設(shè)備的優(yōu)點(diǎn)。6.有效利用屏幕實(shí)用面積:任何屏幕上的使用面積都是有限的,開發(fā)商必須考慮到這一點(diǎn)。比如玩《僵尸時(shí)代》需要用你的拇指控制兩個(gè)屏幕上的“虛擬操縱桿”。這需要占據(jù)大片屏幕實(shí)用面積,使游戲玩起來(lái)較為困難。平板電腦有著更大的實(shí)用面積,但依然會(huì)出現(xiàn)上述問(wèn)題。如果用平板電腦來(lái)玩《僵尸時(shí)代》,操縱桿依然很難使用,觸控精確性有一定的問(wèn)題,因?yàn)橄啾仁謾C(jī)來(lái)說(shuō)兩個(gè)操縱桿相隔更遠(yuǎn)。7.功能反饋:由于缺乏按動(dòng)按鍵或震動(dòng)等觸覺(jué)反饋,手機(jī)游戲必須使用不同的方式來(lái)告知用戶他們的動(dòng)作已經(jīng)被游戲接受,它們應(yīng)當(dāng)在屏幕上提供不顯眼卻能夠傳達(dá)信息的反饋。比如,在手游《無(wú)盡之劍》中會(huì)高亮玩家按動(dòng)的屏幕按鍵[6],并在屏幕上呈現(xiàn)相關(guān)文本。這些信號(hào)立馬便可以告知玩家攻擊或格擋是否成功。同樣,當(dāng)受到傷害時(shí),所受傷害數(shù)值也會(huì)顯示在屏幕上,同時(shí)生命值扣除相應(yīng)數(shù)值。1.4國(guó)內(nèi)外研究現(xiàn)狀A(yù)ndroid操作系統(tǒng)是基于Linux平臺(tái)的開發(fā)的手機(jī)操作系統(tǒng),他是由著名的互聯(lián)網(wǎng)公司Google公司進(jìn)行開發(fā)的。Android操作系統(tǒng)包括用戶界面、手機(jī)操作系統(tǒng)和手機(jī)應(yīng)用程序等移動(dòng)設(shè)備所需要的所有軟件能夠保證正常的使用,而且Android操作系統(tǒng)不存在和以前手機(jī)操作系統(tǒng)上的阻礙移動(dòng)通信設(shè)備上所需創(chuàng)新的所有權(quán)障礙,因?yàn)樗且粋€(gè)開源的手機(jī)操作系統(tǒng)。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è)組成[7]。Google通過(guò)與運(yùn)營(yíng)商、設(shè)備制造商、開發(fā)商和其他相關(guān)各方結(jié)成深層次的合作伙伴關(guān)系,希望借助建立標(biāo)準(zhǔn)化、開放式的移動(dòng)設(shè)備軟件平臺(tái),在移動(dòng)產(chǎn)業(yè)內(nèi)形成一個(gè)開放式的生態(tài)系統(tǒng)。

Androind操作系統(tǒng)作為谷歌企業(yè)戰(zhàn)略的重要組成部分,將進(jìn)一步推進(jìn)“隨時(shí)隨地為每個(gè)人提供信息”這一企業(yè)目標(biāo)的實(shí)現(xiàn)。Android手機(jī)操作系統(tǒng)將作為Google擴(kuò)展移動(dòng)設(shè)備市場(chǎng)的一個(gè)奠基石,而后為Google應(yīng)用的推廣起到了良好的作用。但Android操作系統(tǒng)不會(huì)替代谷歌長(zhǎng)期以來(lái)奉行的移動(dòng)發(fā)展策略:通過(guò)與全球各地的手機(jī)制造商和運(yùn)營(yíng)商結(jié)成合作伙伴,開發(fā)既有用又有吸引力的移動(dòng)服務(wù),并推廣這些產(chǎn)品[8]。本章小結(jié)本章介紹了數(shù)獨(dú)游戲的起源、數(shù)獨(dú)游戲玩法和規(guī)則,手機(jī)游戲的特征,以與Android系統(tǒng)的國(guó)內(nèi)外現(xiàn)狀,希望能讓大家對(duì)數(shù)獨(dú)有更深入的了解。第二章技術(shù)介紹2.1Android簡(jiǎn)介Android(安卓),是一個(gè)以Linux為基礎(chǔ)的開源移動(dòng)設(shè)備操作系統(tǒng),主要用于智能手機(jī)和平板電腦,由Google成立的OpenHandsetAlliance(OHA,開放手持設(shè)備聯(lián)盟)持續(xù)領(lǐng)導(dǎo)與開發(fā)中。Android已發(fā)布的最新版本為Android5.0(Lollipop)。Android系統(tǒng)最初由安迪·魯賓(AndyRubin)等人開發(fā)制作[9],最初開發(fā)這個(gè)系統(tǒng)的目的是創(chuàng)建一個(gè)數(shù)碼相機(jī)的先進(jìn)操作系統(tǒng);但是后來(lái)發(fā)現(xiàn)市場(chǎng)需求不夠大,加上智能手機(jī)市場(chǎng)快速成長(zhǎng),于是Android被改造為一款面向智能手機(jī)的操作系統(tǒng)。於2005年8月被美國(guó)科技企業(yè)Google收購(gòu)。2007年11月,Google與84家制造商、開發(fā)商與電信營(yíng)運(yùn)商成立開放手持設(shè)備聯(lián)盟來(lái)共同研發(fā)改良Android系統(tǒng),隨后,Google以Apache免費(fèi)開放原始碼許可證的授權(quán)方式,發(fā)布了Android的原碼,讓生產(chǎn)商推出搭載Android的智能手機(jī),Android后來(lái)更逐漸拓展到平板電腦與其他領(lǐng)域上。2010年末數(shù)據(jù)顯示,僅正式推出兩年的Android作業(yè)系統(tǒng)在市場(chǎng)占有率上已經(jīng)超越稱霸逾十年的諾基亞Symbian系統(tǒng),成為全球第一大智能手機(jī)操作系統(tǒng)[10]。2.2Android平臺(tái)架構(gòu)與特征2.2.1Android平臺(tái)特征隨著科技的發(fā)展,移動(dòng)電話(MobilePhone)正朝著智能化的方向發(fā)展,逐步成為多種工具的功能載體,而Android就是這樣一個(gè)智能手機(jī)的平臺(tái)、一個(gè)多種工具的功能載體。通信工具移動(dòng)電話的最基本功能為通信功能,因此使用運(yùn)營(yíng)商提供的通信網(wǎng)絡(luò)進(jìn)行語(yǔ)音通話也是Android平臺(tái)的最基本功能。除了傳統(tǒng)的語(yǔ)音通話功能外,Android平臺(tái)還具有短消息功能,以與通常移動(dòng)電話都具有的個(gè)人信息系統(tǒng)管理方面的功能(如電話本等)。2.網(wǎng)絡(luò)工具隨著數(shù)字業(yè)務(wù)使用的普遍化,移動(dòng)電話通常被作為網(wǎng)絡(luò)工具使用,即移動(dòng)電話可以完成電腦的部分功能。而Android平臺(tái)在網(wǎng)絡(luò)方面的功能主要包括瀏覽器、IM(即時(shí)信息)、郵件等。3.媒體播放器隨著多媒體技術(shù)的發(fā)展應(yīng)用,在移動(dòng)電話上進(jìn)行音頻和視頻播放已經(jīng)成為經(jīng)常使用的功能。由此,Android平臺(tái)具有支持更多的音頻/視頻格式,支持更高分辨率的視頻,可更流暢地播放視頻,以與支持網(wǎng)絡(luò)流媒體等功能。4.媒體獲取設(shè)備隨著移動(dòng)電話與媒體獲取設(shè)備的集成日益增強(qiáng),Android平臺(tái)提供了照相機(jī)、錄音機(jī)、攝像機(jī)等功能。5.多類型的連接設(shè)備Android平臺(tái)提供了多種連接方式,如USB、GPS、紅外、藍(lán)牙、無(wú)線局域網(wǎng)等。6.具有友好和絢麗的用戶界面Android平臺(tái)具有友好的用戶界面,使用戶容易學(xué)習(xí)和操作;同時(shí)具有絢麗的用戶界面,具有良好的視覺(jué)效果。7.可以個(gè)性化定制的平臺(tái)Android平臺(tái)針對(duì)于用戶的個(gè)性化需求,提供了全面自定義手機(jī)的功能。除了上述介紹的Android平臺(tái)的功能以外,其在技術(shù)上還具有以下幾個(gè)方面的特性:全開放智能移動(dòng)電話平臺(tái);支持多硬件平臺(tái);使用眾多的標(biāo)準(zhǔn)化技術(shù);核心技術(shù)完整、統(tǒng)一;完善的SDK和文檔;完善的輔助開發(fā)工具。2.2.2Android平臺(tái)架構(gòu)從圖2.1我們可以看出,Android操作系統(tǒng)的體系結(jié)構(gòu)可分為4層,由上到下依次是應(yīng)用程序、應(yīng)用程序框架、核心類庫(kù)和Linux內(nèi)核,其中第三層還包括Android運(yùn)行時(shí)的環(huán)境。下面分別來(lái)講解各個(gè)部分。圖2.1Android操作系統(tǒng)體系結(jié)構(gòu)1.程序應(yīng)用Android連同一個(gè)核心應(yīng)用程序包一起發(fā)布,該應(yīng)用程序包包括E-mail客戶端、SMS短消息程序、日歷、地圖、瀏覽器、聯(lián)系人管理程序等。所有的應(yīng)用程序都是用Java編寫的[11]。2.應(yīng)用程序框架開發(fā)者完全可以訪問(wèn)核心應(yīng)用程序所使用的API框架。該應(yīng)用程序框架架構(gòu)用來(lái)簡(jiǎn)化組件軟件的重用,任何一個(gè)應(yīng)用程序都可以發(fā)布它的功能塊并且任何其他的應(yīng)用程序都可以使用其所發(fā)布的功能塊(不過(guò)得遵循框架的安全性限制)。該應(yīng)用程序重用機(jī)制使得組件可以被用戶替換。以下所有的應(yīng)用程序都由一系列的服務(wù)和系統(tǒng)組成,包括:(1)一個(gè)可擴(kuò)展的視圖(Views)可以用來(lái)創(chuàng)建應(yīng)用程序,包括列表(lists)、網(wǎng)絡(luò)(grids)、文本框(textboxes)、按鈕(buttons),甚至是一個(gè)可嵌入的Web瀏覽器。(2)內(nèi)容管理器(ContentProviders)使得應(yīng)用程序可以訪問(wèn)另一個(gè)應(yīng)用程序的數(shù)據(jù)(如聯(lián)系人數(shù)據(jù)庫(kù)),或者共享它們自己的數(shù)據(jù)。(3)一個(gè)資源管理器(ResourceManager)提供非代碼資源的訪問(wèn),如本地字符串、圖形和分層文件(layoutfiles)。(4)一個(gè)通知管理器(NotificationManager)使得應(yīng)用程序可以在狀態(tài)欄中顯示客戶通知信息。(5)一個(gè)活動(dòng)類管理器(ActivityManager)用來(lái)管理應(yīng)用程序生命周期并提供常用的導(dǎo)航回退功能。3.Android程序庫(kù)Android包括一個(gè)被Android系統(tǒng)中各種不同組件所使用的C/C++集庫(kù)。該庫(kù)通過(guò)Android應(yīng)用程序框架為開發(fā)者提供服務(wù)。以下是一些主要的核心庫(kù)[12]:(1)系統(tǒng)C庫(kù):一個(gè)從BSD繼承來(lái)的標(biāo)準(zhǔn)C系統(tǒng)函數(shù)庫(kù)(libc),專門為基于EmbeddedLinux的設(shè)備定制。(2)媒體庫(kù):基于PacketVideoOpenCORE;該庫(kù)支持錄放,并且可以錄制許多流行的音頻視頻格式,還有靜態(tài)映像文件包括MPEG4、H.264、MP3、AAC、JPG、PNG。(3)SurfaceManager:對(duì)顯示子系統(tǒng)的管理,并且為多個(gè)應(yīng)用程序提供2D和3D圖層的無(wú)縫融合。(4)LibWebCore:一個(gè)最新的Web瀏覽器引擎,用來(lái)支持Android瀏覽器和一個(gè)可嵌入的Web視圖。(5)SGL:一個(gè)內(nèi)置的2D圖形引擎。(6)3Dlibraries:基于OpenGLES1.0APIs實(shí)現(xiàn);該庫(kù)可以使用硬件3D加速(如果可用)或者使用高度優(yōu)化的3D軟加速。(7)FreeType:位圖(bitmap)和向量(vector)字體顯示。(8)SQLite:一個(gè)對(duì)于所以應(yīng)用程序可用、功能強(qiáng)勁的輕型關(guān)系型數(shù)據(jù)庫(kù)引擎。4.Android運(yùn)行庫(kù)Android包括了一個(gè)核心庫(kù),該核心庫(kù)提供了Java編程語(yǔ)言核心庫(kù)的大多數(shù)功能。每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行,都擁有一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例。Dalvik是針對(duì)同時(shí)高效地運(yùn)行多個(gè)VMs實(shí)現(xiàn)的。Dalvik虛擬機(jī)執(zhí)行.dex的Dalvik可執(zhí)行文件,該格式文件針對(duì)最小內(nèi)存使用做了優(yōu)化。該虛擬機(jī)是基于寄存器的,所有的類都是經(jīng)由Java匯編器編譯,然后通過(guò)SDK中的DX工具轉(zhuǎn)化成.dex格式由虛擬機(jī)執(zhí)行[13]。Dalvik虛擬機(jī)依賴于Linux的一些功能,比如線程機(jī)制和底層內(nèi)存管理機(jī)制。5.Linux內(nèi)核Android的核心系統(tǒng)服務(wù)依賴于Linux內(nèi)核,如安全性、內(nèi)存管理、進(jìn)程管理、網(wǎng)絡(luò)協(xié)議棧和驅(qū)動(dòng)模型[14]。Linux內(nèi)核也同時(shí)作為硬件和軟件棧之間的硬件抽象層。2.3Android應(yīng)用程序組件應(yīng)用程序組件是Android應(yīng)用程序的基本構(gòu)建單元。每個(gè)組件是系統(tǒng)進(jìn)入你的應(yīng)用程序的不同入口點(diǎn)。不是所有的組件對(duì)于用戶都是實(shí)際上的入口點(diǎn),有些是互相依賴的,但是每個(gè)組件都有特定的作用——每個(gè)都是唯一的構(gòu)建單元,這些構(gòu)建單元定義你應(yīng)用程序的全部行為這里有6個(gè)組件,它們是Android應(yīng)用程序的基石[15]:(1)Activities(活動(dòng))應(yīng)用程序的顯示層。每一個(gè)畫面對(duì)應(yīng)于你的應(yīng)用程序,將會(huì)是Activity類的擴(kuò)展。Activity使用Views去構(gòu)建UI來(lái)顯示信息和響應(yīng)用戶的行為。就桌面開發(fā)而言,一個(gè)Activity相當(dāng)于一張F(tuán)orm。(2)Services(服務(wù))應(yīng)用程序中不可見的“工人”。Service組件運(yùn)行時(shí)不可見,但它負(fù)責(zé)更新的數(shù)據(jù)源和可見的Activity,以與觸發(fā)通知。它們常用來(lái)執(zhí)行一些需要持續(xù)運(yùn)行的處理,當(dāng)你的Activity已經(jīng)不處于激活狀態(tài)或不可見。(3)Content(內(nèi)容)提供共享的數(shù)據(jù)存儲(chǔ)。ContentProvider(內(nèi)容提供器)用來(lái)管理和共享應(yīng)用程序的數(shù)據(jù)庫(kù)。在應(yīng)用程序間,ContentProvider是共享數(shù)據(jù)的首選方式。這意味著,你可以配置自己的ContentProvider去存取其他的應(yīng)用程序或者通過(guò)其他應(yīng)用程序暴露的ContentProvider去存取它們的數(shù)據(jù)。Android設(shè)備本身包含了幾個(gè)ContentProvider來(lái)訪問(wèn)像聯(lián)系人信息等有用的數(shù)據(jù)庫(kù)。(4)Intents(意圖)簡(jiǎn)單的消息傳遞框架。使用Intent,你可以在整個(gè)系統(tǒng)內(nèi)廣播消息或者給特定的Activity或者服務(wù)來(lái)執(zhí)行你的行為意圖。系統(tǒng)會(huì)決定那個(gè)(些)目標(biāo)來(lái)執(zhí)行適當(dāng)?shù)男袨椤?5)BroadcastReceivers(廣播接收器)Intent廣播的“消費(fèi)者”。通過(guò)創(chuàng)建和注冊(cè)一個(gè)BroadcastReceiver,應(yīng)用程序可以監(jiān)聽符合特定條件的廣播的Intent。BroadcastReceiver會(huì)自動(dòng)的啟動(dòng)你的應(yīng)用程序去響應(yīng)新來(lái)的Intent。BroadcastReceiver是事件驅(qū)動(dòng)程序的理想手段。(6)Notifications(通知)用戶通知的框架。Notification用來(lái)在不需要焦點(diǎn)或不中斷它們當(dāng)前Activity的情況下提示用戶。它們是Service或BroadcastReceiver獲得用戶注意的首選方式。例如,當(dāng)設(shè)備收到文本信息或外部來(lái)電時(shí),它通過(guò)閃光,發(fā)聲,顯示圖標(biāo)或顯示對(duì)話框信息來(lái)提醒你。本章小結(jié)本章主要講述了開發(fā)基于Android系統(tǒng)的數(shù)獨(dú)游戲的技術(shù)做了一些概述,通過(guò)本章的內(nèi)容我們要了解Android的簡(jiǎn)介,Android平臺(tái)的特征、架構(gòu)、以與Android平臺(tái)應(yīng)用程序組件。第三章系統(tǒng)分析與設(shè)計(jì)3.1系統(tǒng)需求分析需求分析完成的好壞直接影響后續(xù)軟件開發(fā)的質(zhì)量,它的重要性由此可見一斑?,F(xiàn)實(shí)情況往往是,用戶不了解計(jì)算機(jī)的相關(guān)知識(shí),而開發(fā)人員也對(duì)相關(guān)業(yè)務(wù)領(lǐng)域不甚了解。受思維定式的影響,用戶和開發(fā)人員往往對(duì)同一問(wèn)題有不同的理解,這樣就對(duì)系統(tǒng)的功能確定帶來(lái)了很大的麻煩。所以,開發(fā)人員和用戶之間要進(jìn)行充分和有效的溝通,甚至開發(fā)人員要置身于相關(guān)的業(yè)務(wù)領(lǐng)域,以確保開發(fā)出來(lái)的系統(tǒng)能夠真正滿足用戶的需要[16]。3.1.1功能需求分析此次程序設(shè)計(jì)任務(wù)是Android平臺(tái)下的數(shù)獨(dú)游戲設(shè)計(jì),程序?qū)⒃贏ndroid模擬器中運(yùn)行調(diào)試。此次程序設(shè)計(jì)用戶界面要求較為友好,由于針對(duì)的用戶為Android智能手機(jī)用戶,因此程序的操作非常簡(jiǎn)單容易操作。游戲進(jìn)行時(shí)通過(guò)底部鍵盤中的數(shù)字鍵輸入答案,程序中儲(chǔ)存了90個(gè)分三個(gè)難度的數(shù)獨(dú)題目,供用戶娛樂(lè),此次程序設(shè)計(jì)的操作系統(tǒng)要求為Windows7,且此次程序設(shè)計(jì)需要在Eclipse環(huán)境下開發(fā)。1.重來(lái)功能重來(lái)功能主要實(shí)現(xiàn)用戶想要重新開始本謎題。2.選關(guān)功能選關(guān)功能主要實(shí)現(xiàn)用戶可以自主選擇關(guān)卡。3.計(jì)時(shí)功能計(jì)時(shí)功能主要實(shí)現(xiàn)對(duì)用戶解決謎題的計(jì)時(shí)。4.成績(jī)保存功能成績(jī)保存功能主要實(shí)現(xiàn)對(duì)用戶解決本謎題所用時(shí)間的保存。5.難易程度選擇功能難易程度選擇功能主要實(shí)現(xiàn)用戶根據(jù)自己實(shí)際水平選擇適合自己難度的題目。6.退出功能退出功能主要實(shí)現(xiàn)退出游戲。3.1.2安全性需求分析因該游戲不涉與到用戶信息等,因此不需要考慮信息的泄漏。3.2系統(tǒng)的結(jié)構(gòu)設(shè)計(jì)系統(tǒng)結(jié)構(gòu)為進(jìn)入主界面顯示選擇難度界面,在用戶選擇難度之后,進(jìn)入相應(yīng)的關(guān)卡選擇界面,選擇具體關(guān)卡之后,將進(jìn)入正式游戲界面。在正式游戲界面時(shí),系統(tǒng)將會(huì)自動(dòng)計(jì)時(shí),用戶按返回鍵則暫停計(jì)時(shí),并返回關(guān)卡選擇界面,若用戶要重解本謎題,則可以使用菜單選項(xiàng),按Restart鍵即可重新解答本謎題。當(dāng)用戶成功解決本謎題時(shí),系統(tǒng)將會(huì)自動(dòng)停止計(jì)時(shí),并保存用戶解決本謎題所用的時(shí)間(即成績(jī)保存)。本程序中這三個(gè)界面之間都是可以通過(guò)返回鍵互相切換的,具體系統(tǒng)結(jié)構(gòu)圖如圖3.1所示。啟動(dòng)游戲啟動(dòng)游戲選擇難易度游戲主界面選則關(guān)卡重來(lái)功能計(jì)時(shí)功能退出功能圖3.1系統(tǒng)結(jié)構(gòu)圖本章小結(jié)本章對(duì)Android數(shù)獨(dú)游戲做了需求分析,并對(duì)系統(tǒng)結(jié)構(gòu)做了簡(jiǎn)單介紹,可以從下一章中具體看到這些界面與具體的實(shí)現(xiàn)方法和部分代碼。第四章基于Android平臺(tái)數(shù)獨(dú)游戲的實(shí)現(xiàn)4.1Android開發(fā)環(huán)境介紹Android的上層應(yīng)用程序是用Java語(yǔ)言開發(fā),同時(shí)還需要基于Dalvik虛擬機(jī),所以,Google公司推薦使用主流的Java繼承開發(fā)環(huán)境Eclipse[17]。只有Eclipse還不夠,因?yàn)槭鞘褂肑ava語(yǔ)言進(jìn)行開發(fā),還應(yīng)該有由SUN公司提供的JavaSDK(其中包括JRE:JavaRuntimeEnvironment)。此外,Android的應(yīng)用程序開發(fā)和Java開發(fā)有較大區(qū)別的,所以還需要有Google提供的AndroidSDK。同時(shí),還需要在Eclipse安裝ADT,為Android開發(fā)提供開發(fā)工具的升級(jí)或者變更,是Eclipse下開發(fā)工具的升級(jí)下載的工具[18]。 簡(jiǎn)言之,需要以下軟件,才能搭建Android開發(fā)環(huán)境,從而進(jìn)行Android應(yīng)用程序的開發(fā)。(1)JavaSDK(2)Eclipse(3)AndroidSDK(4)ADT4.2Android開發(fā)平臺(tái)搭建步驟1.首先到/downloads/下載Eclipse集成開發(fā)環(huán)境并且解壓,這里推薦下載JavaEE集成版本,可以為平臺(tái)的搭建省下不少工作。接著再去/javase/downloads/index.jsp站點(diǎn)下載SDK后安裝,下載/android/android-sdk-windows-1.5_r1.zipAndroidSDK1.5后解壓。第一步下載工序就結(jié)束了。2.雙擊Eclipse解壓后目錄中的eclipse.exe然后啟動(dòng),選擇Eclipse菜單中的Help->InstallNewSoftware->選項(xiàng)卡上的AvailableSoftware,點(diǎn)擊右側(cè)的“Add”輸入/android/eclipse/后確定,然后在“Workwith”下拉菜單中選擇剛才輸入的網(wǎng)址。過(guò)一會(huì)就會(huì)出現(xiàn)一個(gè)DeveloperTools選項(xiàng),勾上以后點(diǎn)擊Next以后Eclipse會(huì)自動(dòng)網(wǎng)上查找Android開發(fā)工具插件,然后找到AndroidDDMS和AndroidDevelopmentTools,選中這兩個(gè)點(diǎn)擊Finish,Eclipse就會(huì)自動(dòng)下載并安裝Android插件了,最后會(huì)提示重啟Eclipse。3.重啟后選擇Eclipse菜單中的Windows->Preferences在左側(cè)的Android項(xiàng)目中SDKLocation中填入AndroidSDK解壓后的目錄,然后點(diǎn)擊Apply。4.在WindowsXP的系統(tǒng)變量中的path變量中添加一個(gè)值,該值指向解壓后的AndroidSDK目錄下的tools文件夾[19]。4.3系統(tǒng)的主要功能數(shù)獨(dú)游戲的規(guī)則很簡(jiǎn)單,只需在空格處填入1~9的數(shù)字,并保證每個(gè)數(shù)字在每個(gè)九宮格內(nèi)只能出現(xiàn)一次,且每個(gè)數(shù)字在每一行、每一列也只能出現(xiàn)一次[20],然后玩家需要在空白處填上相應(yīng)的數(shù)字使其滿足游戲規(guī)則。該游戲的運(yùn)行步驟如下:?jiǎn)?dòng)游戲后首先進(jìn)入的便是游戲難度選擇界面,效果如圖4.1所示,在難度選擇界面中,用戶可以選擇Easy,Medium,Hard三個(gè)難度等級(jí)。圖4.1難度選擇界面圖4.2關(guān)卡選擇界面當(dāng)用戶隨意選擇一個(gè)難度以后,將進(jìn)入具體關(guān)卡選擇界面,效果如圖4.2所示,在任意難度中都有30個(gè)關(guān)卡。當(dāng)用戶隨意選擇一個(gè)關(guān)卡后,將正式進(jìn)入數(shù)獨(dú)游戲界面,效果如圖4.3所示。在游戲界面,由9×9的九宮格和底部的數(shù)字鍵盤組成。圖4.3數(shù)獨(dú)游戲界面圖4.4返回界面在這里,我們可以看到,在正式游戲界面頂部,有計(jì)時(shí)功能,從玩家打開本謎題時(shí)開始計(jì)時(shí),當(dāng)玩家按返回鍵時(shí),則暫停計(jì)時(shí),并且改變游戲狀態(tài),效果如圖4-4所示。因?yàn)槲覀冄菔镜氖堑诙€(gè)謎題,當(dāng)玩家按返回鍵時(shí),則暫停計(jì)時(shí),第二個(gè)謎題狀態(tài)變?yōu)椋≒laying)。我們知道,當(dāng)玩家已經(jīng)知道一個(gè)謎題的正確解法,但已經(jīng)錯(cuò)誤太多時(shí)候,這時(shí)就需要有重新開始本謎題的功能,在這里我們先隨意填寫幾個(gè)數(shù)字,當(dāng)我們通過(guò)菜單功能按下(Restart)鍵時(shí),本謎題將清除已填數(shù)字,且計(jì)時(shí)也重新開始,效果如圖4.5,4.6所示。圖4.5重新開始按鈕圖4.6重新開始以后的游戲當(dāng)玩家正確填滿謎題之后,將會(huì)彈出對(duì)話框完成對(duì)話框,且計(jì)時(shí)功能暫停,若沒(méi)有正確填寫則不彈出對(duì)話框,計(jì)時(shí)功能也將繼續(xù),直到全部正確填寫完成之后才結(jié)束,效果如圖4.7所示。當(dāng)完成謎題之后,按返回鍵回到關(guān)卡選擇界面,此時(shí),被完成的謎題狀態(tài)改變,且完成的成績(jī)被保存在謎題后面,效果如圖4.8所示。圖4.7正確填寫謎題結(jié)果圖4.8謎題狀態(tài)與成績(jī)保存4.2游戲中主要類的簡(jiǎn)要介紹為了讓讀者更好地理解后面的代碼,下面將對(duì)游戲中的各個(gè)類逐一進(jìn)行簡(jiǎn)要說(shuō)明。關(guān)于這些類的詳細(xì)代碼將在后面的章節(jié)中相繼給出。4.2.1難易度選擇界面相關(guān)類FolderListActivity類該類為選擇難易度界面的實(shí)現(xiàn)類,主要負(fù)責(zé)選擇難易度界面的繪制,是整個(gè)應(yīng)用程序的入口。此類讓activity繼承ListActivity,并且舍棄XML布局文件,全部采用默認(rèn)布局中存在的布局來(lái)布局。此類重寫onCreate()方法,onResume()方法,onWindowFocusChanged()方法,onPause()方法,onDestroy()方法,onSaveInstanceState()方法(保存數(shù)據(jù))等。4.2.2數(shù)獨(dú)列表界面相關(guān)類SudokuListActivity類該類為數(shù)獨(dú)列表(關(guān)卡)界面的實(shí)現(xiàn)類,主要負(fù)責(zé)數(shù)獨(dú)關(guān)卡界面的繪制,此類繼承了ListActivity,同樣舍棄了XML布局文件,全部采用默認(rèn)布局中存在的布局來(lái)布局。4.2.3游戲界面相關(guān)類(1)SudokuPlayActivity類SudokuPlayActivity類是游戲中最主要的一個(gè)類,游戲規(guī)則、游戲模型都包含在此類當(dāng)中。同時(shí)該類還負(fù)責(zé)繪制游戲的畫面、接收玩家的響應(yīng)。(2)Cell類Cell類負(fù)責(zé)9×9九宮格中每一個(gè)小格的操作。(3)數(shù)獨(dú)生成器DatabaseHelper類該類繼承了SQLiteOpenHelper類,為游戲隨機(jī)提供存放數(shù)獨(dú)數(shù)字的二維數(shù)組,該類存儲(chǔ)了本程序所有的謎題數(shù)據(jù)。(4)Timer類該類負(fù)責(zé)對(duì)游戲的計(jì)時(shí)功能。有start()功能,stop()功能,reset()功能,isRunning()功能,getTime等功能。(5)IMNumpad類該類是游戲進(jìn)行時(shí)底部的鍵盤,負(fù)責(zé)輸入數(shù)字。數(shù)字鍵盤主體部分有1-9的數(shù)字,和一個(gè)(C)清除符號(hào)。4.3游戲中主要功能詳解4.3.1選擇難易度界面圖4.9選擇難度界面選擇難度界面主要代碼如下:1.OnCreat()方法負(fù)責(zé)選擇難易度界面的窗口生成,此窗口由三個(gè)ContentView組成。protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.folder_list); ViewgetMorePuzzles=(View)findViewById(R.id.get_more_puzzles); setDefaultKeyMode(DEFAULT_KEYS_SHORTCUT);getListView().setOnCreateContextMenuListener(this); mDatabase=newSudokuDatabase(getApplicationContext()); mCursor=mDatabase.getFolderList(); startManagingCursor(mCursor); SimpleCursorAdapteradapter=newSimpleCursorAdapter(this,R.layout.folder_list_item, mCursor,newString[]{FolderColumns.NAME,FolderColumns._ID}, newint[]{R.,R.id.detail}); mFolderListBinder=newFolderListViewBinder(this); adapter.setViewBinder(mFolderListBinder);setListAdapter(adapter);Changelogchangelog=newChangelog(this);changelog.showOnFirstRun(); }2.onListItemClick()方法負(fù)責(zé)點(diǎn)擊所觸法的功能。比如,當(dāng)玩家點(diǎn)擊Easy難度,將會(huì)進(jìn)入下個(gè)Easy界面關(guān)卡中。protectedvoidonListItemClick(ListViewl,Viewv,intposition,longid){ Intenti=newIntent(this,SudokuListActivity.class); i.putExtra(SudokuListActivity.EXTRA_FOLDER_ID,id); startActivity(i); }3.自定義類FolderListViewBinder來(lái)對(duì)接口進(jìn)行回調(diào),它的作用很簡(jiǎn)單,就是綁定數(shù)據(jù)到view,用戶點(diǎn)擊不同的難度將會(huì)自動(dòng)連接到綁定的數(shù)據(jù)庫(kù)中。privatestaticclassFolderListViewBinderimplementsViewBinder{ privateContextmContext; privateFolderDetailLoadermDetailLoader; publicFolderListViewBinder(Contextcontext){ mContext=context; mDetailLoader=newFolderDetailLoader(context); } @Override publicbooleansetViewValue(Viewview,Cursorc,intcolumnIndex){ switch(view.getId()){ caseR.: ((TextView)view).setText(c.getString(columnIndex)); break; caseR.id.detail: finallongfolderID=c.getLong(columnIndex); finalTextViewdetailView=(TextView)view; detailView.setText(mContext.getString(R.string.loading)); mDetailLoader.loadDetailAsync(folderID,newFolderDetailCallback(){ publicvoidonLoaded(FolderInfofolderInfo){ if(folderInfo!=null) detailView.setText(folderInfo.getDetail(mContext)); } }); } returntrue; }4.3.2關(guān)卡選擇界面圖4.10關(guān)卡選擇界面關(guān)卡選擇界面主要代碼如下:1.OnCreat()方法負(fù)責(zé)關(guān)卡選擇界面窗口的生成,此界面顯示了30道題庫(kù)和每個(gè)謎題的狀態(tài),以與謎題是否完成。protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); AndroidUtils.setThemeFromPreferences(this); setContentView(R.layout.sudoku_list); mFilterStatus=(TextView)findViewById(R.id.filter_status); getListView().setOnCreateContextMenuListener(this); setDefaultKeyMode(DEFAULT_KEYS_SHORTCUT); mDatabase=newSudokuDatabase(getApplicationContext()); mFolderDetailLoader=newFolderDetailLoader(getApplicationContext()); Intentintent=getIntent(); if(intent.hasExtra(EXTRA_FOLDER_ID)){ mFolderID=intent.getLongExtra(EXTRA_FOLDER_ID,0); }else{ Log.d(TAG,"No'folder_id'extraprovided,exiting."); finish(); return; } finalSharedPreferencessettings=PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); mListFilter=newSudokuListFilter(getApplicationContext()); mListFilter.showStateNotStarted=settings.getBoolean(FILTER_STATE_NOT_STARTED,true); mListFilter.showStatePlaying=settings.getBoolean(FILTER_STATE_PLAYING,true); mListFilter.showStateCompleted=settings.getBoolean(FILTER_STATE_SOLVED,true); mAdapter=newSimpleCursorAdapter(this,R.layout.sudoku_list_item, null,newString[]{SudokuColumns.DATA,SudokuColumns.STATE, SudokuColumns.TIME,SudokuColumns.LAST_PLAYED, SudokuColumns.CREATED,SudokuColumns.PUZZLE_NOTE}, newint[]{R.id.sudoku_board,R.id.state,R.id.time, R.id.last_played,R.id.created,R.id.note}); mAdapter.setViewBinder(newSudokuListViewBinder(this)); updateList(); setListAdapter(mAdapter); }2.onKeyDown()方法實(shí)現(xiàn)當(dāng)用戶按下返回鍵時(shí),實(shí)現(xiàn)界面從關(guān)卡選擇界面到難度選擇界面的之間的切換。publicbooleanonKeyDown(intkeyCode,KeyEventevent){ if(isTaskRoot()&&keyCode==KeyEvent.KEYCODE_BACK){ Intenti=newIntent(); i.setClass(this,FolderListActivity.class); startActivity(i); finish(); returntrue; } returnsuper.onKeyDown(keyCode,event); }3.onListItemClick()方法負(fù)責(zé)在此界面選擇任意關(guān)卡將執(zhí)行的操作。比如,當(dāng)玩家選擇了第二關(guān),則相應(yīng)的進(jìn)入正式游戲界面。protectedvoidonListItemClick(ListViewl,Viewv,intposition,longid){ playSudoku(id); }4.playSudoku()方法表示當(dāng)用戶選擇關(guān)卡以后將調(diào)用SudokuPlayActivity,進(jìn)入謎題解答界面。privatevoidplaySudoku(longsudokuID){ Intenti=newIntent(SudokuListActivity.this,SudokuPlayActivity.class); i.putExtra(SudokuPlayActivity.EXTRA_SUDOKU_ID,sudokuID); startActivity(i); }5.自定義類SudokuListViewBinder來(lái)對(duì)接口進(jìn)行回調(diào),它的作用很簡(jiǎn)單,就是綁定數(shù)據(jù)到view,當(dāng)玩家選擇了一個(gè)關(guān)卡,則會(huì)進(jìn)入已綁定題庫(kù)的游戲界面。此類包含游戲狀態(tài)函數(shù),游戲成績(jī)保存函數(shù)getDateAndTimeForHumans()。privatestaticclassSudokuListViewBinderimplementsViewBinder{ privateContextmContext; privateGameTimeFormatmGameTimeFormatter=newGameTimeFormat(); privateDateFormatmDateTimeFormatter=DateFormat.getDateTimeInstance( DateFormat.SHORT,DateFormat.SHORT); privateDateFormatmTimeFormatter=DateFormat .getTimeInstance(DateFormat.SHORT); publicSudokuListViewBinder(Contextcontext){ mContext=context; } publicbooleansetViewValue(Viewview,Cursorc,intcolumnIndex){ intstate=c.getInt(c.getColumnIndex(SudokuColumns.STATE)); TextViewlabel=null; switch(view.getId()){ caseR.id.sudoku_board: Stringdata=c.getString(columnIndex); CellCollectioncells=null;; try{cells=CellCollection.deserialize(data); }catch(Exceptione){ longid=c.getLong(c.getColumnIndex(SudokuColumns._ID)); Log.e(TAG,String.format("Exceptionoccurredwhendeserializingpuzzlewithid%s.",id),e); } SudokuBoardViewboard=(SudokuBoardView)view; board.setReadOnly(true); board.setFocusable(false); ((SudokuBoardView)view).setCells(cells); break; caseR.id.state: label=((TextView)view); StringstateString=null; switch(state){ caseSudokuGame.GAME_STATE_COMPLETED: stateString=mContext.getString(R.string.solved); break; caseSudokuGame.GAME_STATE_PLAYING: stateString=mContext.getString(R.string.playing); break; } label.setVisibility(stateString==null?View.GONE :View.VISIBLE); label.setText(stateString); if(state==SudokuGame.GAME_STATE_COMPLETED){ label.setTextColor(Color.rgb(187,187,187)); }else{ label.setTextColor(Color.rgb(255,255,255)); } break; caseR.id.time: longtime=c.getLong(columnIndex); label=((TextView)view); StringtimeString=null; if(time!=0){ timeString=mGameTimeFormatter.format(time); } label.setVisibility(timeString==null?View.GONE :View.VISIBLE); label.setText(timeString); if(state==SudokuGame.GAME_STATE_COMPLETED){ label.setTextColor(Color.rgb(187,187,187)); }else{ label.setTextColor(Color.rgb(255,255,255)); } break; caseR.id.last_played: longlastPlayed=c.getLong(columnIndex); label=((TextView)view); StringlastPlayedString=null; if(lastPlayed!=0){ lastPlayedString=mContext.getString(R.string.last_played_at, getDateAndTimeForHumans(lastPlayed)); } label.setVisibility(lastPlayedString==null?View.GONE :View.VISIBLE); label.setText(lastPlayedString); break; } returntrue; }4.3.3正式游戲界面圖4.11正式游戲界面正式游戲界面主要代碼:1.onCreate方法負(fù)責(zé)窗口生成。首先要對(duì)窗口進(jìn)行全屏操作,然后加載計(jì)時(shí)功能,最后加載數(shù)字鍵盤功能。publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState); Displaydisplay=getWindowManager().getDefaultDisplay(); if((display.getWidth()==240||display.getWidth()==320) &&(display.getHeight()==240||display.getHeight()==320)){ requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); mFullScreen=true; } AndroidUtils.setThemeFromPreferences(this); setContentView(R.layout.sudoku_play); mRootLayout=(ViewGroup)findViewById(R.id.root_layout); mSudokuBoard=(SudokuBoardView)findViewById(R.id.sudoku_board); mTimeLabel=(TextView)findViewById(R.id.time_label); mDatabase=newSudokuDatabase(getApplicationContext()); mHintsQueue=newHintsQueue(this);mGameTimer=newGameTimer();mGuiHandler=newHandler();if(savedInstanceState==null){ mSudokuGameID=getIntent().getLongExtra(EXTRA_SUDOKU_ID,0); mSudokuGame=mDatabase.getSudoku(mSudokuGameID);}else{ mSudokuGame=newSudokuGame(); mSudokuGame.restoreState(savedInstanceState); mGameTimer.restoreState(savedInstanceState);}if(mSudokuGame.getState()==SudokuGame.GAME_STATE_NOT_STARTED){ mSudokuGame.start();}elseif(mSudokuGame.getState()==SudokuGame.GAME_STATE_PLAYING){ mSudokuGame.resume();}if(mSudokuGame.getState()==SudokuGame.GAME_STATE_COMPLETED){ mSudokuBoard.setReadOnly(true);}mSudokuBoard.setGame(mSudokuGame); mSudokuGame.setOnPuzzleSolvedListener(onSolvedListener); mHintsQueue.showOneTimeHint("welcome",R.string.welcome,R.string.first_run_hint); mIMControlPanel=(IMControlPanel)findViewById(R.id.input_methods); mIMControlPanel.initialize(mSudokuBoard,mSudokuGame,mHintsQueue); mIMControlPanelStatePersister=newIMControlPanelStatePersister(this);mIMPopup=mIMControlPanel.getInputMethod(IMControlPanel.INPUT_METHOD_POPUP);mIMSingleNumber=mIMControlPanel.getInputMethod(IMControlPanel.INPUT_METHOD_SINGLE_NUMBER);mIMNumpad=mIMControlPanel.getInputMethod(IMControlPanel.INPUT_METHOD_NUMPAD);}2.在此窗口,還要調(diào)用View的繼承類SudokuBoardView中的onDraw()方法,此方法用來(lái)繪制九宮格的游戲界面,下面只給出部分主要代碼。protectedvoidonDraw(Canvascanvas){ for(intc=0;c<=9;c++){ floatx=(c*mCellWidth)+paddingLeft; canvas.drawLine(x,paddingTop,x,height,mLinePaint); } for(intr=0;r<=9;r++){ floaty=r*mCellHeight+paddingTop; canvas.drawLine(paddingLeft,y,width,y,mLinePaint); } intsectorLineWidth1=mSectorLineWidth/2; intsectorLineWidth2=sectorLineWidth1+(mSectorLineWidth%2); for(intc=0;c<=9;c=c+3){ floatx=(c*mCellWidth)+paddingLeft; canvas.drawRect(x-sectorLineWidth1,paddingTop,x+sectorLineWidth2,height,mSectorLinePaint); } for(intr=0;r<=9;r=r+3){ floaty=r*mCellHeight+paddingTop; canvas.drawRect(paddingLeft,y-sectorLineWidth1,width,y+sectorLineWidth2,mSectorLinePaint); } }3.當(dāng)玩家點(diǎn)擊MENU菜單時(shí)調(diào)用onOptionsItemSelected方法,并彈出菜單欄,玩家點(diǎn)擊Restart按鈕,實(shí)現(xiàn)重來(lái)功能(restart())。publicbooleanonOptionsItemSelected(MenuItemitem){switch(item.getItemId()){caseMENU_ITEM_RESTART: showDialog(DIALOG_RESTART);returntrue;}returnsuper.onOptionsItemSelected(item); }4.一個(gè)Dialog一直被創(chuàng)建與作為Activity的一部分顯示的時(shí)候,一般情況下,你應(yīng)該使用回調(diào)方法onCreateDialog(int)創(chuàng)建Dialog,當(dāng)你使用這個(gè)方法的時(shí)候,Android系統(tǒng)會(huì)自動(dòng)的管理每一個(gè)Dialog的狀態(tài),并有效的控制著每個(gè)Dialog,同樣的,每個(gè)Dialog也會(huì)繼承Activity中的某些特性。就像當(dāng)一個(gè)Dialog顯示的時(shí)候,按下菜單鍵顯示Activity定義的選項(xiàng)菜單或者使用音量鍵調(diào)整音視頻音量的大小,當(dāng)你想顯示一個(gè)Dialog的時(shí)候,調(diào)用showDialog(int)方法,傳遞的參數(shù)是唯一能標(biāo)識(shí)你想顯示的對(duì)話框的整數(shù)。此處有兩個(gè)對(duì)話框,分別是正確解決謎題時(shí)彈出的DIALOG_WELL_DONE:對(duì)話框,以與當(dāng)玩家點(diǎn)擊restart按鈕彈出的DIALOG_RESTART對(duì)話框,以下是對(duì)話框的詳細(xì)代碼。protectedDialogonCreateDialog(intid){ switch(id){ caseDIALOG_WELL_DONE:returnnewAlertDialog.Builder(this).setIcon(android.R.drawable.ic_dialog_info).setTitle(R.string.well_done).setMessage(getString(R.string.congrats,mGameTimeFormatter.format(mSudokuGame.getTime()))).setPositiveButton(android.R.string.ok,null).create(); caseDIALOG_RESTART:returnnewAlertDialog.Builder(this).setIcon(android.R.drawable.ic_menu_rotate).setTitle(R.string.app_name).setMessage(R.string.restart_confirm).setPositiveButton(android.R.string.yes,newDialogInterface.OnClickListener(){publicvoidonClick(DialogInterfacedialog,intwhichButton){ mSudokuGame.reset(); mSudokuGame.start(); mSudokuBoard.setReadOnly(false); if(mShowTime){ mGameTimer.start(); }}}).setNegativeButton(android.R.string.no,null).create(); } returnnull;}5.GameTimer類負(fù)責(zé)此程序的計(jì)時(shí)功能。privatefinalclassGameTimerextendsTimer{ GameTimer(){ super(1000); } protectedbooleanstep(intcount,longtime){ updateTime();returnfalse;} }4.4數(shù)獨(dú)數(shù)據(jù)庫(kù)存儲(chǔ)4.4.1數(shù)據(jù)庫(kù)代碼本程序共有90個(gè)謎題,分3個(gè)難度,Easy,Medium,Hard。每個(gè)難度有30個(gè)謎題,在本程序中我們采用DatabaseHelperextendsSQLiteOpenHelper,定義了類DatabaseHelper,繼承了SQLiteOpenHelper,謎題的數(shù)據(jù)都存在類DatabaseHelper中的OnCreat()方法中,但由于題庫(kù)量較大,此處只給出2個(gè)題庫(kù)數(shù)據(jù),具體代碼如下:publicvoidonCreate(SQLiteDatabasedb){db.execSQL("CREATETABLE"+SudokuDatabase.SUDOKU_TABLE_NAME+"("+SudokuColumns._ID+"INTEGERPRIMARYKEY,"+SudokuColumns.FOLDER_ID+"INTEGER,"+SudokuColumns.CREATED+"INTEGER,"+SudokuColumns.STATE+"INTEGER,"+SudokuColumns.TIME+"INTEGER,"+SudokuColumns.LA

溫馨提示

  • 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)論