根據(jù)android的貪吃蛇游戲設(shè)計(jì)與開發(fā)_第1頁
根據(jù)android的貪吃蛇游戲設(shè)計(jì)與開發(fā)_第2頁
根據(jù)android的貪吃蛇游戲設(shè)計(jì)與開發(fā)_第3頁
根據(jù)android的貪吃蛇游戲設(shè)計(jì)與開發(fā)_第4頁
根據(jù)android的貪吃蛇游戲設(shè)計(jì)與開發(fā)_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、姓 名西安思源學(xué)院課程實(shí)訓(xùn)報(bào)告課程名稱計(jì)算機(jī)系統(tǒng)綜合實(shí)訓(xùn)_課題名稱基于 Android的貪吃蛇游戲開發(fā)專業(yè)_ 計(jì)算機(jī)軟件技術(shù)_班 級_學(xué)號132040800211_指導(dǎo)教師王英強(qiáng)_2015 年 6 月 4 日目錄1、程序構(gòu)思 .42、程序設(shè)計(jì).52.1游戲功能.522總設(shè)計(jì)模塊的劃分 .62.3游戲主界面模塊 .62.4游戲控制模塊.62.5類模塊設(shè)計(jì) .73、程序?qū)崿F(xiàn).73.1、游戲界面的實(shí)現(xiàn) .73.2、游戲整個框架的構(gòu)建 .93.3、 實(shí)現(xiàn)鍵盤響應(yīng)事件 .143.4、 刷新.153.4、 實(shí)現(xiàn)頁面的切換 .153.5、加載游戲.163.6、 游戲背景界面的改進(jìn) .1.63.8、 添加音效

2、.1.63.9、 游戲本身的完善 .163、類模塊具體設(shè)計(jì).19TitleView.java .19Sn akeView.java.194.程序結(jié)果.225.總結(jié)與展望.256.附錄.261、程序構(gòu)思貪吃蛇游戲是一款非常經(jīng)典的手機(jī)游戲,貪吃蛇游戲的設(shè)計(jì)比較復(fù)雜,它涉及面廣、牽涉方面多,如果不好好考慮和設(shè)計(jì),將難以成功開發(fā)出這個游戲。在這個游戲的設(shè)計(jì)中,牽涉到圖形界面的顯示與更新、數(shù)據(jù)的收集與更新,并且在這個游戲的開發(fā)中,還要應(yīng)用類的繼承機(jī)制以及一些設(shè)計(jì)模式。因此,在設(shè)計(jì)開發(fā)過程中, 需要處理好各個類之間間的邏輯依賴關(guān)系和數(shù)據(jù)通信關(guān)系。正是因?yàn)槿绱?,本次設(shè)計(jì)的目的在于學(xué)習(xí)Java程序設(shè)計(jì)基本技術(shù)

3、,學(xué)習(xí)用an droid開發(fā)Java程序的相關(guān)技術(shù),熟悉游戲“貪吃蛇”的需求,熟悉項(xiàng)目開發(fā)的完整過程。學(xué)會怎樣進(jìn)行一 個項(xiàng)目的需求分析、概要設(shè)計(jì)、詳細(xì)設(shè)計(jì)等軟件開發(fā)過程,熟練地掌握J(rèn)ava程序設(shè)計(jì)的基本技術(shù)和方法,熟練地掌握an droid環(huán)境的使用方法,培養(yǎng)初步的項(xiàng)目分析能力和程序設(shè) 計(jì)能力。2.1 游戲功能本系統(tǒng)主要完成以下幾方面的功能:游戲控制功能一一包括游戲的開始、暫停、退出界面布局 其他輔助功能(如游戲幫助,游戲積分,游戲過關(guān)等)2、程序設(shè)計(jì)開始初始化界面和蛇身游戲者按鍵選擇放置食物游戲設(shè)計(jì)的處理流程圖蛇開始運(yùn)動N蛇長大2.2 總設(shè)計(jì)模塊的劃分游戲總設(shè)計(jì)模塊劃分為游戲主要界面模塊、游

