高成珍
摘要:俄羅斯方塊是一款簡單有趣的益智類小游戲,通過對游戲中包含的元素及其關系的分析,抽象出相應的類和接口,通過對游戲過程的分析,抽象出關鍵的流程,并通過Java語言編程實現。
關鍵詞:俄羅斯方塊;Java
0引言
俄羅斯方塊是一款經久不衰的益智類小游戲,游戲規則簡單、有趣,老少皆宜。對于Java初學者來說是一個不錯的練習項目,難度適中,不僅可以檢驗知識的綜合運用,提升開發技能,培養面向對象編程思維,同時還可以激發學習興趣,增強自我效能感。
1俄羅斯方塊游戲中核心元素
游戲中核心元素包括3個:各種形狀的方塊、底部障礙物以及游戲面板。游戲主要是控制方塊在面板上的移動與變化以及障礙物的增加和消除。
1.1方塊
經典的俄羅斯方塊游戲中方塊主要有7種類型,如圖1所示,每一種類型又有若干種變形,如圖2所示。
根據圖2形狀的分析可以得出,所有的方塊都可以用一個4*4的格子表示,格子有兩種狀態:空白和填充。對于不同的形狀,填充部分不同而已,所以可以用一個包含16個整型元素的一維數組來表示一種具體的形狀。當需要填充時,對應的位置上的數字為1,否則位置上的數字為0。采用二維數組存儲一種類型的方塊,第一維表示的是第幾種變體,第二維表示具體形狀的數值。采用三維數組存儲所有的方塊,第一維表示哪一種類型,第二維表示該類型的第幾種變體,第三維表示具體形狀的數值。對于方塊來說除了要知道它的形狀以外,還需要知道它的位置,并且能夠根據需要進行移動和變形,所以方塊類(Shape)的設計如圖3所示。
1.2障礙物
障礙物實際上就是不能移動的方塊組合,障礙物會隨著游戲執行過程而不斷增加或減少。與方塊類似可以采用一個二維數組來保存障礙物,數組的大小即為整個面板中橫向和縱向上格子的個數,對于需要填充的格子數值標記為1,空白格子對應的數值為0。障礙物添加后需要判斷是否超出邊界,如果超出則游戲結束,同時需要判斷是否有滿行,有則需要刪除等等,障礙物類(Ground)的關鍵屬性和方法如圖4所示。
1.3游戲面板
游戲面板主要用于顯示方塊以及障礙物,需要指定寬度和高度,為了使程序更為靈活,面板的寬度和高度不指定為具體的數值,而是以格子為單位,指定包含多少個格子,通過靜態常量指定格子個數以及格子的邊長。游戲面板類的關鍵屬性和方法如圖5所示。
2俄羅斯方塊游戲關鍵流程
俄羅斯方塊游戲的主要流程為:游戲開始后,隨機生成方塊,啟動線程讓方塊定時下落,監聽用戶的按鍵操作控制方塊的移動和變形,及時刷新方塊位置,方塊位置變化后需重新判斷是否可以繼續移動,如果不能移動則將其轉換成障礙物。轉換后需判斷是否可以消除障礙物,以及是否游戲結束。具體流程如圖6所示,程序運行效果如圖7所示。
3關鍵功能分析與設計
3.1如何實現方塊的移動
方塊移動有兩種類型:一種是定時自由下落;另一種是根據用戶的按鍵操作進行變化,如左移、右移、下移或者旋轉。對于第一種移動類型,通過單獨啟動一個線程來完成,線程每隔一定的時間,執行Shape的下移方法,下移后需通知面板及時刷新。因為Shape類和GamePanel面板類不在同一個文件,二者之間不能直接通信,可借助于中介一控制器Controller。為Shape對象添加一個監聽變化的監聽器ShapeListener,而Controller實現了該接口,在創建Controller對象時傳遞GamePanel對象,形狀發生變化時,會調用Controller的相應方法,在該方法內可調用GamePanel的顯示方法。對于第二種移動類型,主要是通過監聽用戶按鍵的操作,然后根據所按的鍵,執行相應的操作(←表示左移,↓表示右移,↓表示下移,↑表示旋轉),最后同樣調用GamePanel的顯示方法,刷新界面。
3.2方塊與障礙物的轉換及消除障礙物
障礙物實際上就是不能移動的方塊,當方塊不能向下移動時,就需要將其轉換成障礙物,只需獲取方塊的位置,然后將障礙物中該位置對應的值設置為1,然后重新繪制即可。轉換成障礙物后,循環遍歷每一行數據,如果一行中所有的數據都為1,則表明這一行為滿格,需要消除,只需要將該行上面的所有數據集體向下移動即可。
4總結
本文從面向對象編程思想出發,分析俄羅斯方塊游戲中主要的元素及其關系,抽象出相應的類和接口,整體采用MVC模式,通過控制器控制對象間的通信與數據傳遞,具有較好的擴展性和靈活性。對于提升初學者綜合運用Java知識設計簡單的系統具有一定的借鑒意義。