安卓大作業(yè)-貪吃蛇_第1頁
安卓大作業(yè)-貪吃蛇_第2頁
安卓大作業(yè)-貪吃蛇_第3頁
安卓大作業(yè)-貪吃蛇_第4頁
安卓大作業(yè)-貪吃蛇_第5頁
已閱讀5頁,還剩25頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

PAGEPAGE14實訓報告實訓項目名稱基于安卓貪吃蛇游戲的開發(fā)與測試二級學院信息工程學院專業(yè)班級11級計科(2)班姓名操瑋康、方剛、聶順濤、肖洋學號1142151201、05、17、27日期項目名稱基于安卓貪吃蛇游戲的開發(fā)與測試地點教13605報告內(nèi)容貪吃蛇游戲開發(fā),首先它可以為大家提供一種當前比較流行的休閑小游戲。貪吃蛇是家喻戶曉的益智類小游戲,選擇這個題目一是為了將自己的所學知識加以運用,二是一直以來貪吃蛇這個游戲就深深地吸引著很多人。在這次的實驗中我們介紹了安卓的背景還有貪吃蛇的背景。對我們的游戲進行了各種需求的分析,然后對我們的游戲進行設(shè)計,設(shè)計分成各個模塊。設(shè)計完了之后就是實現(xiàn)了,通過Eclipse進行編寫程序設(shè)計完成,最后就是我們的工程測試部分,經(jīng)過測試,最終成功的完成了游戲的設(shè)計。教師評語成績:教師簽名:摘要Google公司2007年11月5日發(fā)布Android平臺

——

一款包括操作系統(tǒng)(基于Linux內(nèi)核)、中間件和關(guān)鍵應用的手機平臺,并組建了開放手機聯(lián)盟(Open

Handset

Alliance),包括Google、中國移T-Mobile、宏達電、高通、摩托羅拉等領(lǐng)軍企業(yè)。

本課題是利用java語言在Android平臺上進行手機游戲的開發(fā),由于本人知識的有限,以及客觀條件的限制,本人打算開發(fā)一個單機版的游戲。后來得知這個小小的游戲是nokia當年很成功的一款手機游戲,許多人都玩過,也很喜歡?,F(xiàn)在這款游戲的版本已經(jīng)發(fā)展到第三版了,手機生產(chǎn)廠商繼續(xù)開發(fā)這個游戲,看來這個游戲還是有很大的市場的。于是,我決定利用自己大學所學的知識,自己在指導老師的幫助下,獨立開發(fā)這個小游戲。

本文首先詳細介紹了java的一些基本的知識點,在此基礎(chǔ)上引出了Android,介紹了Android的基礎(chǔ)以及其特點,然后介紹了一下Android將來的一些前景和發(fā)展。重點說明了這個貪吃蛇程序所用到的一些類和控件。介紹了這些類的一般的使用方法,以及本程序是如何使用這些類來進行游戲的開發(fā)的。關(guān)鍵詞:Android系統(tǒng);

貪食蛇游戲目錄1.緒論 41.1開發(fā)背景 41.1.1安卓系統(tǒng)簡介 41.1.2游戲簡介 41.2開發(fā)目的及意義 41.3開發(fā)環(huán)境及工具 51.4游戲系統(tǒng)開發(fā)平臺及搭建 52.需求分析 72.1游戲界面分析 72.2游戲角色分析 72.3游戲控制分析 72.4可行性分析 73.總體設(shè)計 83.1貪吃蛇流程圖 83.2總設(shè)計模塊的劃分 93.2.1主要界面 93.2.2游戲控制模塊 94.詳細實現(xiàn) 104.1游戲窗口Snake類 104.2生成方塊TileView類 114.3游戲?qū)嶓wSnakeView類 135.測試 155.1測試用列 155.2測試用列展示圖 156.結(jié)論 20附錄 221.緒論1.1開發(fā)背景1.1.1安卓系統(tǒng)簡介安卓系統(tǒng)作為新興的手機操作系統(tǒ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)核只提供基本功能,其他的應用軟件則由各公司自行開發(fā),部分程序以Java編寫。1.1.2游戲簡介1976年,Gremlin平臺推出了一款經(jīng)典街機游戲Blockade。游戲中,兩名玩家分別控制一個角色在屏幕上移動,所經(jīng)之處砌起圍欄。角色只能向左、右方向90度轉(zhuǎn)彎,游戲目標保證讓對方先撞上屏幕或圍欄。聽起來有點復雜?其實就是下面這個樣子:

