一個(gè)MIDP俄羅斯方塊游戲的設(shè)計(jì)和實(shí)現(xiàn)
文章來源:csdn 作者:陳萬飛
作者簡介
陳萬飛,男,中南大學(xué)數(shù)軟系學(xué)士,曾任北京長城軟件高級(jí)程序員,系統(tǒng)分析師.有較為豐富的j2se,j2ee開發(fā)經(jīng)驗(yàn)。目前致力于j2me研究工作??赏ㄟ^chen_cwf@163.net與他聯(lián)系
摘要
本文給出了一個(gè)基于MIDP1.0的俄羅斯方塊游戲的設(shè)計(jì)方案,并給出全部實(shí)現(xiàn)源代碼。該游戲的最大特色是屏幕自適應(yīng),無論各種手機(jī),PDA的屏幕大小如何,該游戲總是能獲得最佳的顯示效果。游戲在J2me wireless toolkit 2.1的4種模擬器上測試通過。
聲明:本游戲代碼最初來源于一個(gè)日本開源項(xiàng)目(見參考資料1),筆者有大幅度修改。
以下為幾張游戲截屏圖:
設(shè)計(jì)
1. 操作流程
本游戲的操作流程非常簡單,用戶啟動(dòng)MIDlet啟動(dòng)后,即進(jìn)入游戲主畫面,屏幕開始顯示為歡迎畫面。用戶按下[開始]按鈕后,就可以開始玩游戲了,當(dāng)用戶想暫停時(shí),再次按一下[開始]按鈕,游戲就暫停了,在暫停的情況下再按[開始]按鈕,游戲繼續(xù)運(yùn)行。任何時(shí)候按[退出]按鈕,游戲MIDlet都會(huì)終止.
游戲畫面流程圖如下:
2. 算法
MIDP的游戲設(shè)計(jì),本質(zhì)上就是用一個(gè)線程或者定時(shí)器產(chǎn)生重繪事件,用線程和用戶輸入改變游戲狀態(tài)。這個(gè)游戲也不例外,啟動(dòng)MIDlet后,就立即生成一個(gè)重繪線程,該線程每隔50ms繪制一次屏幕。當(dāng)然,重繪時(shí)有一些優(yōu)化措施,并不是屏幕上所有的像素都需要重繪,而是有所選擇,比如游戲畫布上那些已經(jīng)固定下來的下墜物(下墜物一共有7種,由4個(gè)小磚塊組成,每種下墜物顏色固定,可以上下左右旋轉(zhuǎn))就不需重繪。游戲畫布是一個(gè)CommandListener,可以接受用戶鍵盤命令,控制下墜物的左移,右移,下移,旋轉(zhuǎn)動(dòng)作。整個(gè)游戲的流程控制體現(xiàn)在游戲畫布對(duì)象的paint()方法里。paint()根據(jù)當(dāng)前的游戲狀態(tài),繪制出當(dāng)時(shí)的游戲畫面。歡迎畫面和Game Over畫面的繪制相當(dāng)簡單。游戲暫停畫面的繪制也相當(dāng)容易,就是設(shè)立標(biāo)志,讓paint()執(zhí)行的時(shí)候無需真正執(zhí)行重繪動(dòng)作。對(duì)于游戲處于運(yùn)行狀態(tài)的畫面的繪制,則需要在下墜物的當(dāng)前位置,繪制下墜物。在繪制下墜物之前,判斷下墜物是否還能下墜,如果能下墜的話,就讓它下落一格,再進(jìn)行繪制,如果下墜物已無法下墜,則判斷游戲是否處于Game Over狀態(tài),如果是處于Game Over狀態(tài)的話,則設(shè)置游戲狀態(tài)為Game over狀態(tài),這樣畫布在下一次重繪時(shí)就繪出Game Over的畫面.如果游戲不是處于Game Over狀態(tài),則把下墜物固定下來,同時(shí)檢查游戲畫布上下墜物當(dāng)前行下面的所有行,看是否需要進(jìn)行行刪除動(dòng)作,如果需要行刪除,則清除游戲地圖上被刪行的數(shù)據(jù),再把被刪行繪制成背景色。然后初始化一個(gè)新的下墜物,繪制這個(gè)新的下墜物。paint方法的流程圖如下所示:
3. 數(shù)據(jù)結(jié)構(gòu)
本游戲涉及到以下幾種數(shù)據(jù)結(jié)構(gòu)。
游戲區(qū)域
游戲區(qū)域?yàn)槭謾C(jī)或者PDA屏幕的一部分,該區(qū)域?yàn)檎叫?邊長一定能被16整除(因?yàn)槎砹_斯游戲區(qū)域剛好為16個(gè)小磚塊長,16個(gè)小磚塊寬的方形)。無論在水平方向還是垂直方向,該區(qū)域都要處于屏幕的居中位置。游戲區(qū)域在水平方向上分為2部分,一部分為12個(gè)小磚塊寬,用來顯示游戲容器,另一部分為4個(gè)小磚塊寬,用來顯示下一個(gè)下墜物和分?jǐn)?shù)。
小磚塊
小磚塊是下墜物和游戲容器的組成部分。表現(xiàn)為一個(gè)正方形,邊長為游戲區(qū)域邊長的1/16。每個(gè)小磚塊在繪制的時(shí)候,4邊會(huì)留出1個(gè)象素寬,繪制成白色或者灰色,這樣磚塊之間才有間隙。每種小磚塊也有id,分別為1到8。我們可以用一個(gè)顏色數(shù)組(程序里叫BRICK_COLORS)存儲(chǔ)這8種顏色。若某種小磚塊的id為3,那么該小磚的顏色為BRICK_COLORS[3-1].
下墜物
下墜物本質(zhì)上為16個(gè)小磚塊組成的正方形。下墜物一共有7種,比如有"田"字形的,"L"字形的等等。每種下墜物一共有4種旋轉(zhuǎn)變化。 每種下墜物都有一個(gè)id,分別為1到7。因?yàn)閷?duì)于一種下墜物來說,其顏色是固定的。我們同樣可以用該種顏色在BRICK_COLORS數(shù)組中的下標(biāo)值加上1,作為下墜物的id.
例如"L"形下墜物的id為3,其變化形式為:
那么用什么數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)一個(gè)下墜物呢,我們以"L"形的下墜物為例子來說明:
因?yàn)槊恳粋€(gè)下墜物有四種狀態(tài),所以我們可以考慮用一個(gè)長度為4的數(shù)組來存貯一個(gè)下墜物的4種狀態(tài),數(shù)組中每一個(gè)元素表示該下墜物的一種狀態(tài)。那么用什么東西來表示某個(gè)下墜物的某種狀態(tài)呢,從上圖可以看出,用一個(gè)4X4的二維數(shù)組來存儲(chǔ)一種下墜物的一種狀態(tài)最合適不過了。在有色磚塊出現(xiàn)的位置,值為1,而只有背景顏色,無需繪制的位置,值為0。因此,整個(gè)"L"形下墜物的4種狀態(tài)可以用一個(gè)3維數(shù)組來表示:
protected int blockpattern3[][][] = {
{{0, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 1, 0}, {0, 0, 0, 0}},
{{0, 0, 0, 0}, {0, 1, 1, 1}, {0, 1, 0, 0}, {0, 0, 0, 0}},
{{0, 0, 0, 0}, {0, 1, 1, 0}, {0, 0, 1, 0}, {0, 0, 1, 0}},
{{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 1, 1, 0}, {0, 0, 0, 0}}
};
游戲地圖
游戲地圖是用來存儲(chǔ)游戲容器上的固定磚塊的。游戲容器為一個(gè)寬為12個(gè)小磚塊單位,高為16個(gè)小磚塊單位,包括左右2堵墻和下邊的容器底在內(nèi)。所以用一個(gè)16X12的二維數(shù)組(程序里叫mapdata)來存儲(chǔ)固定磚塊。如果mapdata[i][j]=k(k!=0).那么就表示游戲容器的i行j列上有個(gè)固定的小磚塊,小磚塊的顏色值為BRICK_COLORS[k-1].如果k=0則表示i行j列無磚塊。
因此對(duì)于以下這種游戲運(yùn)行時(shí)刻,mapdata的值為{{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0,8}
{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0,8}{}{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0,8}
{8,0,0,0,0,0,0,0,0,1,1,8}{8,0,0,0,0,0,0,0,0,1,1,8}{8,0,0,0,0,0,7,7,5,1,1,8}{8,0,5,0,0,7,2,5,5,1,1,8}
{8,8,8,8,8,8,8,8,8,8,8,8}}
源代碼和可執(zhí)行代碼
總共為3個(gè)文件:src.rar, ketrisgame.jad, ketrisgame.jar 說明:src.rar中有全部的源代碼。ketrisgame.jar中還有程序運(yùn)行所需要的資源文件.安裝wtk2.1后,讓ketrisgame.jad和ketrisgame.jar處于同一目錄下(目錄路徑中不能含有中文和空格 切記),雙擊ketrisgame.jad文件,即可在模擬器里運(yùn)行游戲。
參考資料
http://www.javadrive.jp/j2me/game/3/index.html
<j2me in a nutshell>
<java 手機(jī)/PDA 程序設(shè)計(jì)入門>
上一篇:SWT(JFace)體驗(yàn)之StyledText類
欄 目:Java編程
本文標(biāo)題:一個(gè)MIDP俄羅斯方塊游戲的設(shè)計(jì)和實(shí)現(xiàn)
本文地址:http://mengdiqiu.com.cn/a1/Javabiancheng/8536.html
您可能感興趣的文章


閱讀排行
本欄相關(guān)
- 01-10Java咖啡館(1)——嘆咖啡
- 01-10JVM的垃圾回收機(jī)制詳解和調(diào)優(yōu)
- 01-10Java Socket編程(三) 服務(wù)器Sockets
- 01-10Java進(jìn)階:Struts多模塊的技巧
- 01-10J2SE 1.5版本的新特性一覽
- 01-10Java Socket編程(一) Socket傳輸模式
- 01-10Java運(yùn)行時(shí)多態(tài)性的實(shí)現(xiàn)
- 01-10Java Socket編程(二) Java面向連接的類
- 01-10Java Socket編程(四) 重復(fù)和并發(fā)服務(wù)
- 01-10Java經(jīng)驗(yàn)點(diǎn)滴:處理沒有被捕獲的異常
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?