用Java寫俄羅斯方塊
假期閒著無事,就用一週多的時間看了百度java吧的一位大神(alwing)釋出的視訊,學著用java寫了一個俄羅斯方塊,在此就以釋出原始碼以及必要講解的形式來感謝他的幫助。當然我這裡也是做了一些改動,做出來的程式介面以及功能沒有和他的完全一樣。
整個程式執行起來的介面如下所示:
程式包含的功能有:
- 俄羅斯方塊本身基本的遊戲元素
- 顯示下一輪出現的方塊、當前等級、分數、消行數等數值
- 以值槽形式顯示當前等級到下一等級的距離
- 左上角頭像以及背景圖片會隨著等級的升高而改變
- 迴圈播放背景音樂
一、
整個程式的設計如下圖所示,共有七個包。因為程式原先的設計是會連線資料庫儲存使用者名稱稱以及分數的,而我的電腦又因為資料庫軟體安裝失敗,所以功能上我做了調整。因此某些包名以及類名會與其本身功能不符。
二、
整個程式中最重要的介面程式設計是由UI包中的Layer類來建立的,它定義了一個方法使一張64乘64畫素的圖片運用drawImage函式來切割、拉伸成預定的寬度和高度,並使之顯示在指定的座標,從而成為一個視窗。
UI包中的各個Layer***.java類都繼承了Layer類,分別用來實現各個視窗介面,如遊戲主視窗(LayerGame)、等級視窗(LayerLevel)、分數視窗(LayerPoint)等。此外我還在視窗表面覆蓋了一層半透明的圖片,從而實現了一種“朦朧感”。
三、
Img類是用來宣告所有的圖片物件的,我在宣告邊框圖片WINDOW時,又故意寫錯路徑,從而實現了無邊框效果。
四、
下落方塊的繪製也是採用圖片切割的方法
每個不同顏色的方塊都一樣大,每次使用drawImage函式來切割不同顏色的方塊。首先要把遊戲主視窗看成是一個以左上角為原點的座標系,遊戲主視窗寬為9,高為16,則右下角的座標應該是(15,8),這樣就可以為下落方塊定義座標了。再採用List < Point[] >來儲存下落方塊中各個小方塊的座標。
下落方塊應該是如下七種形狀:
則方塊0到方塊6自由下落時的初始座標應是:
TYPE_CONFIG=new ArrayList<Point[]>(7);
TYPE_CONFIG.add(new Point[]{new Point(4,0),new
Point(3,0),new Point(5,0),new Point(6,0)});
TYPE_CONFIG.add(new Point[]{new Point(4,0),new
Point(3,0),new Point(5,0),new Point(4,1)});
TYPE_CONFIG.add(new Point[]{new Point(4,0),new
Point(3,0),new Point(5,0),new Point(3,1)});
TYPE_CONFIG.add(new Point[]{new Point(4,0),new
Point(5,0),new Point(3,1),new Point(4,1)});
TYPE_CONFIG.add(new Point[]{new Point(4,0),new
Point(5,0),new Point(4,1),new Point(5,1)});
TYPE_CONFIG.add(new Point[]{new Point(4,0),new
Point(3,0),new Point(5,0),new Point(5,1)});
TYPE_CONFIG.add(new Point[]{new Point(4,0),new
Point(3,0),new Point(4,1),new Point(5,1)});
每一個方塊都有一箇中心點,當方塊旋轉時,方塊以該中心點位圓心進行90°的旋轉。
旋轉方法如下:
五、
遊戲的邏輯控制主要在GameService類中,實現了判斷是否能消行,消行操作,鍵盤相應操作等
六、
程式中使用了dom4j-1.6.1.jar和jl1.0.1.jar兩個額外的jar包。
dom4j-1.6.1.jar用來讀取xml檔案。在config資料夾中有個cfg.xml檔案,當中設定了各個視窗的大小以及位置。在程式中使用dom4j-1.6.1.jar來讀取xml資料,然後根據這些資料來配置程式介面。因此只要改變了xml中的數值,就可以改變視窗的大小以及座標。
jl1.0.1.jar則是用來播放背景音樂的,這是我自己新增的功能,通過這個jar檔案提供的方法,可以很簡單地實現播放音樂的功能,具體實現在MP3Player類和Main類中,需要在Main類中新建一個執行緒。
具體參考方法:JavaSwing後臺播放音樂
七、
原始碼程式下載:原始碼