文章來源:csdn 作者:陳萬飛
作者簡介
陳萬飛,男,中南大學數軟系學士,曾任北京長城軟體高級程式設計師,系統分析師.有較為豐富的j2se,j2ee開發經驗。目前致力於j2me研究工作。可透過[email protected]與他聯繫
摘要
本文給出了一個基於MIDP1.0的俄羅斯方塊遊戲的設計方案,並給出全部實現原始碼。遊戲的最大特色是螢幕自適應,無論各種手機,PDA的螢幕大小如何,遊戲總是能獲得最佳的顯示效果。遊戲在J2me wireless toolkit 2.1的4種模擬器上測試通過。
聲明:本遊戲程式碼最初來自於一個日本開源專案(見參考資料1),筆者有大幅修改。
以下為幾張遊戲截圖:
設計
1.操作流程
本遊戲的操作流程非常簡單,使用者啟動MIDlet啟動後,即進入遊戲主畫面,畫面開始顯示為歡迎畫面。用戶按下[開始]按鈕後,就可以開始玩遊戲了,當用戶想暫停時,再次按一下[開始]按鈕,遊戲就暫停了,在暫停的情況下再按[開始]按鈕,遊戲繼續運行。任何時候按[退出]按鈕,遊戲MIDlet都會終止.
遊戲畫面流程圖如下:
2.演算法
MIDP的遊戲設計,本質上就是用一個執行緒或定時器產生重繪事件,用執行緒和使用者輸入改變遊戲狀態。這個遊戲也不例外,啟動MIDlet後,就立即產生一個重繪線程,該線程每隔50ms繪製一次螢幕。當然,重繪時有一些優化措施,並不是螢幕上所有的像素都需要重繪,而是有所選擇,比如遊戲畫布上那些已經固定下來的下墜物(下墜物一共有7種,由4個小磚塊組成,每種下墜物顏色固定,可以上下左右旋轉)就不需重繪。遊戲畫布是一個CommandListener,可以接受使用者鍵盤指令,控制下墜物的左移,右移,下移,旋轉動作。整個遊戲的流程控制體現在遊戲畫布物件的paint()方法裡。 paint()根據目前的遊戲狀態,繪製出當時的遊戲畫面。歡迎畫面和Game Over畫面的繪製相當簡單。遊戲暫停畫面的繪製也相當容易,就是設立標誌,讓paint()執行的時候無需真正執行重繪動作。對於遊戲處於運行狀態的畫面的繪製,則需要在下墜物的當前位置,並繪製下墜物。在繪製下墜物之前,判斷下墜物是否還能下墜,如果能下墜的話,就讓它下落一格,再進行繪製,如果下墜物已無法下墜,則判斷遊戲是否處於Game Over狀態,如果是處於Game Over狀態的話,則設定遊戲狀態為Game over狀態,這樣畫佈在下一次重繪時就繪出Game Over的畫面.如果遊戲不是處於Game Over狀態,則把下墜物固定下來,同時檢查遊戲畫布上下墜物目前行下面的所有行,看是否需要進行行刪除動作,如果需要行刪除,則清除遊戲地圖上被刪行的數據,再把被刪行繪製成背景色。然後初始化一個新的下墜物,繪製這個新的下墜物。 paint方法的流程圖如下所示:
3.資料結構
本遊戲涉及以下幾種資料結構。
遊戲區域
遊戲區域為手機或PDA螢幕的一部分,該區域為正方形,邊長一定能被16整除(因為俄羅斯遊戲區域剛好為16個小磚塊長,16個小磚塊寬的方形)。無論在水平方向還是垂直方向,該區域都要處於螢幕的居中位置。遊戲區域在水平方向上分為2部分,一部分為12個小磚塊寬,用來顯示遊戲容器,另一部分為4個小磚塊寬,用來顯示下一個下墜物和分數。
小磚塊
小磚塊是下墜物和遊戲容器的組成部分。表現為一個正方形,邊長為遊戲區域邊長的1/16。每個小磚塊在繪製的時候,4邊會留出1個像素寬,畫成白色或灰色,這樣磚塊之間才有間隙。每種小磚塊也有id,分別為1到8。我們可以用一個顏色數組(程式裡叫BRICK_COLORS)來儲存這8種顏色。若某小磚塊的id為3,那麼該小磚的顏色為BRICK_COLORS[3-1].
下墜物
下墜物本質上為16個小磚塊組成的正方形。下墜物共有7種,例如有"田"字形的,"L"字形的等等。每種下墜物共有4種旋轉變化。 每種下墜物都有一個id,分別為1到7。因為對於一種下墜物來說,其顏色是固定的。我們同樣可以用該種顏色在BRICK_COLORS數組中的下標值加上1,作為下墜物的id.
例如"L"形下墜物的id為3,其變化形式為:
那麼用什麼資料結構儲存一個下墜物呢,我們以"L"形的下墜物為例子來說明:
因為每一個下墜物有四種狀態,所以我們可以考慮用一個長度為4的陣列來存貯一個下墜物的4種狀態,陣列中每一個元素表示該下墜物的一種狀態。那麼用什麼東西來表示某個下墜物的某種狀態呢,從上圖可以看出,用一個4X4的二維數組來存放一種下墜物的一種狀態最合適不過了。在有色磚塊出現的位置,值為1,而只有背景顏色,無需繪製的位置,值為0。因此,整個"L"形下墜物的4種狀態可以用一個3維數組來表示:
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}}
};
遊戲地圖
遊戲地圖是用來儲存遊戲容器上的固定磚塊的。遊戲容器為一個寬為12個小磚塊單位,高為16個小磚塊單位,包括左右2堵牆和下邊的容器底。所以用一個16X12的二維數組(程式裡叫mapdata)來儲存固定磚塊。如果mapdata[i][j]=k(k!=0).那麼就表示遊戲容器的i行j列上有個固定的小磚塊,小磚塊的顏色值為BRICK_COLORS[k-1].若k=0則表示i行j列無磚塊。
因此對於以下這種遊戲運行時刻,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}}
原始碼和可執行程式碼
總共為3個檔案:src.rar, ketrisgame.jad, ketrisgame.jar 說明:src.rar中有全部的原始碼。 ketrisgame.jar中還有程式運作所需的資源檔案.安裝wtk2.1後,讓ketrisgame.jad和ketrisgame.jar處於同一目錄下(目錄路徑中不能含有中文和空格切記),雙擊ketrisgame.jad文件,即可在模擬器裡運行遊戲。
參考資料
http://www.javadrive.jp/j2me/game/3/index.html
<j2me 在 a nutshell>
<java 手機/PDA 程式設計入門>