基本上就是兩條每走一步都會長大的貪吃蛇比誰后完蛋,玩家要做的就是避免撞上障礙物和越來越長的身體。更多照片、視頻可以看GamesDBase的介紹。

Blockade很受歡迎,類似的游戲先后出現(xiàn)在Atari2600、TRS-80、蘋果2等早期游戲機、計算機上。但真正讓這種游戲形式紅遍全球的還是21年后隨諾基亞手機走向世界的貪吃蛇游戲——Snake。貪吃蛇游戲是一款老牌的手機游戲,同時也是一款比較需要耐心地游戲。貪吃蛇游戲就是一條小蛇,不停地在屏幕上游走,吃各個方向出現(xiàn)的食物,越吃越長。只要蛇頭碰到屏幕四周,或者碰到自己的身子,小蛇就立即斃命。玩“貪吃蛇游戲”,難度最大的不是蛇長得很長的時候,而是開始的時候。那時蛇身很短,看上去難度不大,卻最容易死掉,因為把玩一條小蛇讓人容易走神,失去耐心。1.2開發(fā)目的及意義通過本次課程設(shè)計,了解android軟件的開發(fā)過程,熟悉并掌握JAVA語言,HTML.程序關(guān)鍵在于表示蛇的圖形及蛇的移動。用一個小矩形快表示蛇的一節(jié)身體,身體每長一節(jié),增加一個矩形塊,蛇頭用倆節(jié)表示。移動時必須從蛇頭開始,所以蛇不能向相反的方向移動,如果不按任意鍵,蛇自行在當前方向上前移,但按下有效方向鍵后,蛇頭朝著該方向移動,一步移動一節(jié)身體,所以按下有效方向鍵后,先確定蛇頭的位置,而后蛇的身體隨蛇頭移動,圖形的實現(xiàn)是從蛇頭新位置開始畫出蛇,這時,由于未清屏的原因,原來的蛇的位置和新蛇的位置差一個單位,所以看起來蛇多一節(jié)身體,所以將蛇的最后一節(jié)用背景色覆蓋。食物的出現(xiàn)與消失也是畫矩形塊和覆蓋矩形塊。為了便于理解,定義兩個結(jié)構(gòu)體:食物與蛇目的本程序?qū)崿F(xiàn)主要技巧在于java語言的應用。目的在于提高編程的水平。1.3開發(fā)環(huán)境及工具采用eclipse開發(fā)工具,在windowsxp下進行,基于安卓操作系統(tǒng)。環(huán)境搭建:1.JDK安裝2.Eclipse安裝3.AndroidSDK安裝1.4游戲系統(tǒng)開發(fā)平臺及搭建JDK和Eclipse:JDK是Sun公司針對java開發(fā)員的產(chǎn)品。自從Java推出以來,JDK已經(jīng)成為使用最廣泛的javaSDK。JDK是整個java的核心。包括運行環(huán)境Java工具和Java基礎(chǔ)類庫。JDK是學好Java的第一步。安裝Eclipse的開發(fā)環(huán)境需要JDK的支持,如果沒有JDK,則啟動Eclipse時會報告錯誤。在windows上安裝JDK非常簡單首先在Sun官網(wǎng)上下載,按照默認路徑進行安裝。安裝完成之后,可以在檢查JDK是否安裝成功。打開cmd窗口,輸入java–version查看JDK的版本信息。出現(xiàn)類似下面的畫面表示安裝成功了:圖1.4JDK測試elipse如果你還沒有Eclipse的話,從官網(wǎng)上下載EclipseIDEforJavaDevelopers解壓之后即可使用。AndroidSDKAndroidSDK提供了在windows平臺上的開發(fā)安卓應用程序的開發(fā)組件,也就是說,不論讀者使用什么樣的平臺都可以開發(fā)出安卓平臺的應用軟件,其中包含了安卓平臺上開發(fā)移動應用的各種工具集。它不僅包括了安卓模擬器和用于Eclipse的安卓開發(fā)工具插件(ADT),而且包括了各種用來調(diào)試,打包盒在模擬器上安裝應用的工具。安卓主要是以java語言為基礎(chǔ),用戶可以使用java語言來開發(fā)安卓平臺上的軟件應用。通過SDK提供的一些工具將其打包成安卓平臺使用的apk文件,然后在使用SDK中的模擬器(Emulator)來模擬和測試軟件在安卓平臺運行情況和效果。安裝安卓的SDK,安裝好JDK和Eclipse后,打開EclipseIDE。依次單擊Menu項中的windows->AndroidSDKManager項,進入AndroidSDKManager界面選擇Tool和需要的Android版本項進行更新安裝。ADTAndroid為Eclipse定制了一個插件,及ADT(AndroidDevelopmentTools),目的是為用戶提供一個強大的綜合環(huán)境用于開發(fā)Android應用程序,ADT擴展了Eclipse的功能,可以讓用戶快速的建立Android項目,創(chuàng)建應用程序界面,在基于AndroidAPI的基礎(chǔ)上添加組件,以及用SDK工具集調(diào)試應用程序,甚至導出簽名(或未簽名)的APKs以便發(fā)行應用程序。安裝AndroidDevelopmentToolplug-in,打開EclipseIDE。依次單擊Menu項中的Help->SoftwareUpdate項2.需求分析2.1游戲界面分析在游戲界面中,以坐標的形式對整體界面進行劃分,將界面劃分為許多個小方格,還應設(shè)計蛇的樣式,蘋果的樣式和墻的樣式,在蛇吃到蘋果后的樣式,以及游戲按什么鍵開始。2.2游戲角色分析設(shè)置游戲貪吃蛇初始時由固定個小矩形塊組成,并且,游戲中,要隨機出現(xiàn)由單個矩形塊構(gòu)成的蘋果,并且在設(shè)置蘋果的時候,還要設(shè)置,不能使將要出現(xiàn)的蘋果出現(xiàn)在蛇的身體之下,在蛇吃到蘋果的時候,要將蛇的身體加長。此外,要判定游戲成功與失敗的條件,當蛇的頭和尾相撞或者蛇的頭部撞到了墻上,則游戲失敗。另外蛇的移動原理,由外部按鍵設(shè)置監(jiān)聽控制蛇頭的移動方向,在方向的指引下進行移動,蛇及蘋果的位置都是由坐標數(shù)組確定的,蘋果的位置也是隨機產(chǎn)生的蛇的移動原理是后一矩形塊覆蓋前一個矩形塊。當一個蘋果被吃掉的時候,要自動生成并顯示下一個蘋果的位置。這些都是在設(shè)計過程中需要實現(xiàn)的。2.3游戲控制分析游戲中需要通過按鍵對蛇的移動方位進行控制,共需要設(shè)置四個方位,分別是“東”“西”“南”“北”,在按鍵上用“上”“下”“左”“右”,按鍵與執(zhí)行部分便涉及到監(jiān)聽,通過監(jiān)聽指示蛇的運動,此外,要設(shè)置蛇移動是的默認方向為“上”,設(shè)計過程中還應注意,蛇的移動只能是90度偏轉(zhuǎn),不能進行180度偏轉(zhuǎn)。2.4可行性分析貪吃蛇游戲是一種簡單的大眾的游戲,自從計算機實現(xiàn)以來,深受廣大電腦玩家的喜愛,做一個簡單的貪吃蛇小游戲。