4、戲控制模塊和游戲菜單模塊。2.3 游戲主界面模塊游戲主界面模塊主要是指游戲的框圖,其包括一下內(nèi)容:1、游戲界面的邊界,即游戲中的墻;2、游戲中蛇的構(gòu)成,以及蘋果的構(gòu)成;3、游戲中障礙物的構(gòu)成;4、游戲中分?jǐn)?shù)顯示以及關(guān)卡顯示。2.4 游戲控制模塊(1)游戲開始控制:我們的程序是使用上鍵開始游戲,啟動游戲后會有一個初始菜單界面,我們點(diǎn)擊“開始游戲”, 彈出一句話“請按上鍵開始游戲”。游戲開始后蛇向下移動,然后由控制上下左右鍵來控制 蛇的移動。在程序中我們重新建了一個activity來控制游戲的開始,使游戲的開始界面更美觀。(2)游戲暫??刂疲何覀兪鞘褂胏enter鍵來控制游戲的暫停的,這是一項(xiàng)人性

5、化的設(shè)計(jì),當(dāng)玩家在游戲過程中 突遇緊急情況時(shí)可以按center鍵暫停游戲,等玩家空閑后按center鍵可以繼續(xù)游戲。(3)游戲退出控制:在游戲的退出上我們的程序使用了多種方式來應(yīng)對不同的情況,當(dāng)玩家正在游戲中時(shí), 如想 退出可以按“1”鍵,程序會自動跳轉(zhuǎn)到初始菜單界面,在初始菜單界面點(diǎn)擊“退出游戲”即可退出游戲。如果玩家在游戲中由于碰到墻或者咬到自己或者碰到障礙物而導(dǎo)致游戲結(jié)束 的,游戲或自動彈出一個界面,里面有提示是繼續(xù)游戲還是退出游戲,當(dāng)點(diǎn)擊“取消”時(shí), 游戲就會自動跳轉(zhuǎn)到初始菜單,再點(diǎn)擊“退出游戲”即可。2.5 類模塊設(shè)計(jì)src 源碼目錄: :二com . Snake. ejitLiro

6、i dHelp, jmv亀rienukctiri ty. j ava.Jav&Snake Vi ew*. j avi Tileiew, j ava田WML譏Sit,知HdSnake.java為主界面類;Sn akeView為貪吃蛇類的視圖主要邏輯控制和繪制類;TitleView為界面的整體視圖;MenuActivity為菜單類,可以跳轉(zhuǎn)到Help類和Snake類;Help為游戲幫助類。3、程序?qū)崿F(xiàn)3.1、游戲界面的實(shí)現(xiàn)1、 先聲明用來存放繪畫圖像的X,Y軸的位置的數(shù)組:private int mTileGrid;2、 編寫存放圖片索引用圖片的X,Y軸位置;public void set

7、Tile( int tile in dex,int x, int y)ILfiElEIJ-. s田 mTileGridxy = tilei ndex; 3把圖片素材加入到bitmap中public void loadTile(int key, Drawable tile)Bitmap bitmap =Bitmap.createBitmap(mTileSize, mTileSize, Bitmap.Config.ARGB_8888);Can vas can vas = new Can vas(bitmap);tile.setBo un ds(0, 0, mTileSize, mTileSize)

8、;tile.draw(ca nvas);mTileArraykey = bitmap;4、 調(diào)用以上的方法以循環(huán)的方式位置數(shù)組賦值以及圖片的索引,private void updateWalls() for (int x = 0; x mXTileCount; x+) setTile(GREEN_STAR, x, 0);setTile(GREEN_STAR, x, mYTileCou nt - 1);for (int y = 1; y mYTileCou nt - 1; y+) setTile(GREEN_STAR, 0, y);/設(shè)置左邊的界線的位置setTile(GREEN_STAR, m

9、XTileCou nt - 1, y);/設(shè)置右邊的界線的位置5、 重寫VIEW類里面的方法。把界線畫出。public void on Draw(Ca nvas can vas)super.o nDraw(ca nvas);for (int x = 0; x mXTileCount; x += 1) for (i nt y = 0; y 0) can vas.drawBitmap(mTileArraymTileGridxy,mXOffset + x * mTileSize,mYOffset + y * mTileSize, mPai nt);同上可見:整個界面其實(shí)就是由圖片數(shù)組拼直面成的。到此

