android小游戲之2048課程設計_第1頁
android小游戲之2048課程設計_第2頁
android小游戲之2048課程設計_第3頁
android小游戲之2048課程設計_第4頁
android小游戲之2048課程設計_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、廣東行政職業(yè)學院學生畢業(yè)論文(設計)android小游戲之2048課程設計學生姓名:鐘家喻學號:12jw01b012系部:電子信息系專業(yè):計算機技術(shù)(網(wǎng)絡管理)班級:2012級1班指導教師:黃耿生 副教授目錄前言- 3 - 內(nèi)容安排- 4 - 一、功能設計- 4 - (1)設計界面- 4 - (2)游戲設計- 5 - (3)事件監(jiān)聽- 7 - (4)游戲最終實現(xiàn)- 8 - 二、游戲邏輯重新設定- 9 - 三、結(jié)束語- 18- 參考文獻- 18- android小游戲之2048課程設計 前言近期,新出的一款叫做2048的安卓游戲十分的火爆,幾乎游戲下載排行榜前十名都能看到它的身影。然而并不是每一

2、個人都知道一件事,那就是一個關(guān)于2048誕生的故事。故事的發(fā)展是這樣的,2048的祖先是一款名為threes(中文名為小3傳奇)的手游。小3傳奇的兩位開發(fā)者花了近一年半的時間才開發(fā)出這個游戲的核心玩法,卻在其上架app store后僅21天就被1024抄了過去。最讓人意想不到的事,2048則更為迅速,19歲的gabriele cirulli只用了一個星期改編前兩者游戲,卻獲得最大的成功,threes卻不被人所知。而到了現(xiàn)在,這類游戲從發(fā)布到現(xiàn)在,不光是app dtore還是android市場,下載量已經(jīng)遠遠超越了千萬,晚上各種版本的都有,比如朝代版,后宮版,甲乙丙版,生肖版等。由于本人十分喜歡

3、2048這款手游,在了解本次課程設計是設計一個android平臺下的軟件之后,就選定了2048游戲作為本次課程論文的課題。在此次課程論文的制作過程中,我將運用我在學校學習到的各種知識以及java編程知識和通過網(wǎng)上現(xiàn)有的資料嘗試完成本次課程的開發(fā)。2048游戲可以通過簡單的操作,豐富多彩的畫面來使人們達到放松的效果,人們只需要幾分鐘的時間就可以達到放松的效果。由于2048游戲的開發(fā)要求并不高,所以不需要購買特定的設施,只需要安裝特定的編程和圖像處理軟件來實現(xiàn)2048的開發(fā)。內(nèi)容安排要開發(fā)這一款游戲,要根據(jù)以下幾步來完成:首先是要對這款游戲的代碼分析。對整一個游戲,要將各個部位分割成其對應部位的功

4、能代碼,并且逐一去分析實現(xiàn)其中不同的功能。其次是游戲的流程。在做好每一個部分的代碼之后,就需要把所創(chuàng)造的各個關(guān)鍵部分拼接起來,因此,就需要先把該游戲的流程一步一步的弄清楚。再者是對2048這一款游戲的算法分析。對于整個游戲而言,最主要的心臟就是這一款游戲的算法,游戲好不好,就看這一款游戲的算法是不是符合邏輯。2048這一款游戲的算法分為上下左右自個方向的,具體的下面分析。2048中每個格子的數(shù)據(jù)和顏色的刷新。在每一次移動之后,幾乎在這4*4的每一個方格上的數(shù)據(jù)都會變化,因此在每一次移動之后,每一個方格上的數(shù)據(jù)都要刷新一次。相對的,每一個數(shù)的背景顏色是不同的,也就是說,在每一次數(shù)據(jù)刷新的時候,每

5、一個方格上的顏色也要同樣的刷新一次。最后是可不可以繼續(xù)游戲的檢測。當屏幕上沒有沒有寫有數(shù)據(jù)的方格并且屏幕上的數(shù)據(jù)沒有哪兩個相鄰的數(shù)據(jù)是一樣的兩個數(shù),那么就判定為游戲結(jié)束。功能設計1、設計界面 在設計整個2048游戲之前先得設計一個2048的游戲界面,只有有了游戲界面,才能夠進行2048這一款游戲的下一步設計,這是創(chuàng)建2048小游戲的最基礎的步驟。2048這一款游戲的界面是4*4方格的,于是就需要在界面上設置4*4的方格,有了這些方格之后才能在方格上面裝卡片(card),然后才能繼續(xù)游戲。private void ondrawborder(canvas canvas) paint.setshad

