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

下載本文檔

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

文檔簡介

1、課程實(shí)訓(xùn)報(bào)告課程名稱計(jì)算機(jī)系統(tǒng)綜合實(shí)訓(xùn)課題名稱基于Android的貪吃蛇游戲開發(fā)專業(yè)一計(jì)算機(jī)科學(xué)與技術(shù)班級學(xué)號姓名指導(dǎo)教師2013年12月4日湖南工程學(xué)院課程實(shí)訓(xùn)任務(wù)書課程名稱計(jì)算機(jī)系統(tǒng)綜合實(shí)訓(xùn)課題基于Android的貪吃蛇游戲開發(fā)專業(yè)班級學(xué)生姓名學(xué)號指導(dǎo)老師審批任務(wù)書下達(dá)日期2013年12月4日任務(wù)完成日期2013年12月20日目錄1、程序構(gòu)思12、程序設(shè)計(jì)22.1 游戲功能22.2 總設(shè)計(jì)模塊的劃分32.3 游戲主界面模塊32.4 游戲控制模塊32.5 類模塊設(shè)計(jì)33、程序?qū)崿F(xiàn)43.1、 游戲界面的實(shí)現(xiàn)43.2、 游戲整個(gè)框架的構(gòu)建53.3、 實(shí)現(xiàn)鍵盤響應(yīng)事件73.4、 刷新83.5、 實(shí)

2、現(xiàn)頁面的切換83.6、 加載游戲83.7、 游戲背景界面的改進(jìn)83.8、 添加音效93.9、 游戲本身的完善93、類模塊具體設(shè)計(jì)10TitleView.java10SnakeView.java114 .程序結(jié)果135 .總結(jié)與展望166 .附錄161、程序構(gòu)思貪吃蛇游戲是一款非常經(jīng)典的手機(jī)游戲,貪吃蛇游戲的設(shè)計(jì)比較復(fù)雜,它涉及面廣、牽涉方面多,如果不好好考慮和設(shè)計(jì),將難以成功開發(fā)出這個(gè)游戲。在這個(gè)游戲的設(shè)計(jì)中,牽涉到圖形界面的顯示與更新、數(shù)據(jù)的收集與更新,并且在這個(gè)游戲的開發(fā)中,還要應(yīng)用類的繼承機(jī)制以及一些設(shè)計(jì)模式。因此,在設(shè)計(jì)開發(fā)過程中,需要處理好各個(gè)類之間間的邏輯依賴關(guān)系和數(shù)據(jù)通信關(guān)系。正

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

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

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

6、|+)-+I+1+1src源碼目錄:com.Snake,aitdroidHelp.jatraMiivity.j4V之SnakeVifeirjavimmaratust.andi'cidSnake.java為主界面類;SnakeView為貪吃蛇類的視圖主要邏輯控制和繪制類;TitleView為界面的整體視圖;MenuActivity為菜單類,可以跳轉(zhuǎn)到Help類和Snake類;Help為游戲幫助類。3、程序?qū)崿F(xiàn)3.1、 游戲界面的實(shí)現(xiàn)1、先聲明用來存放繪畫圖像的X,Y軸的位置的數(shù)組:privateintmTileGrid;2、編寫存放圖片索引用圖片的X,Y軸位置;publicvoidset

7、Tile(inttileindex,intx,inty)mTileGridxy=tileindex;3.2、 片素材加入到bitmap中publicvoidloadTile(intkey,Drawabletile)Bitmapbitmap=Bitmap.createBitmap(mTileSize,mTileSize,Bitmap.Config.ARGB_8888);Canvascanvas=newCanvas(bitmap);tile.setBounds(0,0,mTileSize,mTileSize);tile.draw(canvas);mTileArraykey=bitmap;4、調(diào)用以

