摘要: 該文繞開了晦澀難懂、比較復雜的“矩陣算法”,提出了另一種“枚舉算法”來實現這個經典游戲。“枚舉算法”沒有復雜的數學理論,避免了在程序中大量使用矩陣運算公式,設計思路清晰、明了,非常適合游戲設計的初學者理解和實現,最后用Flash Active Script設計實現“俄羅斯方塊”游戲
關鍵詞:俄羅斯方塊游戲;基本型方塊;旋轉型方塊;枚舉;算法
中圖分類號:TP312文獻標識碼:A文章編號:1009-3044(2009)14-3710-03
Designing Russian Grid Game by Using Enumerative Algorithm
QIU Ju, TANG Kai-jun, XU Li-xi, NIU Xiao-mei
(No.2 Public Course Teaching and Research Department, Zigong Health School, Zigong Renji Medical Center of Sichuan Province, Zigong 643000, China)
Abstract: This thesis keeps away from the elusive and complicated Matrix Algorithm and put forward the Enumerative Algorithm to realize the classical Russian Grid Game. The Enumerative Algorithm without complicated mathematical theory can avert large number of matrix operational formulas so that the consideration of design is clear and obvious. This is a suitable way for the beginners of computer game designers to understand, design and realize the Russian Grid Game by using Flash Active Script.
Key words: the Russian Grid Game; basic-form grid; rotating grid; enumerate; algorithm
1 “枚舉算法”概述
本文則提出了所謂枚舉算法,就是直接枚舉出游戲中方塊的基本形狀和它們的旋轉形狀,然后控制每一種不同形狀的方塊在游戲中的產生、移動、旋轉、落下、清除填滿行等游戲過程。
1.1 方塊基本形狀和種類
根據分析,“俄羅斯方塊游戲”中的方塊,共有七種基本形狀,它們分別是“I型”、“L型”、“反L型”、“Z型”、“反Z型”、“口型”、“T型”,如圖1。
1.2 方塊的旋轉形狀
游戲過程中,每一種基本方塊都要做旋轉控制,于是就產生了旋轉后的方塊形狀,本文將其稱為“旋轉型”。
基本型中的“I型”、只有一種旋轉型,即由豎直旋轉90°后成為水平。因此,基本型加上一種旋轉型,共有兩種形狀。
基本型中的“L型”和“反L型”有三種旋轉型,將它按順時針每旋轉一個90°就產生一種旋轉型,它可以旋轉三次,得到三種不同的旋轉型,因此,它的三種旋轉型加上其基本型,“L型”和“反L型”方塊分別有四種形狀。
基本型中的“Z型”和“反Z型”可以順時針旋轉一次90°,加上他們的基本型分別有兩種形狀。
基本型中的“T型”有三種旋轉型,將他按順時針旋轉一個90°就產生一種旋轉型,它可以旋轉三次,得到三種不同的旋轉型,因此,它的三種旋轉型加上其基本型,“T型”方塊共有四種形狀。
基本型中的“口型”方塊沒有旋轉型,在游戲中只有一種形狀。
經前面的分析得知,七種基本型方塊,因旋轉產生了不同的旋轉型,這些旋轉型加上他們的基本型,整個游戲中,共有19種不同的方塊形狀。
2 基本型方塊的構成和控制
每一種基本型方塊都由4個正方形小方塊構成,利用小方塊不同擺的放位置,產生19種旋轉型。利用隨機函數在一個預覽窗中提前展示形狀供用戶參考,然后將展示的形狀復制到游戲主窗口中進行擺放,在游戲主窗口中用戶就可以使用鍵盤的方向鍵來控制方塊的運動。然后對每一行進行判斷,如果有某行的方塊是滿的,則消除這行的方塊,并且使上面的方塊自由下落,其中,方塊向下的速度是有時鐘控件控制的,在游戲中,用戶也可以使用“向下光標鍵”加快下落速度,定義一個變量,對消除的函數進行記錄,最后就可以得出用戶的分數,用if 語句對分數判斷,達到一定的積分就可以升級到下一個檔次。
2.1 基本型方塊的夠成
所謂“基本型方塊”是指每新產生的,沒有經過旋轉的方塊形狀(如圖1),基本型方塊是有4個正方形的小方塊拼接而成。在程序實現過程中,可以使用4個正方形控件來構成每一種基本型方塊。
2.2 主游戲界面與數據結構設計
為了能實現控制方塊的旋轉、平移、下落等操作。需要構造一個游戲主窗口和一個二維矩陣數據結構。
2.2.1 主游戲界面
在主窗口中按照9X15,將小方塊(控件)進行排列,每一個控件的Visible屬性設置成“False——不可見”,表示在開始游戲之前,主界面中沒有任何方塊。左上角作為坐標起始點,為了在程序中,對主窗口中的每一個小方塊(正方形控件)進行遍歷,用數字字符給控件按照一定的規則進行命名如圖2。
正方形控件的名稱=行坐標*每行控件的數量+列坐標=行坐標*9+列坐標
2.2.2 構造一個大小為9X15的二維數組
用來保存對應主界面中的每一個方塊位置是否被填充,已經被填充的為“1”,未填入的為“0”。通過這樣的方法,即可簡單地將數據結構映射到由小方塊(正方形控件)組成的圖形界面上。
2.2.3 小方塊的初始化顯示
在游戲開始或者前一個方塊已經不能繼續下落的時候,需要在主界面的第一行(行坐標為0)、第五列(列坐標為4)的位置顯示某一個基本型方塊。這個功能由計算機產生一個1~7隨機數,表示7中基本型方塊的某一種,然后枚舉出基本型方塊初始時,在主界面中的位置,并把主界面中,對應的小方塊(正方形控件)的Visible的值修改成“True(可見)”。例如:隨機數為2,對應“L型”方塊,它對應坐標為(0,4),(1,4),(2,4),(2,5),根據控件命名規則,可以計算出主界面中需要修改的控件名稱分別為“4”、“13”、“22”、“23”。如圖3。
小方塊初始化算法:
Function Init(int Shape){
Switch(Shape)
Case 1:
設置主界面中相對應的控件Visible=true;
產生1型方塊;
Break
Case 2;
設置主界面中相對應的控件Visible=true;
產生2型方塊;
Break
Case 3:
設置主界面中相對應的控件Visible=true;
產生3型方塊;
Break
Case 4:
設置主界面中相對應的控件Visible=true;
產生4型方塊;
Break
Case 5:
設置主界面中相對應的控件Visible=true;
產生5型方塊;
Break
Case 6:
設置主界面中相對應的控件Visible=true;
產生6型方塊;
Break
Case 7:
設置主界面中相對應的控件Visible值=true;
產生7型方塊;
Break
Return;
}
3 方塊的下移、平移、旋轉
基本型方塊初始化產生后,還需要用變量保存它的形狀代碼shape、旋轉型rot和在主界面中的起始行坐標row和列坐標column,例如圖3中的“L型”方塊:
shape=2;rot=1(旋轉三個90°,分別為2,3,4);
row=0;column=4;
3.1 方塊的下移
1) 下移的合法性判斷:方塊下移的前提是,方塊沒有到達最底部,這可以通過行坐標row<14來判斷,方塊下移時要通過的位置沒有被前面的方塊填充,這個需要通過與主界面一一映射的二維數組相對應的單元是否為“1”來判斷,如果以上條件合法,則,方塊下移。
2) 下移的實現:方塊下移也是通過修改主界面上的小方塊(控件)的Visible屬性來實現的。例如圖3中的“L型”方塊下移一格,需要修改控件:
控件4.visible=1;控件23.visible=1;
控件31.visible=true;控件32.visible=true;如圖4。
3.2 方塊平移
方塊的平移包括左移和右移兩種情況,無論那種情況都要首先進行合法性判斷。
1) 合法判斷,平移的合法性判斷比較簡單,只需判斷它旁邊相鄰位置是否被填充為,可以通過對映射二維數組中相對應的單元是否為“1”來實現,同時也要判斷是否已經到了左右邊界。
2) 平移實現,方塊平移也是通過修改主界面上的小方塊(控件)的Visible屬性來實現的。例如圖4中的方塊左移一格,需要將“13”、“22”、“32”控件的visible=1;“12”、“21”、“30”控件的visible=true即可。
3.3 方塊旋轉
1) 合法性判斷,在游戲中,方塊做順時針旋轉,每次旋轉90°,方塊旋轉前的合法性檢查稍微要復雜一些,主要涉及到它旋轉所要經過的位置不能有已經填充的方塊。
例如圖4中的“L型”方塊旋轉前(順時針90°),必須檢查“21”、“30”、“14”、“23”處沒有被填充方塊,這個檢查也是通過對二維數組中相對應的單元是否為“1”。來判斷。
2) 旋轉的實現,當合法性檢查后,就可以通過修改相關位置的控件visible值來實現旋轉。方法和平移、下落一樣。
3.4 算法實現
從前述所知,游戲中7種基本型方塊加上他們的旋轉型方塊總共有19種類型,程序算法只需要根據他們的形狀代碼shape、旋轉型rot,在主界面中的行坐標row和列坐標column,每做一次平移、下落、旋轉,要跟蹤修改他的shape、rot、row,column等值,為下一次操作提供枚舉依據,然后用代碼對每一種情況進行處理即可。
由于篇幅有限,這兒沒有給出全部源代碼,有興趣的讀者可以與本文作者聯系索取完全編譯通過的源代碼
參考文獻:
[1] 唐凱軍,湯惠莉.80例上手VB6編程[M].濟南:山東電子音像出版社,2004.
[2] 韋綱.FlashMX2004多媒體課件制作教程[M].北京:海洋出版社,2005.
[3] 王燕.面向對象的理論與C++實踐[M].北京:清華大學出版社,1997.