10、,則可以實(shí)現(xiàn)游戲背景墻。3.2、游戲整個框架的構(gòu)建1 實(shí)現(xiàn)方案游戲的整個框架的構(gòu)建包括基本的蛇身,蘋果的實(shí)現(xiàn),有兩種方案:方案一:使用常用的數(shù)組來存儲蛇身和蘋果的點(diǎn)集的信息。此方案的優(yōu)點(diǎn)是對數(shù)組的操作較為熟悉,實(shí)現(xiàn)簡單,但是部分操作較為麻煩, 有可能出現(xiàn)數(shù)組越界, 或者浪費(fèi)太多存儲空間。方案二:使用動態(tài)數(shù)組ArrayList來存儲蛇身和蘋果點(diǎn)集的信息。ArrayList可以用來定義為各種不同類型的數(shù)組,不僅僅局限于int整型;而且ArrayList為用戶編程提供了各種借口,比如插入,刪除元素,統(tǒng)計(jì)元素個數(shù)等,實(shí)現(xiàn)較為簡單,不會出現(xiàn)數(shù)組越界的問題。結(jié)合各種因素的考慮,我們在設(shè)計(jì)中采用第二種方案。

11、定義Position方法,用于存儲蛇身和蘋果的點(diǎn)集坐標(biāo)private class Positi on /存儲每個點(diǎn)的坐標(biāo)public int x;public int y;public Positi on (i nt xpositi on, int ypositi on) x = xpositi on;y = ypositi on;public boolea n equals(i nt n ewx,i nt n ewy) if (x = n ewx & y = n ewy ) return true; return false; 定義setMode方法,用于表示游戲所處的幾種狀態(tài):進(jìn)行

12、,暫停,public void setMode(i nt n ewMode)int oldMode = mMode;mMode = n ewMode;if(n ewMode = RUNNING & oldMode != RUNNING)if(n ewMode = PAUSE)if(n ewMode = LOSE)if(n ewMode = READY)蘋果的實(shí)現(xiàn)聲明:private ArrayList mAppleTrail = new ArrayList();用于存儲蘋果的坐標(biāo)位置根據(jù)游戲的需要,蘋果的位置應(yīng)該是隨機(jī)產(chǎn)生的,使用java.util.Ra ndom機(jī)數(shù)實(shí)現(xiàn)蘋果坐標(biāo)的隨機(jī)

