版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
實訓(xùn)報告實訓(xùn)工程名稱基于安卓貪吃蛇游戲的開發(fā)與測試二級學(xué)院信息工程學(xué)院專業(yè)班級11級計科〔2〕班姓名操瑋康、方剛、聶順濤、肖洋學(xué)號1142151201、05、17、27日期工程名稱基于安卓貪吃蛇游戲的開發(fā)與測試地點教13605報告內(nèi)容貪吃蛇游戲開發(fā),首先它可以為大家提供一種當(dāng)前比擬流行的休閑小游戲。貪吃蛇是家喻戶曉的益智類小游戲,選擇這個題目一是為了將自己的所學(xué)知識加以運用,二是一直以來貪吃蛇這個游戲就深深地吸引著很多人。在這次的實驗中我們介紹了安卓的背景還有貪吃蛇的背景。對我們的游戲進(jìn)行了各種需求的分析,然后對我們的游戲進(jìn)行設(shè)計,設(shè)計分成各個模塊。設(shè)計完了之后就是實現(xiàn)了,通過Eclipse進(jìn)行編寫程序設(shè)計完成,最后就是我們的工程測試局部,經(jīng)過測試,最終成功的完成了游戲的設(shè)計。教師評語成績:教師簽名:摘要Google公司2007年11月5日發(fā)布Android平臺
——
一款包括操作系統(tǒng)〔基于Linux內(nèi)核〕、中間件和關(guān)鍵應(yīng)用的平臺,并組建了開放聯(lián)盟(OpenHandsetAlliance),包括Google、中國移T-Mobile、宏達(dá)電、高通、摩托羅拉等領(lǐng)軍企業(yè)。本課題是利用java語言在Android平臺上進(jìn)行游戲的開發(fā),由于本人知識的有限,以及客觀條件的限制,本人打算開發(fā)一個單機(jī)版的游戲。后來得知這個小小的游戲是nokia當(dāng)年很成功的一款游戲,許多人都玩過,也很喜歡?,F(xiàn)在這款游戲的版本已經(jīng)開展到第三版了,生產(chǎn)廠商繼續(xù)開發(fā)這個游戲,看來這個游戲還是有很大的市場的。于是,我決定利用自己大學(xué)所學(xué)的知識,自己在指導(dǎo)老師的幫助下,獨立開發(fā)這個小游戲。本文首先詳細(xì)介紹了java的一些根本的知識點,在此根底上引出了Android,介紹了Android的根底以及其特點,然后介紹了一下Android將來的一些前景和開展。重點說明了這個貪吃蛇程序所用到的一些類和控件。介紹了這些類的一般的使用方法,以及本程序是如何使用這些類來進(jìn)行游戲的開發(fā)的。關(guān)鍵詞:Android系統(tǒng);貪食蛇游戲目錄1.緒論4開發(fā)背景4安卓系統(tǒng)簡介4游戲簡介4開發(fā)目的及意義4開發(fā)環(huán)境及工具5游戲系統(tǒng)開發(fā)平臺及搭建52.需求分析7游戲界面分析7游戲角色分析7游戲控制分析7可行性分析73.總體設(shè)計8貪吃蛇流程圖8總設(shè)計模塊的劃分9主要界面93.2.2游戲控制模塊94.詳細(xì)實現(xiàn)104.1游戲窗口Snake類104.2生成方塊TileView類114.3游戲?qū)嶓wSnakeView類135.測試1515156.結(jié)論20附錄22安卓系統(tǒng)簡介安卓系統(tǒng)作為新興的操作系統(tǒng),在問世不久,變風(fēng)行全球,占領(lǐng)操作系統(tǒng)里很大的市場份額,與蘋果,諾基亞三分天下,Android是基于Linux開放性內(nèi)核的操作系統(tǒng),是Google公司在2007年11月5日公布的操作系統(tǒng)。早期由原名為"Android"的公司開發(fā),谷歌在2005年收購"Android.Inc"后,繼續(xù)對Android系統(tǒng)開發(fā)運營,它采用了軟件堆層〔softwarestack,又名軟件疊層〕的架構(gòu),主要分為三局部。底層Linux內(nèi)核只提供根本功能,其他的應(yīng)用軟件那么由各公司自行開發(fā),局部程序以Java編寫。游戲簡介1976年,Gremlin平臺推出了一款經(jīng)典街機(jī)游戲Blockade。游戲中,兩名玩家分別控制一個角色在屏幕上移動,所經(jīng)之處砌起圍欄。角色只能向左、右方向90度轉(zhuǎn)彎,游戲目標(biāo)保證讓對方先撞上屏幕或圍欄。聽起來有點復(fù)雜?其實就是下面這個樣子:
根本上就是兩條每走一步都會長大的貪吃蛇比誰后完蛋,玩家要做的就是防止撞上障礙物和越來越長的身體。更多照片、視頻可以看GamesDBase的介紹。
Blockade很受歡送,類似的游戲先后出現(xiàn)在Atari2600、TRS-80、蘋果2等早期游戲機(jī)、計算機(jī)上。但真正讓這種游戲形式紅遍全球的還是21年后隨諾基亞走向世界的貪吃蛇游戲——Snake。貪吃蛇游戲是一款老牌的游戲,同時也是一款比擬需要耐心地游戲。貪吃蛇游戲就是一條小蛇,不停地在屏幕上游走,吃各個方向出現(xiàn)的食物,越吃越長。只要蛇頭碰到屏幕四周,或者碰到自己的身子,小蛇就立即斃命。玩“貪吃蛇游戲〞,難度最大的不是蛇長得很長的時候,而是開始的時候。那時蛇身很短,看上去難度不大,卻最容易死掉,因為把玩一條小蛇讓人容易走神,失去耐心。通過本次課程設(shè)計,了解android軟件的開發(fā)過程,熟悉并掌握J(rèn)AVA語言,HTML.程序關(guān)鍵在于表示蛇的圖形及蛇的移動。用一個小矩形快表示蛇的一節(jié)身體,身體每長一節(jié),增加一個矩形塊,蛇頭用倆節(jié)表示。移動時必須從蛇頭開始,所以蛇不能向相反的方向移動,如果不按任意鍵,蛇自行在當(dāng)前方向上前移,但按下有效方向鍵后,蛇頭朝著該方向移動,一步移動一節(jié)身體,所以按下有效方向鍵后,先確定蛇頭的位置,而后蛇的身體隨蛇頭移動,圖形的實現(xiàn)是從蛇頭新位置開始畫出蛇,這時,由于未清屏的原因,原來的蛇的位置和新蛇的位置差一個單位,所以看起來蛇多一節(jié)身體,所以將蛇的最后一節(jié)用背景色覆蓋。食物的出現(xiàn)與消失也是畫矩形塊和覆蓋矩形塊。為了便于理解,定義兩個結(jié)構(gòu)體:食物與蛇目的本程序?qū)崿F(xiàn)主要技巧在于java語言的應(yīng)用。目的在于提高編程的水平。采用eclipse開發(fā)工具,在windowsxp下進(jìn)行,基于安卓操作系統(tǒng)。環(huán)境搭建:1.JDK安裝2.Eclipse安裝3.AndroidSDK安裝JDK和Eclipse:JDK是Sun公司針對java開發(fā)員的產(chǎn)品。自從Java推出以來,JDK已經(jīng)成為使用最廣泛的javaSDK。JDK是整個java的核心。包括運行環(huán)境Java工具和Java根底類庫。JDK是學(xué)好Java的第一步。安裝Eclipse的開發(fā)環(huán)境需要JDK的支持,如果沒有JDK,那么啟動Eclipse時會報告錯誤。在windows上安裝JDK非常簡單首先在Sun官網(wǎng)上下載,按照默認(rèn)路徑進(jìn)行安裝。安裝完成之后,可以在檢查JDK是否安裝成功。翻開cmd窗口,輸入java–version查看JDK的版本信息。出現(xiàn)類似下面的畫面表示安裝成功了:圖JDK測試elipse如果你還沒有Eclipse的話,從官網(wǎng)上下載EclipseIDEforJavaDevelopers解壓之后即可使用。AndroidSDKAndroidSDK提供了在windows平臺上的開發(fā)安卓應(yīng)用程序的開發(fā)組件,也就是說,不管讀者使用什么樣的平臺都可以開發(fā)出安卓平臺的應(yīng)用軟件,其中包含了安卓平臺上開發(fā)移動應(yīng)用的各種工具集。它不僅包括了安卓模擬器和用于Eclipse的安卓開發(fā)工具插件〔ADT〕,而且包括了各種用來調(diào)試,打包盒在模擬器上安裝應(yīng)用的工具。安卓主要是以java語言為根底,用戶可以使用java語言來開發(fā)安卓平臺上的軟件應(yīng)用。通過SDK提供的一些工具將其打包成安卓平臺使用的apk文件,然后在使用SDK中的模擬器〔Emulator)來模擬和測試軟件在安卓平臺運行情況和效果。安裝安卓的SDK,安裝好JDK和Eclipse后,翻開EclipseIDE。依次單擊Menu項中的windows->AndroidSDKManager項,進(jìn)入AndroidSDKManager界面選擇Tool和需要的Android版本項進(jìn)行更新安裝。ADTAndroid為Eclipse定制了一個插件,及ADT〔AndroidDevelopmentTools〕,目的是為用戶提供一個強(qiáng)大的綜合環(huán)境用于開發(fā)Android應(yīng)用程序,ADT擴(kuò)展了Eclipse的功能,可以讓用戶快速的建立Android工程,創(chuàng)立應(yīng)用程序界面,在基于AndroidAPI的根底上添加組件,以及用SDK工具集調(diào)試應(yīng)用程序,甚至導(dǎo)出簽名〔或未簽名〕的APKs以便發(fā)行應(yīng)用程序。安裝AndroidDevelopmentToolplug-in,翻開EclipseIDE。依次單擊Menu項中的Help->SoftwareUpdate項在游戲界面中,以坐標(biāo)的形式對整體界面進(jìn)行劃分,將界面劃分為許多個小方格,還應(yīng)設(shè)計蛇的樣式,蘋果的樣式和墻的樣式,在蛇吃到蘋果后的樣式,以及游戲按什么鍵開始。設(shè)置游戲貪吃蛇初始時由固定個小矩形塊組成,并且,游戲中,要隨機(jī)出現(xiàn)由單個矩形塊構(gòu)成的蘋果,并且在設(shè)置蘋果的時候,還要設(shè)置,不能使將要出現(xiàn)的蘋果出現(xiàn)在蛇的身體之下,在蛇吃到蘋果的時候,要將蛇的身體加長。此外,要判定游戲成功與失敗的條件,當(dāng)蛇的頭和尾相撞或者蛇的頭部撞到了墻上,那么游戲失敗。另外蛇的移動原理,由外部按鍵設(shè)置監(jiān)聽控制蛇頭的移動方向,在方向的指引下進(jìn)行移動,蛇及蘋果的位置都是由坐標(biāo)數(shù)組確定的,蘋果的位置也是隨機(jī)產(chǎn)生的蛇的移動原理是后一矩形塊覆蓋前一個矩形塊。當(dāng)一個蘋果被吃掉的時候,要自動生成并顯示下一個蘋果的位置。這些都是在設(shè)計過程中需要實現(xiàn)的。游戲中需要通過按鍵對蛇的移動方位進(jìn)行控制,共需要設(shè)置四個方位,分別是“東〞“西〞“南〞“北〞,在按鍵上用“上〞“下〞“左〞“右〞,按鍵與執(zhí)行局部便涉及到監(jiān)聽,通過監(jiān)聽指示蛇的運動,此外,要設(shè)置蛇移動是的默認(rèn)方向為“上〞,設(shè)計過程中還應(yīng)注意,蛇的移動只能是90度偏轉(zhuǎn),不能進(jìn)行180度偏轉(zhuǎn)??尚行苑治鲐澇陨哂螒蚴且环N簡單的群眾的游戲,自從計算機(jī)實現(xiàn)以來,深受廣闊電腦玩家的喜愛,做一個簡單的貪吃蛇小游戲。
貪吃蛇的核心算法時如何實現(xiàn)移動和吃掉食物,沒有碰到食物的時候,把當(dāng)前運動方向上的下個節(jié)點入隊,并以蛇節(jié)點的顏色繪制這個節(jié)點,然后把頭指針?biāo)傅墓?jié)點出隊,并以游戲框架內(nèi)部背景色重繪出隊的節(jié)點,這樣就可以到達(dá)移動的效果。而在吃到食物的時候,那么只需把食物入隊即可。實現(xiàn)貪吃蛇的根本的蛇身移動、吃到食物身體增長、和碰到墻壁或自身死亡。本次設(shè)計我將主要運用java語言來完成。Java語言是一種跨平臺,適合于分布式計算環(huán)境的面向?qū)ο缶幊陶Z言,用Java寫的應(yīng)用程序不用修改就可在不同的軟硬件平臺上運行。由于Java主要用于網(wǎng)絡(luò)應(yīng)用程序開發(fā),因此對平安性有較高的要求。如果沒有平安保證,用戶從網(wǎng)絡(luò)下載程序執(zhí)行就非常危險。Java通過自己的平安機(jī)制防止了病毒程序的產(chǎn)生和下載程序?qū)Ρ镜叵到y(tǒng)的威脅破壞3.1貪吃蛇流程圖3.2總設(shè)計模塊的劃分游戲總設(shè)計模塊劃分為游戲主要界面模塊、游戲控制模塊。主要界面游戲主界面模塊主要是指游戲的框圖,其包括一下內(nèi)容:1、游戲界面的邊界,即游戲中的墻;2、游戲中蛇的構(gòu)成,以及蘋果的構(gòu)成;3.2.2游戲控制模塊游戲開始控制:我們的程序是使用點擊這里開始啟動游戲后會有一個初始菜單界面,游戲開始后蛇向下移動,然后由控制上下左右鍵來控制蛇的移動。在程序中我們重新建act來控制游戲的開始,使游戲的開始界美觀。4.詳細(xì)實現(xiàn)這個是,是游戲的文件總目錄,如下圖圖4.1游戲文件目錄4.1游戲窗口Snake類游戲的開始:oncreate此外的亮點是:setContentView(R.layout.snake_layout);設(shè)置窗口的布局文件,這里的snake_layout使用了自定義資源標(biāo)簽的方式,由于Android內(nèi)部的R.資源不包含SnakeView類,所以我們必須寫清楚Package,比方com.exmple.android.snake.SnakeView然后和其他控件使用一樣,都是一個id然后寬度、高度、以及自定義的標(biāo)簽tileSize〔尾巴長度〕,如下:<android:id="@+id/snake"android:layout_width="fill_parent"android:layout_height="fill_parent"tileSize="12"/>onPause:關(guān)于這點,大家可以參考下在blog中關(guān)于active生命周期在玩游戲過程中,如果有來電或是其它事件中斷,這時應(yīng)該把當(dāng)前狀態(tài)保存。以便返回時,還可以繼續(xù)玩游戲。這就使用onSaveInstanceState實現(xiàn)保存當(dāng)前狀態(tài)。圖4.2游戲窗口4.2生成方塊TileView類TileView,從名稱上不難看出這是一個方磚類,就是生成一個方塊。TileView使用了Android平臺的顯示基類View,View類是直接從java.lang.Object派生出來的,是各種控件比方TextView、EditView的基類,當(dāng)然包括我們的窗口Activity類,這些在SDK文檔中都說的比擬清楚。
這里定義了5個int型全局的變量,分別是方磚的數(shù)量mTileSize;方磚水平x防線的數(shù)量mXTileCount;以及豎直y方向上的方磚數(shù)量mYTileCount,下面是一個相對偏移位置mXOffset和mYOffset;這里android主要讓要大家了解如何自定義View在Android開發(fā)中,在一個View類中主要是重寫onSizeChanged方法來控制改變局部,以及onDraw實現(xiàn)畫布的修改,實現(xiàn)的代碼如下:publicTileView(Contextcontext,AttributeSetattrs){super(context,attrs);ributes(attrs, R.styleable.TileView);mTileSize=a.getInt(R.styleable.TileView_tileSize,12); a.recycle(); }publicvoidresetTiles(inttilecount){mTileArray=newBitmap[tilecount]; }@OverrideprotectedvoidonSizeChanged(intw,inth,intoldw,intoldh){mXTileCount=(int)Math.floor(w/mTileSize);mYTileCount=(int)Math.floor(h/mTileSize);mXOffset=((w-(mTileSize*mXTileCount))/2);mYOffset=((h-(mTileSize*mYTileCount))/2);mTileGrid=newint[mXTileCount][mYTileCount]; clearTiles(); }
我們自定義的TileView類需要自己添加一個構(gòu)造方法,根據(jù)需要,我們還重載了一種包含樣式的方法,這里大家可以多看下Gallery控件的實現(xiàn),就好理解了,下面是根本框架。
publicTileView(Contextcontext,AttributeSetattrs,intdefStyle){super(context,attrs,defStyle);}
publicTileView(Contextcontext,AttributeSetattrs){super(context,attrs);}
在貪食蛇游戲中我們知道Snake是移動的,所以參加了一個去除顯示的clearTiles方法,通過一個二維數(shù)組保存一個gird網(wǎng)格型的運動軌跡,下一次我們將會講解android貪食蛇的游戲邏輯和完整的關(guān)聯(lián)拼接實現(xiàn)。代碼如下:publicvoidclearTiles(){for(intx=0;x<mXTileCount;x++){for(inty=0;y<mYTileCount;y++){ setTile(0,x,y); } } }publicvoidsetTile(inttileindex,intx,inty){mTileGrid[x][y]=tileindex; }具體的實現(xiàn)如下圖。圖4.3蛇身和點及其位置4.3游戲?qū)嶓wSnakeView類在這個類中實現(xiàn)的游戲的實體,從游戲需求的角色,這個游戲包括了如下方面:隨機(jī)產(chǎn)生小方塊,小方塊這里是復(fù)數(shù),當(dāng)然是是大于1個蘋果,所以代碼中產(chǎn)生了兩個蘋果。游戲狀態(tài)管理畫蛇,view的更新吃掉小方塊后小蛇狀態(tài)的變化畫圍墻SnakeView定義類:intmMode=READY;publicstaticfinalintPAUSE=0;publicstaticfinalintREADY=1;publicstaticfinalintRUNNING=2;publicstaticfinalintLOSE=3;分別表示準(zhǔn)備開始、運行狀態(tài)、游戲結(jié)束。如圖4.4是游戲開始狀態(tài)。圖4.4游戲開始如圖4.5是游戲運行狀態(tài)。圖4.5游戲運行狀態(tài)如圖4.6是游戲的結(jié)束狀態(tài)。圖4.6游戲結(jié)束通過以下的測試用例進(jìn)行對游戲各功能模塊的測試并加以修改,如表5.1所示。測試編號測試輸入期望結(jié)果實際結(jié)果001測試點擊游戲開始后的狀態(tài)游戲開始,進(jìn)入游戲開始界面游戲開始,進(jìn)入游戲開始界面002測試點擊上方向鍵后的狀態(tài)貪吃蛇會向上方轉(zhuǎn)彎貪吃蛇會向上方轉(zhuǎn)彎003測試點擊下方向鍵后的狀態(tài)貪吃蛇會向下方轉(zhuǎn)彎貪吃蛇會向下方轉(zhuǎn)彎004測試點擊左方向鍵后的狀態(tài)貪吃蛇會向左方轉(zhuǎn)彎貪吃蛇會向左方轉(zhuǎn)彎005測試點擊右方向鍵后的狀態(tài)貪吃蛇會向右方轉(zhuǎn)彎貪吃蛇會向右方轉(zhuǎn)彎006測試貪吃蛇吃到果實后的狀態(tài)貪吃蛇會變長貪吃蛇蛇會變長。007測試貪吃蛇撞墻后會怎樣游戲結(jié)束,顯示游戲結(jié)束界面游戲結(jié)束,顯示游戲結(jié)束界面表5.1測試用例表1.測試點擊游戲開始后的狀態(tài),點擊屏幕后開始游戲,測試成功,如圖5.2所示。圖5.2游戲開始2.測試點擊上方向鍵后后狀態(tài),圖5.3貪吃蛇向上轉(zhuǎn)彎3.測試點擊下方向鍵后的狀態(tài),貪吃蛇會向下方轉(zhuǎn)彎,測試成功。如圖5.4所示。圖5.4,貪吃蛇向下轉(zhuǎn)彎5.測試點擊左方向鍵后的狀態(tài),貪吃蛇會向左方轉(zhuǎn)彎,測試成功。如圖5.5所示。圖5.5貪吃蛇向右6.測試點擊右方向鍵后的狀態(tài),貪吃蛇會向右方轉(zhuǎn)彎,測試成功。如圖5.6所示。圖5.6貪吃蛇向右轉(zhuǎn)彎7.測試貪吃蛇吃到果實后的狀態(tài),貪吃蛇會變長,測試成功,如圖5.7所示。圖5.7貪吃蛇變長8.測試貪吃蛇撞墻后會游戲結(jié)束且顯示吃掉果實數(shù),測試成功,如圖5.8所示。圖5.8貪吃蛇撞墻,游戲結(jié)束回憶這個設(shè)計過程,我學(xué)到了許多書本上沒有學(xué)到的知識。通過這次自己制作的軟件,豐富了自己的實踐技能,擴(kuò)展了本專業(yè)的知識面,使我受益非淺,同時也體驗到了搞軟件開發(fā)的困難度。在這次設(shè)計的同時,我又從中學(xué)到了許多東西。但由于我對這樣的軟件開發(fā)還只是一個開始,了解的不多,這其中或許還有很多的缺乏,有些模塊做得不是很好,界面的設(shè)計及整體的布局還比擬簡單,沒有突出特色出來,這也可能是我這個系統(tǒng)的缺乏之處,在這里也懇請老師能夠?qū)ξ业淖髌分该魅狈Σ⒓右愿恼?。總之,在這一次的課程設(shè)計過程中,我查閱了大量的資料,對Java有了一點初步的認(rèn)識,對于軟件工程這些輔助性的教材也穩(wěn)固了不少,為我這次的課設(shè)提供了很大的幫助,鍛煉了我的能力讓我掌握了一門新的程序設(shè)計語言:java語言,系統(tǒng)地學(xué)習(xí)了數(shù)據(jù)庫方面的知識,并更進(jìn)一步提高了我在程序設(shè)計、調(diào)試方面的技巧。更重要的是,它還讓我認(rèn)識到了自己的缺乏,在編程方面,我僅僅是剛剛?cè)腴T而已,以后的道路任重道遠(yuǎn),需要我不斷的豐富自己、充實自己,這樣才能在程序設(shè)計方面有所收獲。
參考文獻(xiàn)[1]沈澤剛,秦玉平.Java語言程序設(shè)計[M].清華大學(xué)出版社,2023[2]陳昊鵬[同譯者作品].Java編程思想(第4版).機(jī)械工業(yè)出版社,2007[3]耿祥義,張躍平.Java實用教程〔第三版〕.清華大學(xué)出版社,2006[4]馬占欣,李亞,陸玉昌.用遺傳算法解決博弈問題.河南科學(xué),2007,25(2):273-277。北大學(xué)學(xué)報,2005,126(10):949-952.。[5]王贈凱,呂維先.機(jī)器博弈搜索技術(shù)分析.軟件導(dǎo)刊,2007,2:26-27。[6]張從明、馬京成.網(wǎng)絡(luò)教學(xué)設(shè)計.第四軍醫(yī)大學(xué)出版社,2004。附錄packagecom.xmobileapp.Snake;importandroid.app.Activity;importandroid.graphics.Color;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.Message;importandroid.view.View;importandroid.view.Window;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.ImageButton;importandroid.widget.TextView;publicclassSnakeextendsActivityimplementsOnClickListener{ privatefinalstaticintPLAY=1; privatefinalstaticintLEFT=2; privatefinalstaticintRIGHT=3; privatefinalstaticintUP=4; privatefinalstaticintDOWN=5; privateSnakeViewmSnakeView; privatestaticStringICICLE_KEY="snake-view"; privateButtonplay; privateImageButtonleft; privateImageButtonright; privateImageButtonup; privateImageButtondown; privateUpdateStatusupdateStatus; privateHandlerhandler; protectedstaticfinalintGUINOTIFIER=0x1234; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.snake_layout); mSnakeView=(SnakeView)findViewById(R.id.snake); mSnakeView.setTextView((TextView)findViewById(R.id.text)); play=(Button)findViewById(R.id.play); play.setId(PLAY); play.setOnClickListener(this); play.setBackgroundColor(Color.argb(0,0,255,0)); left=(ImageButton)findViewById(R.id.left); left.setId(LEFT); left.setOnClickListener(this); left.setBackgroundColor(Color.argb(1,1,255,1)); left.setVisibility(View.GONE); right=(ImageButton)findViewById(R.id.right); right.setId(RIGHT); right.setOnClickListener(this); right.setBackgroundColor(Color.argb(1,1,255,1)); right.setVisibility(View.GONE); up=(ImageButton)findViewById(R.id.up); up.setId(UP); up.setOnClickListener(this); up.setBackgroundColor(Color.argb(1,1,255,1)); up.setVisibility(View.GONE); down=(ImageButton)findViewById(R.id.down); down.setId(DOWN); down.setOnClickListener(this); down.setBackgroundColor(Color.argb(1,1,255,1)); down.setVisibility(View.GONE); if(savedInstanceState==null){ mSnakeView.setMode(mSnakeView.READY); }else{ Bundlemap=savedInstanceState.getBundle(ICICLE_KEY); if(map!=null){ mSnakeView.restoreState(map); }else{ mSnakeView.setMode(SnakeView.PAUSE); } } handler=newHandler(){ publicvoidhandleMessage(Messagemsg){ switch(msg.what){ caseSnake.GUINOTIFIER: play.setVisibility(View.VISIBLE); left.setVisibility(View.GONE); right.setVisibility(View.GONE); up.setVisibility(View.GONE); down.setVisibility(View.GONE); break; } super.handleMessage(msg); } }; } @Override protectedvoidonPause(){ super.onPause(); mSnakeView.setMode(SnakeView.PAUSE); } @Override publicvoidonSaveInstanceState(BundleoutState){ outState.putBundle(ICICLE_KEY,mSnakeView.saveState()); } publicvoidonClick(Viewv){ switch(v.getId()){ casePLAY: play.setVisibility(View.GONE); left.setVisibility(View.VISIBLE); right.setVisibility(View.VISIBLE); up.setVisibility(View.VISIBLE); down.setVisibility(View.VISIBLE); |mSnakeView.mMode==mSnakeView.LOSE){ mSnakeView.initNewGame(); mSnakeView.setMode(mSnakeView.RUNNING); mSnakeView.update(); updateStatus=newUpdateStatus(); updateStatus.start(); break; } if(mSnakeView.mMode==mSnakeView.PAUSE){ mSnakeView.setMode(mSnakeView.RUNNING); mSnakeView.update(); break; } if(mSnakeView.mDirection!=mSnakeView.SOUTH){ mSnakeView.mNextDirection=mSnakeView.NORTH; break; } break; caseLEFT: if(mSnakeView.mDirection!=mSnakeView.EAST){ mSnakeView.mNextDirection=mSnakeView.WEST; } break; caseRIGHT: if(mSnakeView.mDirection!=mSnakeView.WEST){ mSnakeView.mNextDirection=mSnakeView.EAST; } break; caseUP: if(mSnakeView.mDirection!=mSnakeView.SOUTH){ mSnakeView.mNextDirection=mSnakeView.NORTH; } break; caseDOWN: if(mSnakeView.mDirection!=mSnakeView.NORTH){ mSnakeView.mNextDirection=mSnakeView.SOUTH; } break; default: break; } } classUpdateStatusextendsThread{ @Override publicvoidrun(){ super.run(); while(true){ if(mSnakeView.mMode==mSnakeView.LOSE){ Messagem=newMessage(); m.what=Snake.GUINOTIFIER; Snake.this.handler.sendMessage(m); break; } try{ Thread.sleep(1000); }catch(InterruptedExceptione){ e.printStackTrace(); } } } }}<?xmlversion="1.0"encoding="utf-8"?><FrameLayoutxmlns:android="://schemas.android/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"><android:id="@+id/snake"android:layout_width="fill_parent"android:layout_height="fill_parent"tileSize="12"android:background="@color/teneight"/><RelativeLayoutandroid:layout_width="fill_pa
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 智慧城市和網(wǎng)絡(luò)安全防護(hù)的重要意義考核試卷
- 2024至2030年中國音箱毯數(shù)據(jù)監(jiān)測研究報告
- 《男護(hù)士工作滿意度與職業(yè)倦怠相關(guān)研究》
- 《云計算產(chǎn)業(yè)動態(tài)跟蹤及趨勢洞察月報(2024年4月)》范文
- 地下礦山開采安全職工培訓(xùn)講義考核試卷
- 擔(dān)保協(xié)議:確保協(xié)議履行細(xì)節(jié)與責(zé)任
- 家用紡織品的市場競爭力分析與市場行銷策略考核試卷
- 2024至2030年中國紙類香袋數(shù)據(jù)監(jiān)測研究報告
- 2024-2030年中國植物提取物行業(yè)深度調(diào)研及投資價值研究報告
- 海洋漁業(yè)資源保護(hù)與開發(fā)
- 小學(xué)六年級下冊綜合實踐活動.風(fēng)味火鍋我設(shè)計--(15張)ppt
- 基本函數(shù)的導(dǎo)數(shù)表
- 電力現(xiàn)貨市場基礎(chǔ)知識(課堂PPT)
- 掛牌儀式流程方案
- 電路分析教程第三版答案 燕慶明
- 四川省特種車輛警報器和標(biāo)志燈具申請表
- 20200310公園安全風(fēng)險辨識清單
- 華中科技大學(xué)官方信紙
- WI-QA-02-034A0 燈具成品檢驗標(biāo)準(zhǔn)
- 農(nóng)業(yè)信息技術(shù) chapter5 地理信息系統(tǒng)
- 部編版六年級上語文閱讀技巧及解答
評論
0/150
提交評論