6、er(null);paint.setstrokewidth(16);paint.setcolor(color.white);canvas.drawline(0, 0, 0, this.getheight(), paint);canvas.drawline(0, 0, this.getwidth(), 0, paint);canvas.drawline(this.getwidth(), 0, this.getwidth(), this.getheight(), paint);canvas.drawline(0, this.getheight(), this.getwidth(), this.ge

7、theight(), paint);方格下面繼而顯示分數(shù)(score)和最高分數(shù)(bestscore)。2、游戲設計在2048游戲的界面設計好了之后,要求完成最核心的玩法就是卡片在于界面上4*4的移動,于是下一步的操作就是對卡片的具體設置,以下是一部分關(guān)鍵代碼。 (1)創(chuàng)建一個卡片private card getcard(int num) card c; if (cards.size()0) c = cards.remove(0); else c = new card(getcontext(); addview(c); c.setvisibility(view.visible); c.setn

8、um(num); return c; (2) 類card繼承了framelayout,目的是作為游戲中的卡片,卡片各個數(shù)字和樣式的實現(xiàn):public void setnum(int num) this.num = num; if (num=0) label.settext(); else label.settext(num+); switch (num) case 0: label.setbackgroundcolor(0x00000000);/透明色 break; case 2: default: label.setbackgroundcolor(0xff3c3a32); break; (3

9、) 卡片設計好了之后根據(jù)游戲要求判斷在某一操作下同一方向上的卡片是否可以相加,可以相加的部分進行數(shù)據(jù)合并。/合并相同數(shù)據(jù)int addscode = 0;for(int p=0;p0;q-)if(arraysqp=arraysq-1p&arraysqp!=0) flag_move = true; rraysqp+=arraysq-1p; addscode+=arraysqp; arraysq-1p=0; q-; 3、事件監(jiān)聽對于2048這個游戲經(jīng)過之前對游戲界面的設計、對游戲元素卡片的創(chuàng)建和定義好了之后,最終目的是要使我們能夠控制卡片進行移動,目標是使卡片能夠根據(jù)我們的命令進行向上、向下、向左

10、、向右的四個方向上的移動,這個需要加上4個方位的事件監(jiān)聽。overridepublic boolean onfling(motionevent e1, motionevent e2, float velocityx,float velocityy) float x=e2.getx()-e1.getx();float y=e2.gety()-e1.gety();final int fling_min_distance =50;if(xfling_min_distance&math.abs(velocityx)math.abs(velocityy)toright();else if(xmath.a

11、bs(velocityy)toleft();else if(yfling_min_distance&math.abs(velocityx)math.abs(velocityy)todown();else if(y-fling_min_distance&math.abs(velocityx)math.abs(velocityy)toup();return false; 以上是事件監(jiān)聽的部分關(guān)鍵代碼,事件監(jiān)聽創(chuàng)建好了之后,整個游戲大部分要求已經(jīng)完成了。4、游戲最終實現(xiàn)從游戲的角度來說,這個2048游戲有界面,有元素,可以移動已經(jīng)基本完成了,但作為有個游戲而言最后還有幾步?jīng)]有完善。初始化進入游戲,初

12、始化4*4表格,并隨機產(chǎn)生兩個數(shù)字(2或者4);二維數(shù)組this.tables表格循環(huán)存入數(shù)據(jù);random1, random2 ,random11, random22四個隨機數(shù)可以確定兩個2的xy位置;方法newnumber里面,根據(jù)位置i,j和級別num可以確定一個新的數(shù)字;創(chuàng)建背景cell和cell上面的數(shù)字標簽celllabel;并根據(jù)num確定是否顯示celllabel;最后給cell關(guān)聯(lián)一個data數(shù)據(jù);特別說明這里的number:num不是精靈上面的數(shù)字而是精靈的級別,比如number=11 則數(shù)字是1024。游戲結(jié)束的判斷每次發(fā)生卡片移動,都要檢查游戲還能否繼續(xù),是否已經(jīng)結(jié)束。

13、使用函數(shù)checkcomplete()完成游戲是否失敗的檢查。游戲的計分在卡片的每一次移動的時候判斷是否有兩個相同數(shù)字進行相加,凡是有相見的兩個數(shù)字其相加所得的和需要存入計分中,其中如果游戲獲得了最高分要對最高分進行保存。public class bestscore private sharedpreferences sp;public bestscore(context context)sp = context.getsharedpreferences(bestscore, context.mode_private);public int getbestscore()int bestscor

14、e = sp.getint(bestscore, 0);return bestscore;public void setbestscore(int bestscore)editor editor = sp.edit();editor.putint(bestscore, bestscore);mit();游戲邏輯重新設定 用不同方法制作嘗試可能性。首先看一下,我在實現(xiàn)2048時用到的一些存儲的數(shù)據(jù)結(jié)構(gòu)。我在實現(xiàn)時,為了省事存儲游戲過程中的變量主要用到的是list。比如說:listspacelist = new arraylist();這個spacelist主要作用于保存,所有

15、空白格的位置,也就是空白格在gridlayout中的位置(從0到15)對于數(shù)字格,以及格子對應的數(shù)據(jù),我寫了一個類如下:package com.example.t2048;import java.util.arraylist;import java.util.list;import android.util.log;/* * 用于保存數(shù)字格,已經(jīng)數(shù)字格對應的數(shù)字 * author mr.wang * */public class numberlist /這個list用于保存所有不為空的格子的坐標(在gridlayout中的位置從0到15)private list stufflist = new

16、 arraylist();/這個list用于保存所有不為空的格子對應的數(shù)字(以2為底數(shù)的指數(shù))private list numberlist = new arraylist();/* * 新加入的數(shù)字格 * param index 數(shù)字格對應的位置 * param number 對應數(shù)字的指數(shù)(以2為底數(shù)) */public void add(int index, int number)stufflist.add(index);numberlist.add(number);/* * 用于判斷當前位置是否為數(shù)字格 * param index 當前位置 * return true表示是 */pub

17、lic boolean contains(int index)return stufflist.contains(index);/* * 將當前的格子從數(shù)字列表中去掉 * param index */public void remove(int index)int order = stufflist.indexof(index);numberlist.remove(order);stufflist.remove(order);/* * 將當前格子對應的數(shù)字升級,指數(shù)加1 * param index */public void levelup(int index)int order = stuf

18、flist.indexof(index);numberlist.set(order, numberlist.get(order)+1);/* * 將當前格子對應的位置置換為新的位置 * param index 當前位置 * param newindex 新的位置 */public void changeindex(int index, int newindex)stufflist.set(stufflist.indexof(index), newindex);/* * 通過格子對應的位置獲取其對應的數(shù)字 * param index 當前位置 * return 格子對應數(shù)字的指數(shù) */publi

19、c int getnumberbyindex(int index)int order = stufflist.indexof(index);return numberlist.get(order) ;public string tostring()return stufflist.tostring()+numberlist.tostring();public void printlog()log.i(stufflist, stufflist.tostring();log.i(numberlist, numberlist.tostring();這個類主要是我對數(shù)字格、數(shù)字格對應數(shù)字的保存,和增刪

20、改等操作。其實就是兩個list,我為了操作起來方便,所以把他們寫在一個類里。然后,游戲的邏輯。比如,我們在游戲過程中執(zhí)行了一次向右滑動的操作,這個操作中,我們要對所有可移動和合并的格子進行半段和相應的操作:數(shù)字格的右邊如果是空白格,則數(shù)字格與空白格交換數(shù)字格右邊如果有多個空白格,則數(shù)字格與連續(xù)的最后一個空白格做交換數(shù)字格的右邊如果存在與之相同的數(shù)字格,則本格置空,右邊的數(shù)字格升級(指數(shù)加一)如果滑動方向連續(xù)存在多個相同的數(shù)字格,右的格子優(yōu)先升級在一次滑動中,每個格子最多升級一次當一個格子存在上述四種中的任意一種時,則完成了對它的操作。我們試著把上面的判斷規(guī)則翻譯成代碼,首先,明確在gridla

21、yout中的坐標位置,我在gridlayout中采用的是水平布局,所以每個格子對應的位置如下0 1 2 34 5 6 78 9 10 1112 13 14 15在這個基礎上,我建立如下坐標軸,以左上角為原點,x軸為橫軸,y軸為豎軸。當向右滑動的時候,從上面邏輯來看,為了方便我們應當從右向左歷格子:for(int y=0;y=0;x-)int thisidx = 4*y +x;change(thisidx,direction);每遍歷到一個新的格子,執(zhí)行一次change()方法,其實應該是沒遍歷到一個非空的格子,執(zhí)行一次change()當時我為了省事,把非空判斷加到了change的代碼里,來看一

22、下change()這個方法的實現(xiàn),這個方法主要是用來判斷,一個格子是需要移動、合并,還是什么都不操作:/* * 該方法,為每個符合條件的格子執(zhí)行變動的操作,如置換,升級等 * param thisidx 當前格子的坐標 * param direction 滑動方向 */public void change(int thisidx,int direction)if(numberlist.contains(thisidx)int nextidx = getlast(thisidx, direction);if(nextidx = thisidx)/不能移動return;else if(spacel

23、ist.contains(nextidx)/存在可以置換的空白格replace(thisidx,nextidx);elseif(numberlist.getnumberbyindex(thisidx)=numberlist.getnumberbyindex(nextidx)/可以合并levelup(thisidx, nextidx);elseint before = getbefore(nextidx, direction);if(before != thisidx)/存在可以置換的空白格replace(thisidx,before);其中g(shù)etlast()方法,用于獲取當前格子在移動方向的可

24、以移動或者合并的最后一個格子,如果返回值還是當前的格子,則表示不能移動。其中調(diào)用的getnext()方法是為了獲取當前格子在移動方向的下個格子的位置。/* * 用于獲取移動方向上最后一個空白格之后的位置 * param index 當前格子的坐標 * param direction 移動方向 * return */public int getlast(int thisidx, int direction) int nextidx = getnext(thisidx, direction); if(nextidx 0) return thisidx; else if(spacelist.cont

25、ains(nextidx) return getlast(nextidx, direction); else return nextidx; 然后是replace(int thisdx,int nextldx),這個方法是執(zhí)行兩個格子互換位置,內(nèi)容主要是對格子中的view更換背景圖片,然后操作空白格的list和數(shù)字格的list:/* * 該方法用來交換當前格與目標空白格的位置 * param thisidx 當前格子的坐標 * param nextidx 目標空白格的坐標 */public void replace(int thisidx, int nextidx)moved = true;/

26、獲取當前格子的view,并將其置成空白格view thisview = gridlayout.getchildat(thisidx);imageview image = (imageview) thisview.findviewbyid(r.id.image);image.setbackgroundresource(icons0);/獲取空白格的view,并將其背景置成當前格的背景view nextview = gridlayout.getchildat(nextidx);imageview nextimage = (imageview) nextview.findviewbyid(r.id.

27、image);nextimage.setbackgroundresource(iconsnumberlist.getnumberbyindex(thisidx);/在空白格列表中,去掉目標格,加上當前格spacelist.remove(spacelist.indexof(nextidx);spacelist.add(thisidx);/在數(shù)字格列表中,當前格的坐標置換成目標格的坐標numberlist.changeindex(thisidx, nextidx);levelup(int thisldx,int nextldx)這個方法是為了實現(xiàn)相同數(shù)字格的合并操作,其實就是將當前的格子置成空白格

28、,將移動方向上下一個格子對應的背景置成下一個背景:/* * 剛方法用于合并在移動方向上兩個相同的格子 * param thisidx 當前格子的坐標 * param nextidx 目標格子的坐標 */public void levelup(int thisidx, int nextidx)/一次移動中,每個格子最多只能升級一次if(!changelist.contains(nextidx)moved = true;/獲取當前格子的view,并將其置成空白格view thisview = gridlayout.getchildat(thisidx);imageview image = (ima

29、geview) thisview.findviewbyid(r.id.image);image.setbackgroundresource(icons0);/獲取目標格的view,并將其背景置成當前格升級后的背景view nextview = gridlayout.getchildat(nextidx);imageview nextimage = (imageview) nextview.findviewbyid(r.id.image);nextimage.setbackgroundresource(iconsnumberlist.getnumberbyindex(nextidx)+1);/在空白格列表中加入當前格spacelist.add(thisidx);/在數(shù)字列中刪掉第一個格子numberli

溫馨提示

  • 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

提交評論