13、。int n ewapplex = 2+ra ndom.n ext In t(mYTileCo un t-2)-4);int n ewappley = 2+ra ndom.n ext In t(mXTileCo un t-2)-4);n ewapple = new Positi on(n ewapplex ,n ewappley);檢測蘋果坐標(biāo)是否與蛇的坐標(biāo)以及墻的左邊沖突設(shè)置沖突標(biāo)志位:boolean flag = false;int sn akele ngth = mSn akeTrail.size();for (int in dex = 0; in dex sn akele ngth;

14、in dex+)if (mS nakeTrail.get(i ndex).equals( newapple.x ,n ewapple.y) flag = true; 墻的沖突檢測方法與上同;當(dāng)產(chǎn)生的新坐標(biāo)沒有問題時(shí),則把新坐標(biāo)加入到 中。蛇的實(shí)現(xiàn)類中提供的隨mAppleTrail聲明:private ArrayList mAppleTrail = new ArrayList();用于存儲蘋果的坐標(biāo)位置蛇的初始化蛇身的初始化在ininNewGame中實(shí)現(xiàn),直接把最初要呈現(xiàn)給玩家的蛇的情況定義出 來,即添加一定數(shù)量的坐標(biāo)點(diǎn)進(jìn)入mSn akeTrail中,使得在最初開始游戲時(shí),有蛇可以進(jìn) 行自由移動

15、。蛇的移動游戲中是通過觸發(fā)來改變坐標(biāo)(+1,-1)的方式來改蛇頭的方向,包括后面的蛇的碰撞檢測都要用到蛇頭。獲取蛇的頭部:Positi on head = mSn akeTrail.get(O);蛇的新頭部:Positi on n ewHead = new Positi on (2,2);通過設(shè)置整型變量mDirection以及mNextDirection來判斷蛇下一步移動方向,然后改變蛇頭的坐標(biāo),使蛇移動switch (mDirectio n) case EAST:n ewHead = new Positi on( head.x,head.y-1);break;ArrayList mAppl

16、eList =new ArrayList()坐標(biāo)集里面集依次判蛇的碰撞檢測 蛇在移動時(shí),若碰撞到墻壁或者自己身體,則游戲結(jié)束。蛇的碰壁檢測:if(head.x 1) | (head.y mYTileCount-2)| (head.y mXTileCount-2)setMode(LOSE);return;蛇的自身碰撞的檢測:int walle ngth = mWallTrail.size();for ( int wallindex = 0 ; wallindex wallength; wallindex+)Positi on c = mWallTrail.get(walli ndex);if (

17、c.equals (n ewHead.x ,n ewHead.y)setMode(LOSE);return; 蛇吃蘋果的實(shí)現(xiàn)蛇所經(jīng)過的每一個坐標(biāo), 他們都要在蘋果所在的 斷,若是坐標(biāo)相同,那個這個蘋果就被蛇吃了 找蘋果的方法:int appleco unt = mAppleTrail.size();int apple in dex;for ( apple in dex = 0; apple in dex appleco unt; apple in dex+) Positi on c = mAppleTrail.get(apple in dex);if (c.equals (n ewHead.x

18、 ,n ewHead.y) 3.3、實(shí)現(xiàn)鍵盤響應(yīng)事件鍵盤主要起操作作用,可以控制蛇的行走方向:public boolea n on KeyDow n(i nt keyCode,KeyEve nt eve nt)if (keyCode = KeyEve nt.KEYCODE_DPAD_DOWN) if (mDirection != SOUTH)mNextDirection = NORTH;return (true);3.4、刷新只要繼承Handler類就可以對消息進(jìn)行控制,或者處理class RefreshHa ndler exte nds Han dler 鍵盤響應(yīng)/響應(yīng)消息public vo

19、id han dleMessage(Message msg) Sn akeView.this.update();重要頁面Sn akeView.this.i nvalidate();刷新頁面/向外提供人工的調(diào)用消息的接口,public void sleep(lo ng delayMillis) this.removeMessages(O);/注消消息/添加消息,sen dMessageDelayed(obta inM essage(0), delayMillis);3.4、實(shí)現(xiàn)頁面的切換程序中從主菜單界面到游戲界面的切換以及從主菜單界面到游戲幫助界面都采用的是活動的切換方法;使用startAct

20、ivity(new Intent(MenuActivity.this,Snake.class);實(shí)現(xiàn)不同活動之間的切換,即從一個頁面跳轉(zhuǎn)到另一個上。另一種方案也能實(shí)現(xiàn)頁面的切換就是,通過控制頁面上的控件如按鈕的顯示,隱藏來達(dá)到切換的目的,但是這種方式較為復(fù)雜。3.5、加載游戲通過ininNewGame方法來初始化新游戲,通過Update方法更新游戲設(shè)置。3.6、游戲背景界面的改進(jìn)為貪吃蛇游戲設(shè)計(jì)了背景,使其更具有觀賞新,使玩家賞心悅目。3.8、 添加音效為游戲添加了音效,使游戲在聽覺上給人以耳目一新的感覺;具體實(shí)現(xiàn)方法:通過調(diào)用android.media.MediaPlayer類函數(shù),聲明對象

21、:MediaPlayer mp=MediaPlayer.create(this.getC on text(),R.raw.backgro un d);通過mp.start();mp.pause();mp.stop();來控制游戲不同狀態(tài)時(shí)的音樂狀態(tài)。3.9、 游戲本身的完善10、為游戲設(shè)置關(guān)卡根據(jù)玩家的得分為游戲設(shè)置了關(guān)卡,難度逐漸加強(qiáng),蛇的移動速度逐漸加快。每一關(guān)卡中的障礙物是固定不變的,為簡單起見,只設(shè)置了五個關(guān)卡通過Obstacle函數(shù)來設(shè)置關(guān)卡的障礙物,其中函數(shù)中以當(dāng)前處于的關(guān)卡數(shù)作為判斷依據(jù)。public void Obstacle。switch(stage)case 5:case

22、4:case 3:case 2: 游戲中設(shè)置的有三種不同的蘋果:普通,加分,和毒蘋果吃掉普通的蘋果加一分;吃掉加分的蘋果加兩分;吃掉毒蘋果減三分并加速每一種蘋果的實(shí)現(xiàn)方法都一樣,使用ArrayList動態(tài)數(shù)組每種蘋果都采用隨機(jī)的方法實(shí)現(xiàn),實(shí)現(xiàn)方式基本與蛇找到蘋果相同,只是在細(xì)節(jié)上略有區(qū)別private void Pois on apple();private void Loveapple();設(shè)置退出快捷鍵在游戲進(jìn)行中,設(shè)置了退出快捷鍵,可以直接退出游戲,更加方便玩家操作。具體實(shí)現(xiàn)還是依靠鍵盤響應(yīng)函數(shù):游戲中是數(shù)字“1”鍵作為退出快捷鍵public boolea n on KeyDow n(i

23、 nt keyCode,KeyEve nt event)if(keyCode = KeyEve nt.KEYCODE_1) showRightorNot.setNegativeButto n(取消, this);mUpdateFlag = false;mp.stop();Intent intent = new Intent(this.getContext(),MenuActivity.class);this.getC on text().startActivity(i nte nt);設(shè)置加速根據(jù)實(shí)際操作需要,當(dāng)操控蛇的移動時(shí),若按下方向鍵不放,則蛇在該方向上的運(yùn)行速度就會加快;若松開方向鍵則

24、恢復(fù)原速度。通過設(shè)置整型變量mSpeed和mNSpeed,其中mNSpeed用來保存蛇在該關(guān)卡的 移動速度。通過鍵盤響應(yīng)函數(shù)public boolean on KeyDow n(int keyCode,KeyEve nt event)和public boolean on KeyUp(i nt keyCode, KeyEve nt event)起來實(shí)現(xiàn)加速功能。提示對話框在游戲結(jié)束后彈出對話框詢問玩家的下一步動作,按確定按鈕繼續(xù)開始新的游戲,按取 消退出游戲。這項(xiàng)功能需要android.content.Dialoglnteface類的支持,聲明對象:private AlertDialog.Bui

25、lder showRightorNot;彈出對話框的界面:showRightorNot = new AlertDialog.Builder(this.getC on text();showRightorNot.setIco n(R.drawable.ic on);showRightorNot.setTitle(”貪吃蛇);showRightorNot.setPositiveButton(”確定, this);showRightorNot.setNegativeButto n(取消, this);3、類模塊具體設(shè)計(jì)TitleView.javaTitleView.java 中的成員變量表變量類型意

26、義賦值mTileArray private Bitmap聲明四種類型的小塊,黃綠紅黑mTileSizeprotected static finalint小塊邊長12mXTileCou ntprotected static intx 方向小塊個數(shù)mYTileCount;protected static inty 方向小塊個數(shù)mTileGridprivate int 每個小塊的數(shù)值mXOffsetprotected int橫向偏移量mYOffset ;protected int縱向偏移量pai ntprivate Paintnew Paint();showRightorNot.setMessage

27、(”按確定繼續(xù),按取消退出游戲”).show();TitleView.java 成員方法Sn akeView.javaSnakeView.java 中的成員變量表變量類型作用賦值TAGpublic static finalStri ngSn akeviewshowRightorPrivate游戲繼續(xù)提示NotAlertDialog.BuildermDirectio nprivate int控制蛇的移動方向SOUTHmNextDirecti onprivate int控制蛇的下一個移動方向SOUTHNORTHprivate static final int控制蛇向上移動1SOUTHprivate

28、 static final int控制蛇向下移動2EASTprivate static final int控制蛇向右移動3WESTprivate static final int控制蛇向左移動4READYpublic static final int1RUNNINGpublic static final int控制游戲開始2PAUSEpublic static final int控制游戲暫停3LOSEpublic static final int控制游戲結(jié)束4textView1;private TextViewtextView2;private TextViewtextView3;privat

29、e TextViewmCen terPressedprivate boolea nfalsemUpdateFlagprivate boolea nfalsemModepublic intREADYstageprivate int記錄通關(guān)等級1mScoreprivate int計(jì)分0mSpeedprivate int刷新界面時(shí)間變量600mNSpeedprivate int刷新界面時(shí)間變量mSpeedreprivateRefreshHa ndler刷新界面處理變量newRefreshHa ndler();ran domprivate static finalRandomnew Ran dom()

30、;mRecordprivate int =new int 10SnakeView.java 成員方法Menu Activit y.J avaMen uActivity.Java成員變量TAGpublic static final StringTAGshowRightorNotprivate AlertDialog.BuildershowRightorNotHelp.JavaHelp.Java成員變量on Createprotected void on Create4.程序結(jié)果保存原程序,啟動模擬機(jī),選擇 java application ,運(yùn)行結(jié)果如下:11:25曲bhblKtl晉KD掃11:

31、250 O 0 bhE4;t 11 11:26O O G O 0 5總結(jié)與展望貪吃蛇是一個簡單的游戲, 卻讓我吃了很多的苦頭,從搭建開發(fā)環(huán)境到對程序進(jìn)行調(diào)試,出現(xiàn)了各種各樣的問題,像JDK版本現(xiàn)錯了啊,環(huán)境變量的設(shè)置出錯啊,調(diào)試的時(shí)候那個R文件不能夠讀取我用了3天才發(fā)現(xiàn)只是大小寫的問題等等,這些讓我深刻地(絕對深刻) 認(rèn)識到細(xì)節(jié)對一個想要成為一個優(yōu)秀程序員是多么不可或缺的品質(zhì)。這一次的實(shí)驗(yàn)很多代碼是從網(wǎng)上找來的,我自己只是起到了一個整合處理的作用,還有一小部分自己還不是完全搞懂,我還將花一部分時(shí)間來弄明白他們,爭取自己能夠獨(dú)立的編寫出一個完整的完美的程序 來。*6附錄package com.S

32、 nake.a ndroid;import java.util.ArrayList;import java.util.Ra ndom;import an droid.app.AlertDialog;import an droid.c onten t.C on text;import an droid.c onten t.Dialog In terface;import an droid.c onten t.I ntent;import an droid.c on te nt.res.Resources;import an droid.media.MediaPlayer;import an dr

33、oid.os.Ha ndler;import an droid.os.Message;import an droid.util.AttributeSet;import an droid.view.KeyEve nt;import an droid.view.View;import an droid.widget.TextView;* author Adm inistrator*/publicclassSn akeViewexte ndsan droid.c onten t.Dialog In terface. On ClickListe nerpublic static final Strin

34、g TAG = Sn akeview;private AlertDialog.Builder showRightorNot ;private int mDirectio n = SOUTH;private int mNextDirection = SOUTH;/設(shè)置方向private static final int NORTH = 1;private static final int SOUTH = 2;private static final int EAST = 3;private static final int WEST = 4;public static final int REA

35、DY = 1; public static final int RUNNING = 2;public static final int PAUSE = 3;public static final int LOSE = 4;private TextView textViewl;private TextView textView2;private TextView textView3;private boolea n mCe nterPressed = false;TileViewimplementsprivate boolea n mUpdateFlag =false;public int mM

36、ode = READY;private int mScore = 0;private int mSpeed = 600;private int stage = 1;private int mNSpeed = mSpeed;/刷新界面處理器private RefreshHa ndler re = new RefreshHa ndler();/為創(chuàng)建蘋果坐標(biāo)使用隨機(jī)對象private static final Ran dom ran dom = new Ran dom();/用于存儲貪吃蛇中,蘋果和蛇的點(diǎn)陣的坐標(biāo)的信息的集合private ArrayList mSnakeTrail = new A

37、rrayList();private ArrayList mAppleTrail = new ArrayList();private ArrayList mWallTrail = new ArrayList();private ArrayList mPois on Apple = new ArrayList ();是否更新的標(biāo)志量private ArrayList mLoveApple = new ArrayList ();MediaPlayer mp=MediaPlayer.create(this.getC on text(),R.raw.backgro un d);/相當(dāng)于數(shù)組大小可變/*

38、 param con text* param attrs*/class RefreshHa ndler exte nds Han dler *響應(yīng)消息*/Overridepublic void han dleMessage(Message msg) update();in validate。;/消失重新調(diào)用on draw向外提供人工的調(diào)用消息的接口* param delayMillis */每600ms刷新一次/*public void sleep(lo ng delayMillis)II隔600ms重新調(diào)用這個函數(shù)this.removeMessages(O);sen dMessageDela

39、yed(obta inMessage(0),delayMillis);public Sn akeView(C on text con text, AttributeSet attrs) super(c on text, attrs);setFocusable(true);ininSn akeView();public void ininSn akeView()初始化界面Resourcesr = this.getC on text().getResources();resetTiles(6);loadTile(1, r.getDrawable(R.drawable.redstar);loadTi

40、le(2, r.getDrawable(R.drawable.yellowstar);loadTile(3, r.getDrawable(R.drawable.gree nstar);loadTile(4,r.getDrawable(R.drawable.purplewstar);loadTile(5,r.getDrawable(R.drawable.favourite);private class Positi on public int x;/存儲每個點(diǎn)的坐標(biāo)public int y;public Positi on (i nt xpositi on, int ypositi on) x

41、= xpositi on;y = ypositi on;public boolea n equals(i nt n ewx,i nt n ewy) if (x= n ewx & y = n ewy )return true;return false; public void ininN ewGame()mSn akeTrail.clear();mAppleTrail.clear();mScore=0;stage=1;mSpeed=600;/初始化蛇的位置mSnakeTrail.add(0,new Position(20,20);mSnakeTrail.add(1,new Positio

42、n(19,20);mSnakeTrail.add(2,new Position(18,20);/初始化蘋果的位置Apple();Pois on apple();Loveapple();mDirectio n = NORTH;mNextDirection = NORTH;public boolea n on KeyDow n(i nt keyCode,KeyEve nt event)/鍵盤響應(yīng)if(mDirection != NORTH)mSpeed = 200;if(keyCode = KeyEve nt.KEYCODE_DPAD_UP)if(mMode = READY | mMode = L

43、OSE) ininN ewGame(); setMode(RUNNING);update();mp.start();return (true); if(mMode = PAUSE) setMode(RUNNING);mp.start();return (true);mNextDirection = SOUTH;mNextDirection = WEST;return (true);if (keyCode = KeyEve nt.KEYCODE_DPAD_DOWN) if (mDirection != SOUTH) mNextDirection = NORTH;return (true);if

44、(keyCode = KeyEve nt.KEYCODE_DPAD_LEFT) if(mDirection != WEST) mNextDirection = EAST;return (true);if (keyCode = KeyEve nt.KEYCODE_DPAD_RIGHT) if (mDirection != EAST) return (true);if(keyCode = KeyEvent.KEYCODE_DPAD_CENTER) if(mCe nterPressed = false)setMode(PAUSE);mp.pause();elsesetMode(RUNNING);mp

45、.start();mCen terPressed = !mCe nterPressed;if(keyCode = KeyEve nt.KEYCODE_1)mUpdateFlag = false;mp.stop();Intent intent = newIntent(this.getContext(),MenuActivity.class);this.getC on text().startActivity(i nte nt);mNextDirection = NORTH;retur n super.。nKeyDow n( keyCode, even t);Overridepublic bool

46、ea n on KeyUp(i nt keyCode, KeyEve nt eve nt)mSpeed = mNSpeed;if(keyCode = KeyEve nt.KEYCODE_DPAD_UP)if(mDirection != NORTH)mNextDirectio n = SOUTH;return (true);if (keyCode = KeyEve nt.KEYCODE_DPAD_DOWN) if (mDirection != SOUTH) return (true);if (keyCode = KeyEve nt.KEYCODE_DPAD_LEFT) if(mDirection

47、 != WEST) mNextDirection = EAST;return (true);if (keyCode = KeyEve nt.KEYCODE_DPAD_RIGHT) if(mDirection != EAST) mNextDirection = WEST;return (true);/ TODO Auto-ge nerated method stubreturn super.o nKeyUp(keyCode, even t);public void setMode(i nt n ewMode)int oldMode = mMode;mMode = n ewMode;Stri ng

48、 str =;if(n ewMode = RUNNING & oldMode != RUNNING)in validate。;mUpdateFlag =true;textView1.setVisibility(ViewNVISIBLE);update();return;if(n ewMode = PAUSE)str =按暫停鍵繼續(xù)開始;mUpdateFlag = false;if(n ewMode = LOSE)str =游戲結(jié)束,按上鍵重新開始;mUpdateFlag = false;showRightorNot = new AlertDialog.Builder(this.getC

49、o ntext();showRightorNot.setlc on (R.drawable.ic on);showRightorNot.setTitle(”貪吃蛇);showRightorNot.setPositiveButto n(確定, this);showRightorNot.setNegativeButton(”取消, this);showRightorNot.setMessage(”按確定繼續(xù),按取消退出游戲”).show();mp.stop();mp.prepareAs yn c();if(n ewMode = READY)mp.start();str =按上鍵開始游戲;textV

50、iew1.setText(str);textView1.setVisibility(View.VISIBLE);public void update()if(mUpdateFlag)clearTiles();updateWalls();updateS nake();updateApple();re.sleep(mSpeed);public void updateWalls()for (i nt x = 0; x mYTileCo unt; x+)setTile(3, x,0); 設(shè)置頂部界限setTile(3, x,mXTileCou nt-1);for (i nt y = 1; y mXTi

51、leCou nt - 1; y+)setTile(3, 0,y);setTile(3,mYTileCou nt-1,y); public void updates nake()boolea n Sn akegrow = false;/獲取蛇的頭部Positi on head = mSn akeTrail.get(O);/蛇的新頭部設(shè)置底部界Positi on n ewHead = new Positi on( 2,2);/根據(jù)當(dāng)前的為方向設(shè)置坐標(biāo)的信息mDirectio n = mNextDirectio n;switch (mDirectio n) case EAST:newHead :=n

52、ew Position(head.x,head.y-1);break;case WEST:n ewHead = new Positi on( head.x,head.y+1);break;case NORTH:n ewHead = new Positi on( head.x+1,head.y);break;case SOUTH: n ewHead = new Positi on( head.x-1,head.y);break;/蛇碰壁檢測if(newHead.x 1) | (newHead.y mYTileCount-2) |(n ewHead.y mXTileCou nt-2)setMode

53、(LOSE);return;/蛇自身沖撞檢測int sn akele ngth = mSn akeTrail.size();for (int sn ake in dex = 0; sn ake in dex sn akele ngth; sn ake in dex+)Positi on c = mSn akeTrail.get(s nakei ndex);if (c.equals (n ewHead.x ,n ewHead.y)setMode(LOSE);return;/蛇與障礙物的沖撞檢測int walle ngth = mWallTrail.size();for ( int walli n

54、dex = 0 ; walli ndex walle ngth; walli ndex+) Positi on c = mWallTrail.get(walli ndex);if (c.equals (n ewHead.x ,n ewHead.y)setMode(LOSE);return;/找蘋果int appleco unt = mAppleTrail.size();String str1 =分?jǐn)?shù):” int apple in dex;for ( apple in dex = 0; apple in dex appleco unt; apple in dex+)Positi on c = m

55、AppleTrail.get(apple in dex);if (c.equals (n ewHead.x ,n ewHead.y) /mAppleTrail.remove(c);Apple();mScore+;if(mScore%3=0)找到蘋果mSpeed *=0.95;mNSpeed = mSpeed;stage+;Apple();Pois on apple();Loveapple();Sn akegrow = true;textView2.setText(str1+ mScore+ 按數(shù)字鍵“1”退出游戲);String str2=第+ stage + 關(guān);textView3.setT

56、ext(str2);/毒蘋果處理方法int posi oncount = mPois on Apple.size();for (int in dex = 0; in dex posi oncount; in dex+)Positi on c = mPois on Apple.get(i ndex);if (c.equals (n ewHead.x ,n ewHead.y) /找至U蘋果mPois on Apple.remove(c);mScore = mScore - 3;mSpeed *= 0.8; in t loveco unt = mLoveApple.size();for (int i

57、n dex = 0; in dex loveco unt; in dex+)Positi on c = mLoveApple.get(i ndex);if (c.equals (n ewHead.x ,n ewHead.y) /找至U蘋果mLoveApple.remove(c);mScore = mScore + 5;mSpeed /= 0.8;Obstacle。;/將蛇頭的位置信息放在第一個的對象中方取值mSn akeTrail.add(O, n ewHead);if(!S nakegrow)mSn akeTrail.remove(mS nakeTrail.size() - 1); for (Positi on c : mSn akeTrail)setTile(2, c.x, c.y); /隨即產(chǎn)生蘋果private void Apple()Positi on n ewapple = n ull;boolea n collisi on =

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論