貪吃蛇的核心算法時如何實現(xiàn)移動和吃掉食物,沒有碰到食物的時候,把當前運動方向上的下個節(jié)點入隊,并以蛇節(jié)點的顏色繪制這個節(jié)點,然后把頭指針所指的節(jié)點出隊,并以游戲框架內(nèi)部背景色重繪出隊的節(jié)點,這樣就可以達到移動的效果。而在吃到食物的時候,則只需把食物入隊即可。實現(xiàn)貪吃蛇的基本的蛇身移動、吃到食物身體增長、和碰到墻壁或自身死亡。本次設(shè)計我將主要運用java語言來完成。Java語言是一種跨平臺,適合于分布式計算環(huán)境的面向?qū)ο缶幊陶Z言,用Java寫的應用程序不用修改就可在不同的軟硬件平臺上運行。由于Java主要用于網(wǎng)絡(luò)應用程序開發(fā),因此對安全性有較高的要求。如果沒有安全保證,用戶從網(wǎng)絡(luò)下載程序執(zhí)行就非常危險。Java通過自己的安全機制防止了病毒程序的產(chǎn)生和下載程序?qū)Ρ镜叵到y(tǒng)的威脅破壞3.總體設(shè)計3.1貪吃蛇流程圖貪吃蛇程序的大致運行如圖3.1所示圖3.1流程圖3.2總設(shè)計模塊的劃分游戲總設(shè)計模塊劃分為游戲主要界面模塊、游戲控制模塊。3.2.1主要界面游戲主界面模塊主要是指游戲的框圖,其包括一下內(nèi)容:1、游戲界面的邊界,即游戲中的墻;2、游戲中蛇的構(gòu)成,以及蘋果的構(gòu)成;3.2.2游戲控制模塊游戲開始控制:我們的程序是使用點擊這里開始啟動游戲后會有一個初始菜單界面,游戲開始后蛇向下移動,然后由控制上下左右鍵來控制蛇的移動。在程序中我們重新建act來控制游戲的開始,使游戲的開始界美觀。4.詳細實現(xiàn)這個是,是游戲的文件總目錄,如圖4.1所示圖4.1游戲文件目錄4.1游戲窗口Snake類游戲的開始:oncreate此外的亮點是:setContentView(R.layout.snake_layout);設(shè)置窗口的布局文件,這里的snake_layout使用了自定義資源標簽的方式,由于Android內(nèi)部的R.資源不包含SnakeView類,所以我們必須寫清楚Package,比如com.exmple.android.snake.SnakeView然后和其他控件使用一樣,都是一個id然后寬度、高度、以及自定義的標簽tileSize(尾巴長度),如下:

