版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
畢業(yè)設(shè)計(論文)原創(chuàng)性聲明本人鄭重聲明:所提交的畢業(yè)設(shè)計(論文),是本人在導(dǎo)師指導(dǎo)下,獨(dú)立進(jìn)行研究工作所取得的成果。除文中已注明引用的內(nèi)容外,本畢業(yè)設(shè)計(論文)不包含任何其他個人或集體已經(jīng)發(fā)表或撰寫過的作品成果。對本研究做出過重要貢獻(xiàn)的個人和集體,均已在文中以明確方式標(biāo)明并表示了謝意。論文作者簽名:日期:年月日摘要隨著手機(jī)行業(yè)發(fā)展蓬勃迅速,尤其是以Android系統(tǒng)為例,越來越多的手機(jī)搭載了Android智能系統(tǒng),該系統(tǒng)是以Linux為基礎(chǔ)的開放源代碼操作系統(tǒng),其開放性、不受運(yùn)營商限制、豐富的硬件支持、良好的擴(kuò)展性,受到了外界良好評價與使用支持。Android的系統(tǒng)架構(gòu)分為三個部分:應(yīng)用部分,核心部分,底層部分。除了上述劃分方式以外,從系統(tǒng)實(shí)際的架構(gòu)模型來看,Android則可以分成以下幾個層次:①應(yīng)用層②框架層③運(yùn)行時④核心類庫⑤硬件抽象層⑥Linux內(nèi)核。本文主要闡述了以面向?qū)ο蟮某绦蜷_發(fā)語言Java,以eclipse為開發(fā)工具,基于Android系統(tǒng)開發(fā)一款數(shù)獨(dú)游戲。數(shù)獨(dú)是一種運(yùn)用紙、筆進(jìn)行演算的邏輯游戲。玩家需要根據(jù)9×9盤面上的已知數(shù)字,推理出所有剩余空格的數(shù)字,并滿足每一行、每一列、每一個粗線宮內(nèi)的數(shù)字均含1-9,不重復(fù)。每一道合格的數(shù)獨(dú)謎題都有且僅有一個唯一答案,推理方法也以此為基礎(chǔ),任何無解或者多解的題目都是不合格的。本程序?qū)崿F(xiàn)了難度選擇功能,計時功能,成績保存,重來功能等。關(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游戲簡介 11.2.1數(shù)獨(dú)題目的數(shù)量 11.2.2數(shù)獨(dú)題目的最少組成 11.3手機(jī)游戲特征 21.4國內(nèi)外研究現(xiàn)狀 3本章小結(jié) 3第二章技術(shù)介紹 42.1Android簡介 42.2Android平臺架構(gòu)與特征 42.2.1Android平臺特征 42.2.2Android平臺架構(gòu) 52.3Android應(yīng)用程序組件 7本章小結(jié) 8第三章系統(tǒng)分析與設(shè)計 93.1系統(tǒng)需求分析 93.1.1功能需求分析 93.1.2安全性需求分析 93.2系統(tǒng)的結(jié)構(gòu)設(shè)計 9本章小結(jié) 10第四章基于Android平臺數(shù)獨(dú)游戲的實(shí)現(xiàn) 114.1Android開發(fā)環(huán)境介紹 114.2Android開發(fā)平臺搭建步驟 114.3系統(tǒng)的主要功能 124.2游戲中主要類的簡要介紹 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ù)庫存儲 274.4.1數(shù)據(jù)庫代碼 274.4.2數(shù)據(jù)庫關(guān)系E-R圖 284.4.3游戲的數(shù)據(jù)檢測 29本章小結(jié) 29第五章游戲的測試和運(yùn)行 305.1游戲測試概述 305.2測試環(huán)境 315.3游戲運(yùn)行結(jié)果 31本章小結(jié) 33第六章總結(jié)和展望 346.1總結(jié) 346.2展望 34結(jié)束語 35致謝 36參考文獻(xiàn) 37附錄第一章緒論1.1游戲背景“九宮格”一詞想必大家并不陌生,它作為數(shù)獨(dú)的前身,最早起源于中國。但九宮格游戲較為復(fù)雜,需要從縱向、橫向、斜向三個方向的數(shù)字之和全部等于15,不適合現(xiàn)在快節(jié)奏的生活,所以人們對經(jīng)典的九宮格游戲進(jìn)行了改良,形成了數(shù)獨(dú)游戲。洛書河圖是我國目前已發(fā)現(xiàn)的最早的九宮格游戲記載,到了18世紀(jì)末,瑞士數(shù)學(xué)家萊昂哈德?歐文又發(fā)明了一種叫做“拉丁方塊”的游戲,之后不久,美國的一家雜志機(jī)構(gòu)也刊登了類似的游戲,從此這個游戲受到了更多的歡迎,之后日本市場也引進(jìn)了這個游戲,并進(jìn)行廣泛的傳播[1]。2004年,在英國《泰晤士報》上,第一個“數(shù)獨(dú)”游戲被刊登在此報上,從那時起數(shù)獨(dú)游戲才真正為世界所知曉,并且很快風(fēng)靡全球。其原因得益于此類游戲操作簡單,不需要進(jìn)行復(fù)雜的數(shù)字運(yùn)算且可玩性高、鍛煉思維、開發(fā)大腦,也不需要特定的語言基礎(chǔ)。1.2游戲簡介1.2.1數(shù)獨(dú)題目的數(shù)量到底有多少個9×9的拉丁方陣呢?答案是:5524751496156892842531225600個。但是由于數(shù)獨(dú)的規(guī)則是每行、每列、每個小九宮格都是要1到9之間的不同數(shù)字,這與拉丁方陣有很大不同,所以數(shù)獨(dú)的謎題要比拉丁方陣少很多。直到2005年底,數(shù)學(xué)家貝米耳(StanleyE.Bammel)與羅思坦(JeromeRothstein)才算出一共有6670903752021072936960種可能的數(shù)獨(dú)謎題[2]。為了慶賀這一結(jié)果,這兩個數(shù)學(xué)家專門寫了一份研究報告。但是在同一個數(shù)獨(dú)中,數(shù)獨(dú)是可以變換的,像行交換、列交換,還有可能是代碼交換(比如1和8交換、2和5、3和6……)。若進(jìn)行上述變換,用不了幾次就很難分清是否來自同一數(shù)獨(dú)了。為了解決這一難題,西澳大利亞大學(xué)教授GordonRoyle博士利用圖形理論,研究出了辨別數(shù)獨(dú)變換的方法。他將數(shù)獨(dú)謎題利用Nauty程序圖形的轉(zhuǎn)化來做比對,該研究結(jié)果把利用這一方法將宮格內(nèi)的行交換、列交換、代碼交換等變換方法產(chǎn)生的等價題都扣除,最后計算出本質(zhì)上共有5472730538個不同的數(shù)獨(dú)謎題。此結(jié)果表明數(shù)獨(dú)謎題的數(shù)量之大,若全球每天通過互聯(lián)網(wǎng)和報紙刊登10000個本質(zhì)上不同的數(shù)獨(dú)謎題,仍需要花上一萬多年才能全部羅列完這接近55億的數(shù)獨(dú)謎題。1.2.2數(shù)獨(dú)題目的最少組成好的數(shù)獨(dú)題目要求已知的數(shù)字是點(diǎn)對稱的,而且謎題要有唯一解甚至已知的數(shù)字越少越好。目前最好的紀(jì)錄是給定18個數(shù)字就可以產(chǎn)生出唯一解的數(shù)獨(dú)謎題。如果放寬條件到不需要點(diǎn)對稱,那么最少可以給定的數(shù)字是17個。許多玩家和學(xué)者對數(shù)獨(dú)游戲癡迷不已,當(dāng)然也包括很多計算機(jī)程序人員,他們在網(wǎng)上提供了眾多免費(fèi)下載的數(shù)獨(dú)謎題程序。例如,才華橫溢的數(shù)學(xué)家和組合學(xué)家Zeilberger曾寫了一個在Maple上跑的程序供大家解出數(shù)獨(dú)謎題[3],可以發(fā)現(xiàn),難度高的題目不一定給出較少的數(shù)字,有時候提供的數(shù)字很多但仍然難度很高。反之,提供的數(shù)字少也許反而比較容易解題。也就是說,謎題的難易程度與提供的數(shù)字多少不是絕對相關(guān)的,謎題的難易程度和設(shè)計者的邏輯思維模式有關(guān)[4]。1.3手機(jī)游戲特征1.易于學(xué)習(xí):既然手機(jī)游戲面向的是普通消費(fèi)者而不是計算機(jī)專家,那么他們不可能深入的學(xué)習(xí)游戲技巧。因此手機(jī)游戲的控制應(yīng)當(dāng)盡量簡單,且易于學(xué)習(xí)。即便游戲計劃的控制方式要求很多很復(fù)雜,開發(fā)商也應(yīng)當(dāng)考慮將其簡化。與主機(jī)控制器相比,手機(jī)和平板電腦的按鍵和控制選項(xiàng)更少,這意味著手機(jī)游戲開發(fā)商需要進(jìn)行創(chuàng)新。許多成功游戲的控制都很簡單。比如流行游戲《翼飛沖天》需要的玩家輸入便很簡單,點(diǎn)擊屏幕可以使下坡加速,在上坡的時候放開即可[5]。2.可中斷性:多任務(wù)處理是手機(jī)生活方式的基本特征。在手機(jī)設(shè)備上,接到電話會導(dǎo)致游戲馬上退出,所以在游戲中采用智能中斷設(shè)置是必要之舉。如果用戶在接完電話后發(fā)現(xiàn)自己剛才的游戲狀態(tài)已消失,那么自然不會對游戲產(chǎn)生良好的印象。將來用戶再玩該游戲的可能性也會減小,因?yàn)閾?dān)心再接到電話導(dǎo)致他們前功盡棄。所以一個好的手機(jī)游戲應(yīng)該提供短時間的娛樂功能,并且允許用戶在游戲與工作模式之間順利切換。3.基于訂閱:手機(jī)游戲的盈利成功取決于他們巨大的使用量。一開始開發(fā)與設(shè)計每個游戲都是昂貴的。如果一個手機(jī)游戲開發(fā)者要贏利的話,重要的是消耗一個游戲引擎,多個標(biāo)題,基本的故事情節(jié)類似。基于訂閱的游戲是不斷產(chǎn)生收入的最好方法。4.豐富的社會交互:不管一個游戲設(shè)計得多好,只要玩家找到了它的根本模式或者玩完了所有的游戲路徑很快就會厭煩這個游戲。對于一個基于訂閱的游戲,重要的是與別的玩家合作以增強(qiáng)所玩游戲的智力與隨機(jī)性。在今天紛繁復(fù)雜的多玩家游戲中具有豐富社會交互的游戲證明是成功的。5.好的網(wǎng)絡(luò)基礎(chǔ)設(shè)備:巨額的手機(jī)技術(shù)研發(fā)費(fèi)用都花在提高設(shè)備與網(wǎng)絡(luò)的可用性與可靠性上面。因此,手機(jī)設(shè)備硬件與網(wǎng)絡(luò)協(xié)議與桌面/控制臺世界(如全球定位系統(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)。比如玩《僵尸時代》需要用你的拇指控制兩個屏幕上的“虛擬操縱桿”。這需要占據(jù)大片屏幕實(shí)用面積,使游戲玩起來較為困難。平板電腦有著更大的實(shí)用面積,但依然會出現(xiàn)上述問題。如果用平板電腦來玩《僵尸時代》,操縱桿依然很難使用,觸控精確性有一定的問題,因?yàn)橄啾仁謾C(jī)來說兩個操縱桿相隔更遠(yuǎn)。7.功能反饋:由于缺乏按動按鍵或震動等觸覺反饋,手機(jī)游戲必須使用不同的方式來告知用戶他們的動作已經(jīng)被游戲接受,它們應(yīng)當(dāng)在屏幕上提供不顯眼卻能夠傳達(dá)信息的反饋。比如,在手游《無盡之劍》中會高亮玩家按動的屏幕按鍵[6],并在屏幕上呈現(xiàn)相關(guān)文本。這些信號立馬便可以告知玩家攻擊或格擋是否成功。同樣,當(dāng)受到傷害時,所受傷害數(shù)值也會顯示在屏幕上,同時生命值扣除相應(yīng)數(shù)值。1.4國內(nèi)外研究現(xiàn)狀A(yù)ndroid操作系統(tǒng)是基于Linux平臺的開發(fā)的手機(jī)操作系統(tǒng),他是由著名的互聯(lián)網(wǎng)公司Google公司進(jìn)行開發(fā)的。Android操作系統(tǒng)包括用戶界面、手機(jī)操作系統(tǒng)和手機(jī)應(yīng)用程序等移動設(shè)備所需要的所有軟件能夠保證正常的使用,而且Android操作系統(tǒng)不存在和以前手機(jī)操作系統(tǒng)上的阻礙移動通信設(shè)備上所需創(chuàng)新的所有權(quán)障礙,因?yàn)樗且粋€開源的手機(jī)操作系統(tǒng)。Google與開放手機(jī)聯(lián)盟合作開發(fā)了Android,這個聯(lián)盟由包括中國移動、摩托羅拉、高通、宏達(dá)電和T-Mobile在內(nèi)的30多家技術(shù)和無線應(yīng)用的領(lǐng)軍企業(yè)組成[7]。Google通過與運(yùn)營商、設(shè)備制造商、開發(fā)商和其他相關(guān)各方結(jié)成深層次的合作伙伴關(guān)系,希望借助建立標(biāo)準(zhǔn)化、開放式的移動設(shè)備軟件平臺,在移動產(chǎn)業(yè)內(nèi)形成一個開放式的生態(tài)系統(tǒng)。
Androind操作系統(tǒng)作為谷歌企業(yè)戰(zhàn)略的重要組成部分,將進(jìn)一步推進(jìn)“隨時隨地為每個人提供信息”這一企業(yè)目標(biāo)的實(shí)現(xiàn)。Android手機(jī)操作系統(tǒng)將作為Google擴(kuò)展移動設(shè)備市場的一個奠基石,而后為Google應(yīng)用的推廣起到了良好的作用。但Android操作系統(tǒng)不會替代谷歌長期以來奉行的移動發(fā)展策略:通過與全球各地的手機(jī)制造商和運(yùn)營商結(jié)成合作伙伴,開發(fā)既有用又有吸引力的移動服務(wù),并推廣這些產(chǎn)品[8]。本章小結(jié)本章介紹了數(shù)獨(dú)游戲的起源、數(shù)獨(dú)游戲玩法和規(guī)則,手機(jī)游戲的特征,以與Android系統(tǒng)的國內(nèi)外現(xiàn)狀,希望能讓大家對數(shù)獨(dú)有更深入的了解。第二章技術(shù)介紹2.1Android簡介Android(安卓),是一個以Linux為基礎(chǔ)的開源移動設(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ā)這個系統(tǒng)的目的是創(chuàng)建一個數(shù)碼相機(jī)的先進(jìn)操作系統(tǒng);但是后來發(fā)現(xiàn)市場需求不夠大,加上智能手機(jī)市場快速成長,于是Android被改造為一款面向智能手機(jī)的操作系統(tǒng)。於2005年8月被美國科技企業(yè)Google收購。2007年11月,Google與84家制造商、開發(fā)商與電信營運(yùn)商成立開放手持設(shè)備聯(lián)盟來共同研發(fā)改良Android系統(tǒng),隨后,Google以Apache免費(fèi)開放原始碼許可證的授權(quán)方式,發(fā)布了Android的原碼,讓生產(chǎn)商推出搭載Android的智能手機(jī),Android后來更逐漸拓展到平板電腦與其他領(lǐng)域上。2010年末數(shù)據(jù)顯示,僅正式推出兩年的Android作業(yè)系統(tǒng)在市場占有率上已經(jīng)超越稱霸逾十年的諾基亞Symbian系統(tǒng),成為全球第一大智能手機(jī)操作系統(tǒng)[10]。2.2Android平臺架構(gòu)與特征2.2.1Android平臺特征隨著科技的發(fā)展,移動電話(MobilePhone)正朝著智能化的方向發(fā)展,逐步成為多種工具的功能載體,而Android就是這樣一個智能手機(jī)的平臺、一個多種工具的功能載體。通信工具移動電話的最基本功能為通信功能,因此使用運(yùn)營商提供的通信網(wǎng)絡(luò)進(jìn)行語音通話也是Android平臺的最基本功能。除了傳統(tǒng)的語音通話功能外,Android平臺還具有短消息功能,以與通常移動電話都具有的個人信息系統(tǒng)管理方面的功能(如電話本等)。2.網(wǎng)絡(luò)工具隨著數(shù)字業(yè)務(wù)使用的普遍化,移動電話通常被作為網(wǎng)絡(luò)工具使用,即移動電話可以完成電腦的部分功能。而Android平臺在網(wǎng)絡(luò)方面的功能主要包括瀏覽器、IM(即時信息)、郵件等。3.媒體播放器隨著多媒體技術(shù)的發(fā)展應(yīng)用,在移動電話上進(jìn)行音頻和視頻播放已經(jīng)成為經(jīng)常使用的功能。由此,Android平臺具有支持更多的音頻/視頻格式,支持更高分辨率的視頻,可更流暢地播放視頻,以與支持網(wǎng)絡(luò)流媒體等功能。4.媒體獲取設(shè)備隨著移動電話與媒體獲取設(shè)備的集成日益增強(qiáng),Android平臺提供了照相機(jī)、錄音機(jī)、攝像機(jī)等功能。5.多類型的連接設(shè)備Android平臺提供了多種連接方式,如USB、GPS、紅外、藍(lán)牙、無線局域網(wǎng)等。6.具有友好和絢麗的用戶界面Android平臺具有友好的用戶界面,使用戶容易學(xué)習(xí)和操作;同時具有絢麗的用戶界面,具有良好的視覺效果。7.可以個性化定制的平臺Android平臺針對于用戶的個性化需求,提供了全面自定義手機(jī)的功能。除了上述介紹的Android平臺的功能以外,其在技術(shù)上還具有以下幾個方面的特性:全開放智能移動電話平臺;支持多硬件平臺;使用眾多的標(biāo)準(zhǔn)化技術(shù);核心技術(shù)完整、統(tǒng)一;完善的SDK和文檔;完善的輔助開發(fā)工具。2.2.2Android平臺架構(gòu)從圖2.1我們可以看出,Android操作系統(tǒng)的體系結(jié)構(gòu)可分為4層,由上到下依次是應(yīng)用程序、應(yīng)用程序框架、核心類庫和Linux內(nèi)核,其中第三層還包括Android運(yùn)行時的環(huán)境。下面分別來講解各個部分。圖2.1Android操作系統(tǒng)體系結(jié)構(gòu)1.程序應(yīng)用Android連同一個核心應(yīng)用程序包一起發(fā)布,該應(yīng)用程序包包括E-mail客戶端、SMS短消息程序、日歷、地圖、瀏覽器、聯(lián)系人管理程序等。所有的應(yīng)用程序都是用Java編寫的[11]。2.應(yīng)用程序框架開發(fā)者完全可以訪問核心應(yīng)用程序所使用的API框架。該應(yīng)用程序框架架構(gòu)用來簡化組件軟件的重用,任何一個應(yīng)用程序都可以發(fā)布它的功能塊并且任何其他的應(yīng)用程序都可以使用其所發(fā)布的功能塊(不過得遵循框架的安全性限制)。該應(yīng)用程序重用機(jī)制使得組件可以被用戶替換。以下所有的應(yīng)用程序都由一系列的服務(wù)和系統(tǒng)組成,包括:(1)一個可擴(kuò)展的視圖(Views)可以用來創(chuàng)建應(yīng)用程序,包括列表(lists)、網(wǎng)絡(luò)(grids)、文本框(textboxes)、按鈕(buttons),甚至是一個可嵌入的Web瀏覽器。(2)內(nèi)容管理器(ContentProviders)使得應(yīng)用程序可以訪問另一個應(yīng)用程序的數(shù)據(jù)(如聯(lián)系人數(shù)據(jù)庫),或者共享它們自己的數(shù)據(jù)。(3)一個資源管理器(ResourceManager)提供非代碼資源的訪問,如本地字符串、圖形和分層文件(layoutfiles)。(4)一個通知管理器(NotificationManager)使得應(yīng)用程序可以在狀態(tài)欄中顯示客戶通知信息。(5)一個活動類管理器(ActivityManager)用來管理應(yīng)用程序生命周期并提供常用的導(dǎo)航回退功能。3.Android程序庫Android包括一個被Android系統(tǒng)中各種不同組件所使用的C/C++集庫。該庫通過Android應(yīng)用程序框架為開發(fā)者提供服務(wù)。以下是一些主要的核心庫[12]:(1)系統(tǒng)C庫:一個從BSD繼承來的標(biāo)準(zhǔn)C系統(tǒng)函數(shù)庫(libc),專門為基于EmbeddedLinux的設(shè)備定制。(2)媒體庫:基于PacketVideoOpenCORE;該庫支持錄放,并且可以錄制許多流行的音頻視頻格式,還有靜態(tài)映像文件包括MPEG4、H.264、MP3、AAC、JPG、PNG。(3)SurfaceManager:對顯示子系統(tǒng)的管理,并且為多個應(yīng)用程序提供2D和3D圖層的無縫融合。(4)LibWebCore:一個最新的Web瀏覽器引擎,用來支持Android瀏覽器和一個可嵌入的Web視圖。(5)SGL:一個內(nèi)置的2D圖形引擎。(6)3Dlibraries:基于OpenGLES1.0APIs實(shí)現(xiàn);該庫可以使用硬件3D加速(如果可用)或者使用高度優(yōu)化的3D軟加速。(7)FreeType:位圖(bitmap)和向量(vector)字體顯示。(8)SQLite:一個對于所以應(yīng)用程序可用、功能強(qiáng)勁的輕型關(guān)系型數(shù)據(jù)庫引擎。4.Android運(yùn)行庫Android包括了一個核心庫,該核心庫提供了Java編程語言核心庫的大多數(shù)功能。每一個Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行,都擁有一個獨(dú)立的Dalvik虛擬機(jī)實(shí)例。Dalvik是針對同時高效地運(yùn)行多個VMs實(shí)現(xiàn)的。Dalvik虛擬機(jī)執(zhí)行.dex的Dalvik可執(zhí)行文件,該格式文件針對最小內(nèi)存使用做了優(yōu)化。該虛擬機(jī)是基于寄存器的,所有的類都是經(jīng)由Java匯編器編譯,然后通過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ū)動模型[14]。Linux內(nèi)核也同時作為硬件和軟件棧之間的硬件抽象層。2.3Android應(yīng)用程序組件應(yīng)用程序組件是Android應(yīng)用程序的基本構(gòu)建單元。每個組件是系統(tǒng)進(jìn)入你的應(yīng)用程序的不同入口點(diǎn)。不是所有的組件對于用戶都是實(shí)際上的入口點(diǎn),有些是互相依賴的,但是每個組件都有特定的作用——每個都是唯一的構(gòu)建單元,這些構(gòu)建單元定義你應(yīng)用程序的全部行為這里有6個組件,它們是Android應(yīng)用程序的基石[15]:(1)Activities(活動)應(yīng)用程序的顯示層。每一個畫面對應(yīng)于你的應(yīng)用程序,將會是Activity類的擴(kuò)展。Activity使用Views去構(gòu)建UI來顯示信息和響應(yīng)用戶的行為。就桌面開發(fā)而言,一個Activity相當(dāng)于一張F(tuán)orm。(2)Services(服務(wù))應(yīng)用程序中不可見的“工人”。Service組件運(yùn)行時不可見,但它負(fù)責(zé)更新的數(shù)據(jù)源和可見的Activity,以與觸發(fā)通知。它們常用來執(zhí)行一些需要持續(xù)運(yùn)行的處理,當(dāng)你的Activity已經(jīng)不處于激活狀態(tài)或不可見。(3)Content(內(nèi)容)提供共享的數(shù)據(jù)存儲。ContentProvider(內(nèi)容提供器)用來管理和共享應(yīng)用程序的數(shù)據(jù)庫。在應(yīng)用程序間,ContentProvider是共享數(shù)據(jù)的首選方式。這意味著,你可以配置自己的ContentProvider去存取其他的應(yīng)用程序或者通過其他應(yīng)用程序暴露的ContentProvider去存取它們的數(shù)據(jù)。Android設(shè)備本身包含了幾個ContentProvider來訪問像聯(lián)系人信息等有用的數(shù)據(jù)庫。(4)Intents(意圖)簡單的消息傳遞框架。使用Intent,你可以在整個系統(tǒng)內(nèi)廣播消息或者給特定的Activity或者服務(wù)來執(zhí)行你的行為意圖。系統(tǒng)會決定那個(些)目標(biāo)來執(zhí)行適當(dāng)?shù)男袨椤?5)BroadcastReceivers(廣播接收器)Intent廣播的“消費(fèi)者”。通過創(chuàng)建和注冊一個BroadcastReceiver,應(yīng)用程序可以監(jiān)聽符合特定條件的廣播的Intent。BroadcastReceiver會自動的啟動你的應(yīng)用程序去響應(yīng)新來的Intent。BroadcastReceiver是事件驅(qū)動程序的理想手段。(6)Notifications(通知)用戶通知的框架。Notification用來在不需要焦點(diǎn)或不中斷它們當(dāng)前Activity的情況下提示用戶。它們是Service或BroadcastReceiver獲得用戶注意的首選方式。例如,當(dāng)設(shè)備收到文本信息或外部來電時,它通過閃光,發(fā)聲,顯示圖標(biāo)或顯示對話框信息來提醒你。本章小結(jié)本章主要講述了開發(fā)基于Android系統(tǒng)的數(shù)獨(dú)游戲的技術(shù)做了一些概述,通過本章的內(nèi)容我們要了解Android的簡介,Android平臺的特征、架構(gòu)、以與Android平臺應(yīng)用程序組件。第三章系統(tǒng)分析與設(shè)計3.1系統(tǒng)需求分析需求分析完成的好壞直接影響后續(xù)軟件開發(fā)的質(zhì)量,它的重要性由此可見一斑?,F(xiàn)實(shí)情況往往是,用戶不了解計算機(jī)的相關(guān)知識,而開發(fā)人員也對相關(guān)業(yè)務(wù)領(lǐng)域不甚了解。受思維定式的影響,用戶和開發(fā)人員往往對同一問題有不同的理解,這樣就對系統(tǒng)的功能確定帶來了很大的麻煩。所以,開發(fā)人員和用戶之間要進(jìn)行充分和有效的溝通,甚至開發(fā)人員要置身于相關(guān)的業(yè)務(wù)領(lǐng)域,以確保開發(fā)出來的系統(tǒng)能夠真正滿足用戶的需要[16]。3.1.1功能需求分析此次程序設(shè)計任務(wù)是Android平臺下的數(shù)獨(dú)游戲設(shè)計,程序?qū)⒃贏ndroid模擬器中運(yùn)行調(diào)試。此次程序設(shè)計用戶界面要求較為友好,由于針對的用戶為Android智能手機(jī)用戶,因此程序的操作非常簡單容易操作。游戲進(jìn)行時通過底部鍵盤中的數(shù)字鍵輸入答案,程序中儲存了90個分三個難度的數(shù)獨(dú)題目,供用戶娛樂,此次程序設(shè)計的操作系統(tǒng)要求為Windows7,且此次程序設(shè)計需要在Eclipse環(huán)境下開發(fā)。1.重來功能重來功能主要實(shí)現(xiàn)用戶想要重新開始本謎題。2.選關(guān)功能選關(guān)功能主要實(shí)現(xiàn)用戶可以自主選擇關(guān)卡。3.計時功能計時功能主要實(shí)現(xiàn)對用戶解決謎題的計時。4.成績保存功能成績保存功能主要實(shí)現(xiàn)對用戶解決本謎題所用時間的保存。5.難易程度選擇功能難易程度選擇功能主要實(shí)現(xiàn)用戶根據(jù)自己實(shí)際水平選擇適合自己難度的題目。6.退出功能退出功能主要實(shí)現(xiàn)退出游戲。3.1.2安全性需求分析因該游戲不涉與到用戶信息等,因此不需要考慮信息的泄漏。3.2系統(tǒng)的結(jié)構(gòu)設(shè)計系統(tǒng)結(jié)構(gòu)為進(jìn)入主界面顯示選擇難度界面,在用戶選擇難度之后,進(jìn)入相應(yīng)的關(guān)卡選擇界面,選擇具體關(guān)卡之后,將進(jìn)入正式游戲界面。在正式游戲界面時,系統(tǒng)將會自動計時,用戶按返回鍵則暫停計時,并返回關(guān)卡選擇界面,若用戶要重解本謎題,則可以使用菜單選項(xiàng),按Restart鍵即可重新解答本謎題。當(dāng)用戶成功解決本謎題時,系統(tǒng)將會自動停止計時,并保存用戶解決本謎題所用的時間(即成績保存)。本程序中這三個界面之間都是可以通過返回鍵互相切換的,具體系統(tǒng)結(jié)構(gòu)圖如圖3.1所示。啟動游戲啟動游戲選擇難易度游戲主界面選則關(guān)卡重來功能計時功能退出功能圖3.1系統(tǒng)結(jié)構(gòu)圖本章小結(jié)本章對Android數(shù)獨(dú)游戲做了需求分析,并對系統(tǒng)結(jié)構(gòu)做了簡單介紹,可以從下一章中具體看到這些界面與具體的實(shí)現(xiàn)方法和部分代碼。第四章基于Android平臺數(shù)獨(dú)游戲的實(shí)現(xiàn)4.1Android開發(fā)環(huán)境介紹Android的上層應(yīng)用程序是用Java語言開發(fā),同時還需要基于Dalvik虛擬機(jī),所以,Google公司推薦使用主流的Java繼承開發(fā)環(huán)境Eclipse[17]。只有Eclipse還不夠,因?yàn)槭鞘褂肑ava語言進(jìn)行開發(fā),還應(yīng)該有由SUN公司提供的JavaSDK(其中包括JRE:JavaRuntimeEnvironment)。此外,Android的應(yīng)用程序開發(fā)和Java開發(fā)有較大區(qū)別的,所以還需要有Google提供的AndroidSDK。同時,還需要在Eclipse安裝ADT,為Android開發(fā)提供開發(fā)工具的升級或者變更,是Eclipse下開發(fā)工具的升級下載的工具[18]。 簡言之,需要以下軟件,才能搭建Android開發(fā)環(huán)境,從而進(jìn)行Android應(yīng)用程序的開發(fā)。(1)JavaSDK(2)Eclipse(3)AndroidSDK(4)ADT4.2Android開發(fā)平臺搭建步驟1.首先到/downloads/下載Eclipse集成開發(fā)環(huán)境并且解壓,這里推薦下載JavaEE集成版本,可以為平臺的搭建省下不少工作。接著再去/javase/downloads/index.jsp站點(diǎn)下載SDK后安裝,下載/android/android-sdk-windows-1.5_r1.zipAndroidSDK1.5后解壓。第一步下載工序就結(jié)束了。2.雙擊Eclipse解壓后目錄中的eclipse.exe然后啟動,選擇Eclipse菜單中的Help->InstallNewSoftware->選項(xiàng)卡上的AvailableSoftware,點(diǎn)擊右側(cè)的“Add”輸入/android/eclipse/后確定,然后在“Workwith”下拉菜單中選擇剛才輸入的網(wǎng)址。過一會就會出現(xiàn)一個DeveloperTools選項(xiàng),勾上以后點(diǎn)擊Next以后Eclipse會自動網(wǎng)上查找Android開發(fā)工具插件,然后找到AndroidDDMS和AndroidDevelopmentTools,選中這兩個點(diǎn)擊Finish,Eclipse就會自動下載并安裝Android插件了,最后會提示重啟Eclipse。3.重啟后選擇Eclipse菜單中的Windows->Preferences在左側(cè)的Android項(xiàng)目中SDKLocation中填入AndroidSDK解壓后的目錄,然后點(diǎn)擊Apply。4.在WindowsXP的系統(tǒng)變量中的path變量中添加一個值,該值指向解壓后的AndroidSDK目錄下的tools文件夾[19]。4.3系統(tǒng)的主要功能數(shù)獨(dú)游戲的規(guī)則很簡單,只需在空格處填入1~9的數(shù)字,并保證每個數(shù)字在每個九宮格內(nèi)只能出現(xiàn)一次,且每個數(shù)字在每一行、每一列也只能出現(xiàn)一次[20],然后玩家需要在空白處填上相應(yīng)的數(shù)字使其滿足游戲規(guī)則。該游戲的運(yùn)行步驟如下:啟動游戲后首先進(jìn)入的便是游戲難度選擇界面,效果如圖4.1所示,在難度選擇界面中,用戶可以選擇Easy,Medium,Hard三個難度等級。圖4.1難度選擇界面圖4.2關(guān)卡選擇界面當(dāng)用戶隨意選擇一個難度以后,將進(jìn)入具體關(guān)卡選擇界面,效果如圖4.2所示,在任意難度中都有30個關(guān)卡。當(dāng)用戶隨意選擇一個關(guān)卡后,將正式進(jìn)入數(shù)獨(dú)游戲界面,效果如圖4.3所示。在游戲界面,由9×9的九宮格和底部的數(shù)字鍵盤組成。圖4.3數(shù)獨(dú)游戲界面圖4.4返回界面在這里,我們可以看到,在正式游戲界面頂部,有計時功能,從玩家打開本謎題時開始計時,當(dāng)玩家按返回鍵時,則暫停計時,并且改變游戲狀態(tài),效果如圖4-4所示。因?yàn)槲覀冄菔镜氖堑诙€謎題,當(dāng)玩家按返回鍵時,則暫停計時,第二個謎題狀態(tài)變?yōu)椋≒laying)。我們知道,當(dāng)玩家已經(jīng)知道一個謎題的正確解法,但已經(jīng)錯誤太多時候,這時就需要有重新開始本謎題的功能,在這里我們先隨意填寫幾個數(shù)字,當(dāng)我們通過菜單功能按下(Restart)鍵時,本謎題將清除已填數(shù)字,且計時也重新開始,效果如圖4.5,4.6所示。圖4.5重新開始按鈕圖4.6重新開始以后的游戲當(dāng)玩家正確填滿謎題之后,將會彈出對話框完成對話框,且計時功能暫停,若沒有正確填寫則不彈出對話框,計時功能也將繼續(xù),直到全部正確填寫完成之后才結(jié)束,效果如圖4.7所示。當(dāng)完成謎題之后,按返回鍵回到關(guān)卡選擇界面,此時,被完成的謎題狀態(tài)改變,且完成的成績被保存在謎題后面,效果如圖4.8所示。圖4.7正確填寫謎題結(jié)果圖4.8謎題狀態(tài)與成績保存4.2游戲中主要類的簡要介紹為了讓讀者更好地理解后面的代碼,下面將對游戲中的各個類逐一進(jìn)行簡要說明。關(guān)于這些類的詳細(xì)代碼將在后面的章節(jié)中相繼給出。4.2.1難易度選擇界面相關(guān)類FolderListActivity類該類為選擇難易度界面的實(shí)現(xiàn)類,主要負(fù)責(zé)選擇難易度界面的繪制,是整個應(yīng)用程序的入口。此類讓activity繼承ListActivity,并且舍棄XML布局文件,全部采用默認(rèn)布局中存在的布局來布局。此類重寫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)布局中存在的布局來布局。4.2.3游戲界面相關(guān)類(1)SudokuPlayActivity類SudokuPlayActivity類是游戲中最主要的一個類,游戲規(guī)則、游戲模型都包含在此類當(dāng)中。同時該類還負(fù)責(zé)繪制游戲的畫面、接收玩家的響應(yīng)。(2)Cell類Cell類負(fù)責(zé)9×9九宮格中每一個小格的操作。(3)數(shù)獨(dú)生成器DatabaseHelper類該類繼承了SQLiteOpenHelper類,為游戲隨機(jī)提供存放數(shù)獨(dú)數(shù)字的二維數(shù)組,該類存儲了本程序所有的謎題數(shù)據(jù)。(4)Timer類該類負(fù)責(zé)對游戲的計時功能。有start()功能,stop()功能,reset()功能,isRunning()功能,getTime等功能。(5)IMNumpad類該類是游戲進(jìn)行時底部的鍵盤,負(fù)責(zé)輸入數(shù)字。數(shù)字鍵盤主體部分有1-9的數(shù)字,和一個(C)清除符號。4.3游戲中主要功能詳解4.3.1選擇難易度界面圖4.9選擇難度界面選擇難度界面主要代碼如下:1.OnCreat()方法負(fù)責(zé)選擇難易度界面的窗口生成,此窗口由三個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難度,將會進(jìn)入下個Easy界面關(guān)卡中。protectedvoidonListItemClick(ListViewl,Viewv,intposition,longid){ Intenti=newIntent(this,SudokuListActivity.class); i.putExtra(SudokuListActivity.EXTRA_FOLDER_ID,id); startActivity(i); }3.自定義類FolderListViewBinder來對接口進(jìn)行回調(diào),它的作用很簡單,就是綁定數(shù)據(jù)到view,用戶點(diǎn)擊不同的難度將會自動連接到綁定的數(shù)據(jù)庫中。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道題庫和每個謎題的狀態(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í)現(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來對接口進(jìn)行回調(diào),它的作用很簡單,就是綁定數(shù)據(jù)到view,當(dāng)玩家選擇了一個關(guān)卡,則會進(jìn)入已綁定題庫的游戲界面。此類包含游戲狀態(tài)函數(shù),游戲成績保存函數(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é)窗口生成。首先要對窗口進(jìn)行全屏操作,然后加載計時功能,最后加載數(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()方法,此方法用來繪制九宮格的游戲界面,下面只給出部分主要代碼。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菜單時調(diào)用onOptionsItemSelected方法,并彈出菜單欄,玩家點(diǎn)擊Restart按鈕,實(shí)現(xiàn)重來功能(restart())。publicbooleanonOptionsItemSelected(MenuItemitem){switch(item.getItemId()){caseMENU_ITEM_RESTART: showDialog(DIALOG_RESTART);returntrue;}returnsuper.onOptionsItemSelected(item); }4.一個Dialog一直被創(chuàng)建與作為Activity的一部分顯示的時候,一般情況下,你應(yīng)該使用回調(diào)方法onCreateDialog(int)創(chuàng)建Dialog,當(dāng)你使用這個方法的時候,Android系統(tǒng)會自動的管理每一個Dialog的狀態(tài),并有效的控制著每個Dialog,同樣的,每個Dialog也會繼承Activity中的某些特性。就像當(dāng)一個Dialog顯示的時候,按下菜單鍵顯示Activity定義的選項(xiàng)菜單或者使用音量鍵調(diào)整音視頻音量的大小,當(dāng)你想顯示一個Dialog的時候,調(diào)用showDialog(int)方法,傳遞的參數(shù)是唯一能標(biāo)識你想顯示的對話框的整數(shù)。此處有兩個對話框,分別是正確解決謎題時彈出的DIALOG_WELL_DONE:對話框,以與當(dāng)玩家點(diǎn)擊restart按鈕彈出的DIALOG_RESTART對話框,以下是對話框的詳細(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é)此程序的計時功能。privatefinalclassGameTimerextendsTimer{ GameTimer(){ super(1000); } protectedbooleanstep(intcount,longtime){ updateTime();returnfalse;} }4.4數(shù)獨(dú)數(shù)據(jù)庫存儲4.4.1數(shù)據(jù)庫代碼本程序共有90個謎題,分3個難度,Easy,Medium,Hard。每個難度有30個謎題,在本程序中我們采用DatabaseHelperextendsSQLiteOpenHelper,定義了類DatabaseHelper,繼承了SQLiteOpenHelper,謎題的數(shù)據(jù)都存在類DatabaseHelper中的OnCreat()方法中,但由于題庫量較大,此處只給出2個題庫數(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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《模具制造工藝學(xué)》教學(xué)大綱
- 教案裝訂順序
- 四個自信課件
- 玉溪師范學(xué)院《現(xiàn)代教育技術(shù)》2022-2023學(xué)年第一學(xué)期期末試卷
- 玉溪師范學(xué)院《田徑》2021-2022學(xué)年第一學(xué)期期末試卷
- 教練員繼續(xù)教育考試題目及答案-知識題庫
- 湖南師大附中2024-25屆高三年級月考試卷(二)(英語)
- 電商公司整體薪酬設(shè)計(早期)
- 《信號基礎(chǔ)設(shè)備》全套教學(xué)課件
- 2023年雙頻、雙模移動通信手機(jī)項(xiàng)目綜合評估報告
- 《老年人生活照護(hù)》試卷A卷及答案
- 消防安全知識培訓(xùn)課件
- 高中歷史選擇性必修2知識點(diǎn)總結(jié)歸納
- 2024年個人信用報告(個人簡版)樣本(帶水印-可編輯)
- 16J914-1 公用建筑衛(wèi)生間
- 物聯(lián)網(wǎng)應(yīng)用技術(shù)職業(yè)生涯規(guī)劃
- 2024年廣東恒健投資控股有限公司招聘筆試參考題庫含答案解析
- 《垃圾分類》ppt課件
- (最新整理)案件(線索)移送登記表
- (完整版)U型板樁專項(xiàng)施工方案
- 局麻藥中毒反應(yīng)的搶救及預(yù)防措施ppt課件.ppt
評論
0/150
提交評論