8、上的方法以循環(huán)的方式位置數(shù)組賦值以及圖片的索引,privatevoidupdateWalls()for(intx=0;x<mXTileCount;x+)setTile(GREEN_STAR,x,0);setTile(GREEN_STAR,x,mYTileCount-1);for(inty=1;y<mYTileCount-1;y+)setTile(GREEN_STAR,0,y);/設(shè)置左邊的界線的位置setTile(GREEN_STAR,mXTileCount-1,y);/設(shè)置右邊的界線的位置5、重寫VIEW類里面的方法。把界線畫出。publicvoidonDraw(Canvasca

9、nvas)super.onDraw(canvas);for(intx=0;x<mXTileCount;x+=1)for(inty=0;y<mYTileCount;y+=1)if(mTileGridxy>0)canvas.drawBitmap(mTileArraymTileGridxy,mXOffset+x*mTileSize,mYOffset+y*mTileSize,mPaint);同上可見:整個(gè)界面其實(shí)就是由圖片數(shù)組拼直面成的。至U此,則可以實(shí)現(xiàn)游戲背景墻。3.3、 游戲整個(gè)框架的構(gòu)建1實(shí)現(xiàn)方案游戲的整個(gè)框架的構(gòu)建包括基本的蛇身,蘋果的實(shí)現(xiàn),有兩種方案:方案一:使用常用的數(shù)

10、組來存儲蛇身和蘋果的點(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ì)元素個(gè)數(shù)等,實(shí)現(xiàn)較為簡單,不會出現(xiàn)數(shù)組越界的問題。結(jié)合各種因素的考慮,我們在設(shè)計(jì)中采用第二種方案。定義Position方法,用于存儲蛇身和蘋果的點(diǎn)集坐標(biāo)privateclassPosition存儲每個(gè)點(diǎn)的坐標(biāo)publicintx;publici

11、nty;publicPosition(intxposition,intyposition)x=xposition;y=yposition;publicbooleanequals(intnewx,intnewy)if(x=newx&&y=newy)returntrue;returnfalse;定義setMode方法,用于表示游戲所處的幾種狀態(tài):進(jìn)行,暫停,publicvoidsetMode(intnewMode)intoldMode=mMode;mMode=newMode;if(newMode=RUNNING&&oldMode!=RUNNING)if(newMod

12、e=PAUSE)if(newMode=LOSE)if(newMode=READY)蘋果的實(shí)現(xiàn)聲明:privateArrayList<Position>mAppleTrail=newArrayList<Position>();用于存儲蘋果的坐標(biāo)位置根據(jù)游戲的需要,蘋果的位置應(yīng)該是隨機(jī)產(chǎn)生的,使用java.util.Random類中提供的隨機(jī)數(shù)實(shí)現(xiàn)蘋果坐標(biāo)的隨機(jī)。intnewapplex=2+random.nextInt(mYTileCount-2)-4);intnewappley=2+random.nextInt(mXTileCount-2)-4);newapple=ne