<com.example.android.snake.SnakeView android:id="@+id/snake" android:layout_width="fill_parent"android:layout_height="fill_parent"tileSize="12"/>onPause:關(guān)于這點,大家可以參考下在blog中關(guān)于active生命周期在玩游戲過程中,如果有來電或是其它事件中斷,這時應該把當前狀態(tài)保存。以便返回時,還可以繼續(xù)玩游戲。這就使用onSaveInstanceState實現(xiàn)保存當前狀態(tài)。游戲窗口如圖4.2所示圖4.2游戲窗口4.2生成方塊TileView類TileView,從名稱上不難看出這是一個方磚類,就是生成一個方塊。TileView使用了Android平臺的顯示基類View,View類是直接從java.lang.Object派生出來的,是各種控件比如TextView、EditView的基類,當然包括我們的窗口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); TypedArraya=context.obtainStyledAttributes(attrs, R.styleable.TileView); mTileSize=a.getInt(R.styleable.TileView_tileSize,12); a.recycle(); } publicvoidresetTiles(inttilecount){ mTileArray=newBitmap[tilecount]; } @Override protectedvoidonSizeChanged(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蛇身和點及其位置4.3游戲?qū)嶓wSnakeView類在這個類中實現(xiàn)的游戲的實體,從游戲需求的角色,這個游戲包括了如下方面:隨機產(chǎn)生小方塊,小方塊這里是復數(shù),當然是是大于1個蘋果,所以代碼中產(chǎn)生了兩個蘋果。游戲狀態(tài)管理畫蛇,view的更新吃掉小方塊后小蛇狀態(tài)的變化畫圍墻SnakeView定義類:intmMode=READY; publicstaticfinalintPAUSE=0; publicstaticfinalintREADY=1; publicstaticfinalintRUNNING=2; publicstaticfinalintLOSE=3;分別表示準備開始、運行狀態(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é)束5.測試5.1測試用列通過以下的測試用例進行對游戲各功能模塊的測試并加以修改,如表5.1所示。測試編號測試輸入期望結(jié)果實際結(jié)果001測試點擊游戲開始后的狀態(tài)游戲開始,進入游戲開始界面游戲開始,進入游戲開始界面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測試用例表5.2測試用列展示圖1.測試點擊游戲開始后的狀態(tài),點擊屏幕后開始游戲,測試成功,如圖5.2所示。圖5.2游戲開始2.測試點擊上方向鍵后后狀態(tài),貪吃蛇會向上方轉(zhuǎn)彎,測試成功,如圖5.3所示圖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é)束6.結(jié)論回顧這個設(shè)計過程,我學到了許多書本上沒有學到的知識。通過這次自己制作的軟件,豐富了自己的實踐技能,擴展了本專業(yè)的知識面,使我受益非淺,同時也體驗到了搞軟件開發(fā)的困難度。在這次設(shè)計的同時,我又從中學到了許多東西。但由于我對這樣的軟件開發(fā)還只是一個開始,了解的不多,這其中或許還有很多的不足,有些模塊做得不是很好,界面的設(shè)計及整體的布局還比較簡單,沒有突出特色出來,這也可能是我這個系統(tǒng)的不足之處,在這里也懇請老師能夠?qū)ξ业淖髌分该鞑蛔悴⒓右愿恼?。總之,在這一次的課程設(shè)計過程中,我查閱了大量的資料,對Java有了一點初步的認識,對于軟件工程這些輔助性的教材也鞏固了不少,為我這次的課設(shè)提供了很大的幫助,鍛煉了我的能力讓我掌握了一門新的程序設(shè)計語言:java語言,系統(tǒng)地學習了數(shù)據(jù)庫方面的知識,并更進一步提高了我在程序設(shè)計、調(diào)試方面的技巧。更重要的是,它還讓我認識到了自己的不足,在編程方面,我僅僅是剛剛?cè)腴T而已,以后的道路任重道遠,需要我不斷的豐富自己、充實自己,這樣才能在程序設(shè)計方面有所收獲。

參考文獻

[1]沈澤剛,秦玉平.Java語言程序設(shè)計[M].清華大學出版社,2009[2]陳昊鵬[同譯者作品].Java編程思想(第4版).機械工業(yè)出版社,2007[3]耿祥義,張躍平.Java實用教程(第三版).清華大學出版社,2006[4]馬占欣,李亞,陸玉昌.用遺傳算法解決博弈問題.河南科學,2007,25(2):273-277。北大學學報,2005,126(10):949-952.。[5]王贈凱,呂維先.機器博弈搜索技術(shù)分析.軟件導刊,2007,2:26-27。[6]張從明、馬京成.網(wǎng)絡(luò)教學設(shè)計.第四軍醫(yī)大學出版社,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); if(mSnakeView.mMode==mSnakeView.READY |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="/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <com.xmobileapp.Snake.SnakeView android:id="@+id/snake" android:layout_width="fill_parent"android:layout_height="fill_parent"tileSize="12"android:background="@color/teneight"/> <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/text" android:visibility="visible" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:gravity="center_horizontal" android:textColor="#FF0033" android:textSize="24sp"/>

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論