13、wPosition(newapplex,newappley);檢測蘋果坐標(biāo)是否與蛇的坐標(biāo)以及墻的左邊沖突設(shè)置沖突標(biāo)志位:booleanflag=false;intsnakelength=mSnakeTrail.size();for(intindex=0;index<snakelength;index+)if(mSnakeTrail.get(index).equals(newapple.x,newapple.y)flag=true;墻的沖突檢測方法與上同;當(dāng)產(chǎn)生的新坐標(biāo)沒有問題時(shí),則把新坐標(biāo)加入到mAppleTrail中。蛇的實(shí)現(xiàn)聲明:privateArrayList<Positio

14、n>mAppleTrail=newArrayList<Position>();用于存儲蘋果的坐標(biāo)位置蛇的初始化蛇身的初始化在ininNewGame中實(shí)現(xiàn),直接把最初要呈現(xiàn)給玩家的蛇的情況定義出來,即添加一定數(shù)量的坐標(biāo)點(diǎn)進(jìn)入mSnakeTrail中,使得在最初開始游戲時(shí),有蛇可以進(jìn)行自由移動。蛇的移動游戲中是通過觸發(fā)來改變坐標(biāo)(+1,-1)的方式來改蛇頭的方向,包括后面的蛇的碰撞檢測都要用到蛇頭。獲取蛇的頭部:Positionhead=mSnakeTrail.get(0);蛇的新頭部:PositionnewHead=newPosition(2,2);通過設(shè)置整型變量mDirec

15、tion以及mNextDirection來判斷蛇下一步移動方向,然后改變蛇頭的坐標(biāo),使蛇移動switch(mDirection)caseEAST:newHead=newPosition(head.x,head.y-1);break;蛇的碰撞檢測蛇在移動時(shí),若碰撞到墻壁或者自己身體,則游戲結(jié)束。蛇的碰壁檢測:if(head.x<1)|(head.y<1)|(head.x>mYTileCount-2)|(head.y>mXTileCount-2)setMode(LOSE);return;蛇的自身碰撞的檢測:intwallength=mWallTrail.size();for

16、(intwallindex=0;wallindex<wallength;wallindex+)Positionc=mWallTrail.get(wallindex);if(c.equals(newHead.x,newHead.y)setMode(LOSE);return;蛇吃蘋果的實(shí)現(xiàn)蛇所經(jīng)過的每一個(gè)坐標(biāo),他們都要在蘋果所在的ArrayList<Position>mAppleList=newArrayList<Position>()坐標(biāo)集里面集依次判斷,若是坐標(biāo)相同,那個(gè)這個(gè)蘋果就被蛇吃了。找蘋果的方法:intapplecount=mAppleTrail.size

17、();intappleindex;for(appleindex=0;appleindex<applecount;appleindex+)Positionc=mAppleTrail.get(appleindex);if(c.equals(newHead.x,newHead.y)3.4、 實(shí)現(xiàn)鍵盤響應(yīng)事件鍵盤主要起操作作用,可以控制蛇的行走方向:publicbooleanonKeyDown(intkeyCode,KeyEventevent)/鍵盤響應(yīng)if(keyCode=KeyEvent.KEYCODE_DPAD_DOWN)if(mDirection!=SOUTH)mNextDirectio

18、n=NORTH;return(true);3.5、 刷新只要繼承Handler類就可以對消息進(jìn)行控制,或者處理classRefreshHandlerextendsHandler響應(yīng)消息publicvoidhandleMessage(Messagemsg)SnakeView.this.update();/重要頁面SnakeView.this.invalidate();刷新頁面/向外提供人工的調(diào)用消息的接口,publicvoidsleep(longdelayMillis)this.removeMessages(0);/注消消息/添加消息,sendMessageDelayed(obtainMessa

19、ge(0),delayMillis);3.4、 實(shí)現(xiàn)頁面的切換程序中從主菜單界面到游戲界面的切換以及從主菜單界面到游戲幫助界面都采用的是活動的切換方法;使用startActivity(newIntent(MenuActivity.this,Snake.class);實(shí)現(xiàn)不同活動之間的切換,即從一個(gè)頁面跳轉(zhuǎn)到另一個(gè)上。另一種方案也能實(shí)現(xiàn)頁面的切換就是,通過控制頁面上的控件如按鈕的顯示,隱藏來達(dá)到切換的目的,但是這種方式較為復(fù)雜。3.5、 加載游戲通過ininNewGame方法來初始化新游戲,通過Update方法更新游戲設(shè)置。3.6、 游戲背景界面的改進(jìn)為貪吃蛇游戲設(shè)計(jì)了背景,使其更具有觀賞新,使

20、玩家賞心悅目。3.8、 添加音效為游戲添加了音效,使游戲在聽覺上給人以耳目一新的感覺;具體實(shí)現(xiàn)方法:通過調(diào)用android.media.MediaPlayer類函數(shù),聲明對象:MediaPlayermp=MediaPlayer.create(this.getContext(),R.raw.background);通過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è)置了五個(gè)關(guān)卡通過Obsta

21、cle函數(shù)來設(shè)置關(guān)卡的障礙物,其中函數(shù)中以當(dāng)前處于的關(guān)卡數(shù)作為判斷依據(jù)。publicvoidObstacle。switch(stage)case5:case4:case3:case2:游戲中設(shè)置的有三種不同的蘋果:普通,加分,和毒蘋果吃掉普通的蘋果加一分;吃掉加分的蘋果加兩分;吃掉毒蘋果減三分并加速每一種蘋果的實(shí)現(xiàn)方法都一樣,使用ArrayList動態(tài)數(shù)組每種蘋果都采用隨機(jī)的方法實(shí)現(xiàn),實(shí)現(xiàn)方式基本與蛇找到蘋果相同,只是在細(xì)節(jié)上略有區(qū)別privatevoidPoisonapple();privatevoidLoveapple();設(shè)置退出快捷鍵在游戲進(jìn)行中,設(shè)置了退出快捷鍵,可以直接退出游戲,更

22、加方便玩家操作。具體實(shí)現(xiàn)還是依靠鍵盤響應(yīng)函數(shù):游戲中是數(shù)字“1”鍵作為退出快捷鍵publicbooleanonKeyDown(intkeyCode,KeyEventevent)if(keyCode=KeyEvent.KEYCODE_1)mUpdateFlag=false;mp.stop();Intentintent=newIntent(this.getContext(),MenuActivity.class);this.getContext().startActivity(intent);設(shè)置加速根據(jù)實(shí)際操作需要,當(dāng)操控蛇的移動時(shí),若按下方向鍵不放,則蛇在該方向上的運(yùn)行速度就會加快;若松開方向

23、鍵則恢復(fù)原速度。通過設(shè)置整型變量mSpeed和mNSpeed,其中mNSpeed用來保存蛇在該關(guān)卡的移動速度。通過鍵盤響應(yīng)函數(shù)publicbooleanonKeyDown(intkeyCode,KeyEventevent)和publicbooleanonKeyUp(intkeyCode,KeyEventevent)起來實(shí)現(xiàn)力口速功能。提示對話框在游戲結(jié)束后彈出對話框詢問玩家的下一步動作,按確定按鈕繼續(xù)開始新的游戲,按取消退出游戲。這項(xiàng)功能需要android.content.DialogInterface類的支持,聲明對象:privateAlertDialog.BuildershowRighto

24、rNot;彈出對話框的界面:showRightorNot=newAlertDialog.Builder(this.getContext();showRightorNot.setIcon(R.drawable.icon);showRightorNot.setTitle("貪吃蛇");showRightorNot.setPositiveButton("確定",this);showRightorNot.setNegativeButton("取消",this);showRightorNot.setMessage("按確定繼續(xù),按取消

25、退出游戲").show();3、類模塊具體設(shè)計(jì)TitleView.javaTitleView.java中的成員變量表變量意義賦值mTileArray口privateBitmap聲明四種類型的小塊,黃綠紅黑mTileSizeprotectedstaticfinalint小塊邊長12mXTileCountprotectedstaticintx方向小塊個(gè)數(shù)9mYTileCount;protectedstaticinty方向小塊個(gè)數(shù)mTileGridprivateint每個(gè)小塊的數(shù)值mXOffsetprotectedint橫向偏移量mYOffset;protectedint縱向偏移量pain

26、tprivatePaintnewPaint();TitleView.java成員方法SnakeView.javaSnakeView.java中的成員變量表變量作用賦值TAGpublicstaticfinalString"Snakeview"showRightorNotPrivateAlertDialog.Builder游戲繼續(xù)提示mDirectionprivateint控制蛇的移動方向SOUTHmNextDirectionprivateint控制蛇的下一個(gè)移動方向SOUTHNORTHprivatestaticfinalint控制蛇向上移動1SOUTHprivatestati

27、cfinalint控制蛇向卜移動2EASTprivatestaticfinalint控制蛇向右移動3WESTprivatestaticfinalint控制蛇向左移動4READYpublicstaticfinalint1RUNNINGpublicstaticfinalint控制游戲開始2PAUSEpublicstaticfinalint控制游戲暫停3LOSEpublicstaticfinalint控制游戲結(jié)束4iitextViewl;privateTextViewtextView2;privateTextViewtextView3;privateTextViewmCenterPressedpri

28、vatebooleanfalsemUpdateFlagprivatebooleanfalsemModepublicintREADYstageprivateint記錄通關(guān)等級1mScoreprivateint計(jì)分0mSpeedprivateint刷新界囿時(shí)間變量600mNSpeedprivateint刷新界囿時(shí)間變量mSpeedreprivateRefreshHandler刷新界囿處理變量newRefreshHandler();randomprivatestaticfinalRandomnewRandom();mRecordprivateint=newint10SnakeView.java成員方

29、法MenuActivity.JavaMenuActivity.Java成員變量TAGpublicstaticfinalStringTAGshowRightorNotprivateAlertDialog.BuildershowRightorNotHelp.JavaHelp.Java成員變量onCreateprotectedvoidonCreate304.程序結(jié)果保存原程序,啟動模擬機(jī),選擇javaapplication,運(yùn)行結(jié)果如下:tJ一卜日11:26bbblst11OOGO90®bbfi4;-t11QWERJykI。PA小MBTf,即明圖啥ZXc值配BBfH2,小回lx血11:26

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

31、的程序來。6 .附錄packagecom.Snake.android;importjava.util.ArrayList;importjava.util.Random;importandroid.app.AlertDialog;importandroid.content.Context;importandroid.content.DialogInterface;importandroid.content.Intent;importandroid.content.res.Resources;importandroid.media.MediaPlayer;importandroid.os.Hand

32、ler;importandroid.os.Message;importandroid.util.AttributeSet;importandroid.view.KeyEvent;importandroid.view.View;importandroid.widget.TextView;/*authorAdministrator*/TileViewimplementspublicclassSnakeViewextendsandroid.content.DialogInterface.OnClickListenerpublicstaticfinalStringTAG="Snakeview

33、"privateAlertDialog.BuildershowRightorNot;privateintmDirection=SOUTH;privateintmNextDirection=SOUTH;設(shè)置方向privatestaticfinalintNORTH=1;privatestaticfinalintSOUTH=2;privatestaticfinalintEAST=3;privatestaticfinalintWEST=4;publicstaticfinalintREADY=1;publicstaticfinalintRUNNING=2;publicstaticfinalin

34、tPAUSE=3;publicstaticfinalintLOSE=4;privateTextViewtextViewl;privateTextViewtextView2;privateTextViewtextView3;privatebooleanmCenterPressed=false;privatebooleanmUpdateFlag=false;/是否更新的標(biāo)志量publicintmMode=READY;privateintmScore=0;privateintmSpeed=600;privateintstage=1;privateintmNSpeed=mSpeed;刷新界面處理器pr

35、ivateRefreshHandlerre=newRefreshHandler();為創(chuàng)建蘋果坐標(biāo)使用隨機(jī)對象privatestaticfinalRandomrandom=newRandom。;用于存儲貪吃蛇中,蘋果和蛇的點(diǎn)陣的坐標(biāo)的信息的集合privateArrayList<Position>mSnakeTrail=newArrayList<Position>();privateArrayList<Position>mAppleTrail=newArrayList<Position>();privateArrayList<Position

36、>mWallTrail=newArrayList<Position>();privateArrayList<Position>mPoisonApple=newArrayList<Position>();privateArrayList<Position>mLoveApple=newArrayList<Position>();MediaPlayermp=MediaPlayer.create(this.getContext(),R.raw.background);相當(dāng)于數(shù)組大小可變/* paramcontext* paramattr

37、s* /classRefreshHandlerextendsHandler每600ms刷新一次/*響應(yīng)消息*/Override/*publicvoidhandleMessage(Messagemsg)update();invalidate。;/消失重新調(diào)用ondraw向外提供人工的調(diào)用消息的接口*paramdelayMillis*/publicvoidsleep(longdelayMillis)隔600ms重新調(diào)用這個(gè)函數(shù)this.removeMessages(0);sendMessageDelayed(obtainMessage(0),delayMillis);publicSnakeView

38、(Contextcontext,AttributeSetattrs)super(context,attrs);setFocusable(true);ininSnakeView();publicvoidininSnakeView()初始化界面Resourcesr=this.getContext().getResources();resetTiles(6);loadTile(1,r.getDrawable(R.drawable.redstar);loadTile(2,r.getDrawable(R.drawable.yellowstar);loadTile(3,r.getDrawable(R.dr

39、awable.greenstar);loadTile(4,r.getDrawable(R.drawable.purplewstar);loadTile(5,r.getDrawable(R.drawable.favourite);privateclassPosition存儲每個(gè)點(diǎn)的坐標(biāo)publicintx;publicinty;publicPosition(intxposition,intyposition)x=xposition;y=yposition;publicbooleanequals(intnewx,intnewy)if(x=newx&&y=newy)returntru

40、e;returnfalse;publicvoidininNewGame()mSnakeTrail.clear();mAppleTrail.clear();mScore=0;stage=1;mSpeed=600;初始化蛇的位置mSnakeTrail.add(0,newPosition(20,20);mSnakeTrail.add(1,newPosition(19,20);mSnakeTrail.add(2,newPosition(18,20);初始化蘋果的位置Apple();Poisonapple();Loveapple();mDirection=NORTH;mNextDirection=NOR

41、TH;鍵盤響應(yīng)publicbooleanonKeyDown(intkeyCode,KeyEventevent)/mSpeed=200;if(keyCode=KeyEvent.KEYCODE_DPAD_UP)if(mMode=READY|mMode=LOSE)ininNewGame();setMode(RUNNING);update();mp.start();return(true);if(mMode=PAUSE)setMode(RUNNING);mp.start();return(true);if(mDirection!=NORTH)mNextDirection=SOUTH;return(tr

42、ue);if(keyCode=KeyEvent.KEYCODE_DPAD_DOWN)if(mDirection!=SOUTH)mNextDirection=NORTH;return(true);if(keyCode=KeyEvent.KEYCODE_DPAD_LEFT)if(mDirection!=WEST)mNextDirection=EAST;return(true);if(keyCode=KeyEvent.KEYCODE_DPAD_RIGHT)if(mDirection!=EAST)mNextDirection=WEST;return(true);if(keyCode=KeyEvent.

43、KEYCODE_DPAD_CENTER)if(mCenterPressed=false)setMode(PAUSE);mp.pause();elsesetMode(RUNNING);mp.start();mCenterPressed=!mCenterPressed;if(keyCode=KeyEvent.KEYCODE_1)mUpdateFlag=false;mp.stop();Intentintent=newIntent(this.getContext(),MenuActivity.class);this.getContext().startActivity(intent);returnsu

44、per.onKeyDown(keyCode,event);OverridepublicbooleanonKeyUp(intkeyCode,KeyEventevent)mSpeed=mNSpeed;if(keyCode=KeyEvent.KEYCODE_DPAD_UP)if(mDirection!=NORTH)mNextDirection=SOUTH;return(true);if(keyCode=KeyEvent.KEYCODE_DPAD_DOWN)if(mDirection!=SOUTH)mNextDirection=NORTH;return(true);if(keyCode=KeyEven

45、t.KEYCODE_DPAD_LEFT)if(mDirection!=WEST)mNextDirection=EAST;return(true);if(keyCode=KeyEvent.KEYCODE_DPAD_RIGHT)if(mDirection!=EAST)mNextDirection=WEST;return(true);/TODOAuto-generatedmethodstubreturnsuper.onKeyUp(keyCode,event);publicvoidsetMode(intnewMode)intoldMode=mMode;mMode=newMode;Stringstr=&

46、quot;"if(newMode=RUNNING&&oldMode!=RUNNING)invalidate。;mUpdateFlag=true;textView1.setVisibility(View.INVISIBLE);update();return;if(newMode=PAUSE)str="按暫停鍵繼續(xù)開始"mUpdateFlag=false;if(newMode=LOSE)str="游戲結(jié)束,按上鍵重新開始"mUpdateFlag=false;showRightorNot=newAlertDialog.Builder(

47、this.getContext();showRightorNot.setIcon(R.drawable.icon);showRightorNot.setTitle("貪吃蛇");showRightorNot.setPositiveButton("確定",this);showRightorNot.setNegativeButton("取消",this);").show();showRightorNot.setMessage("按確定繼續(xù),按取消退出游戲mp.stop();mp.prepareAsync();if(ne

48、wMode=READY)mp.start();str="按上鍵開始游戲"textView1.setText(str);textView1.setVisibility(View.VISIBLE);publicvoidupdate()if(mUpdateFlag)clearTiles();updateWalls();updateSnake();updateApple();re.sleep(mSpeed);publicvoidupdateWalls()for(intx=0;x<mYTileCount;x+)setTile(3,x,0);/設(shè)置頂部界限setTile(3,x,

49、mXTileCount-1);/設(shè)置底部界for(inty=1;y<mXTileCount-1;y+)setTile(3,0,y);setTile(3,mYTileCount-1,y);publicvoidupdateSnake()booleanSnakegrow=false;/獲取蛇的頭部Positionhead=mSnakeTrail.get(0);蛇的新頭部PositionnewHead=newPosition(2,2);根據(jù)當(dāng)前的為方向設(shè)置坐標(biāo)的信息mDirection=mNextDirection;switch(mDirection)caseEAST:newHead=newPo

50、sition(head.x,head.y-1);break;caseWEST:newHead=newPosition(head.x,head.y+1);break;caseNORTH:newHead=newPosition(head.x+1,head.y);break;caseSOUTH:newHead=newPosition(head.x-1,head.y);break;/蛇碰壁檢測if(newHead.x<1)|(newHead.y<1)|(newHead.x>mYTileCount-2)|(newHead.y>mXTileCount-2)setMode(LOSE)

51、;return;蛇自身沖撞檢測intsnakelength=mSnakeTrail.size();for(intsnakeindex=0;snakeindex<snakelength;snakeindex+)Positionc=mSnakeTrail.get(snakeindex);if(c.equals(newHead.x,newHead.y)setMode(LOSE);return;蛇與障礙物的沖撞檢測intwallength=mWallTrail.size();for(intwallindex=0;wallindex<wallength;wallindex+)Position

52、c=mWallTrail.get(wallindex);if(c.equals(newHead.x,newHead.y)setMode(LOSE);return;找蘋果intapplecount=mAppleTrail.size();Stringstr1="分?jǐn)?shù):"intappleindex;for(appleindex=0;appleindex<applecount;appleindex+)Positionc=mAppleTrail.get(appleindex);if(c.equals(newHead.x,newHead.y)找至U蘋果mAppleTrail.re

53、move(c);Apple();mScore+;if(mScore%3=0)mSpeed*=0.95;mNSpeed=mSpeed;stage+;Apple();Poisonapple();Loveapple();Snakegrow=true;textView2.setText(str1+mScore+"按數(shù)字鍵“1"退出游戲");Stringstr2="第"+stage+"關(guān)";textView3.setText(str2);毒蘋果處理方法intposioncount=mPoisonApple.size();for(intindex=0;index<posioncount;index+)Positionc=mPoisonApple.get(index);if(c.equals(newHead.x,newHead.y)/找至U

溫馨提示

  • 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

提交評論