摘要: 該文繞開了晦澀難懂、比較復(fù)雜的“矩陣算法”,提出了另一種“枚舉算法”來實(shí)現(xiàn)這個(gè)經(jīng)典游戲?!懊杜e算法”沒有復(fù)雜的數(shù)學(xué)理論,避免了在程序中大量使用矩陣運(yùn)算公式,設(shè)計(jì)思路清晰、明了,非常適合游戲設(shè)計(jì)的初學(xué)者理解和實(shí)現(xiàn),最后用Flash Active Script設(shè)計(jì)實(shí)現(xiàn)“俄羅斯方塊”游戲
關(guān)鍵詞:俄羅斯方塊游戲;基本型方塊;旋轉(zhuǎn)型方塊;枚舉;算法
中圖分類號(hào):TP312文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):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 “枚舉算法”概述
本文則提出了所謂枚舉算法,就是直接枚舉出游戲中方塊的基本形狀和它們的旋轉(zhuǎn)形狀,然后控制每一種不同形狀的方塊在游戲中的產(chǎn)生、移動(dòng)、旋轉(zhuǎn)、落下、清除填滿行等游戲過程。
1.1 方塊基本形狀和種類
根據(jù)分析,“俄羅斯方塊游戲”中的方塊,共有七種基本形狀,它們分別是“I型”、“L型”、“反L型”、“Z型”、“反Z型”、“口型”、“T型”,如圖1。
1.2 方塊的旋轉(zhuǎn)形狀
游戲過程中,每一種基本方塊都要做旋轉(zhuǎn)控制,于是就產(chǎn)生了旋轉(zhuǎn)后的方塊形狀,本文將其稱為“旋轉(zhuǎn)型”。
基本型中的“I型”、只有一種旋轉(zhuǎn)型,即由豎直旋轉(zhuǎn)90°后成為水平。因此,基本型加上一種旋轉(zhuǎn)型,共有兩種形狀。
基本型中的“L型”和“反L型”有三種旋轉(zhuǎn)型,將它按順時(shí)針每旋轉(zhuǎn)一個(gè)90°就產(chǎn)生一種旋轉(zhuǎn)型,它可以旋轉(zhuǎn)三次,得到三種不同的旋轉(zhuǎn)型,因此,它的三種旋轉(zhuǎn)型加上其基本型,“L型”和“反L型”方塊分別有四種形狀。
基本型中的“Z型”和“反Z型”可以順時(shí)針旋轉(zhuǎn)一次90°,加上他們的基本型分別有兩種形狀。
基本型中的“T型”有三種旋轉(zhuǎn)型,將他按順時(shí)針旋轉(zhuǎn)一個(gè)90°就產(chǎn)生一種旋轉(zhuǎn)型,它可以旋轉(zhuǎn)三次,得到三種不同的旋轉(zhuǎn)型,因此,它的三種旋轉(zhuǎn)型加上其基本型,“T型”方塊共有四種形狀。
基本型中的“口型”方塊沒有旋轉(zhuǎn)型,在游戲中只有一種形狀。
經(jīng)前面的分析得知,七種基本型方塊,因旋轉(zhuǎn)產(chǎn)生了不同的旋轉(zhuǎn)型,這些旋轉(zhuǎn)型加上他們的基本型,整個(gè)游戲中,共有19種不同的方塊形狀。
2 基本型方塊的構(gòu)成和控制
每一種基本型方塊都由4個(gè)正方形小方塊構(gòu)成,利用小方塊不同擺的放位置,產(chǎn)生19種旋轉(zhuǎn)型。利用隨機(jī)函數(shù)在一個(gè)預(yù)覽窗中提前展示形狀供用戶參考,然后將展示的形狀復(fù)制到游戲主窗口中進(jìn)行擺放,在游戲主窗口中用戶就可以使用鍵盤的方向鍵來控制方塊的運(yùn)動(dòng)。然后對(duì)每一行進(jìn)行判斷,如果有某行的方塊是滿的,則消除這行的方塊,并且使上面的方塊自由下落,其中,方塊向下的速度是有時(shí)鐘控件控制的,在游戲中,用戶也可以使用“向下光標(biāo)鍵”加快下落速度,定義一個(gè)變量,對(duì)消除的函數(shù)進(jìn)行記錄,最后就可以得出用戶的分?jǐn)?shù),用if 語句對(duì)分?jǐn)?shù)判斷,達(dá)到一定的積分就可以升級(jí)到下一個(gè)檔次。
2.1 基本型方塊的夠成
所謂“基本型方塊”是指每新產(chǎn)生的,沒有經(jīng)過旋轉(zhuǎn)的方塊形狀(如圖1),基本型方塊是有4個(gè)正方形的小方塊拼接而成。在程序?qū)崿F(xiàn)過程中,可以使用4個(gè)正方形控件來構(gòu)成每一種基本型方塊。
2.2 主游戲界面與數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
為了能實(shí)現(xiàn)控制方塊的旋轉(zhuǎn)、平移、下落等操作。需要構(gòu)造一個(gè)游戲主窗口和一個(gè)二維矩陣數(shù)據(jù)結(jié)構(gòu)。
2.2.1 主游戲界面
在主窗口中按照9X15,將小方塊(控件)進(jìn)行排列,每一個(gè)控件的Visible屬性設(shè)置成“False——不可見”,表示在開始游戲之前,主界面中沒有任何方塊。左上角作為坐標(biāo)起始點(diǎn),為了在程序中,對(duì)主窗口中的每一個(gè)小方塊(正方形控件)進(jìn)行遍歷,用數(shù)字字符給控件按照一定的規(guī)則進(jìn)行命名如圖2。
正方形控件的名稱=行坐標(biāo)*每行控件的數(shù)量+列坐標(biāo)=行坐標(biāo)*9+列坐標(biāo)
2.2.2 構(gòu)造一個(gè)大小為9X15的二維數(shù)組
用來保存對(duì)應(yīng)主界面中的每一個(gè)方塊位置是否被填充,已經(jīng)被填充的為“1”,未填入的為“0”。通過這樣的方法,即可簡單地將數(shù)據(jù)結(jié)構(gòu)映射到由小方塊(正方形控件)組成的圖形界面上。
2.2.3 小方塊的初始化顯示
在游戲開始或者前一個(gè)方塊已經(jīng)不能繼續(xù)下落的時(shí)候,需要在主界面的第一行(行坐標(biāo)為0)、第五列(列坐標(biāo)為4)的位置顯示某一個(gè)基本型方塊。這個(gè)功能由計(jì)算機(jī)產(chǎn)生一個(gè)1~7隨機(jī)數(shù),表示7中基本型方塊的某一種,然后枚舉出基本型方塊初始時(shí),在主界面中的位置,并把主界面中,對(duì)應(yīng)的小方塊(正方形控件)的Visible的值修改成“True(可見)”。例如:隨機(jī)數(shù)為2,對(duì)應(yīng)“L型”方塊,它對(duì)應(yīng)坐標(biāo)為(0,4),(1,4),(2,4),(2,5),根據(jù)控件命名規(guī)則,可以計(jì)算出主界面中需要修改的控件名稱分別為“4”、“13”、“22”、“23”。如圖3。
小方塊初始化算法:
Function Init(int Shape){
Switch(Shape)
Case 1:
設(shè)置主界面中相對(duì)應(yīng)的控件Visible=true;
產(chǎn)生1型方塊;
Break
Case 2;
設(shè)置主界面中相對(duì)應(yīng)的控件Visible=true;
產(chǎn)生2型方塊;
Break
Case 3:
設(shè)置主界面中相對(duì)應(yīng)的控件Visible=true;
產(chǎn)生3型方塊;
Break
Case 4:
設(shè)置主界面中相對(duì)應(yīng)的控件Visible=true;
產(chǎn)生4型方塊;
Break
Case 5:
設(shè)置主界面中相對(duì)應(yīng)的控件Visible=true;
產(chǎn)生5型方塊;
Break
Case 6:
設(shè)置主界面中相對(duì)應(yīng)的控件Visible=true;
產(chǎn)生6型方塊;
Break
Case 7:
設(shè)置主界面中相對(duì)應(yīng)的控件Visible值=true;
產(chǎn)生7型方塊;
Break
Return;
}
3 方塊的下移、平移、旋轉(zhuǎn)
基本型方塊初始化產(chǎn)生后,還需要用變量保存它的形狀代碼shape、旋轉(zhuǎn)型rot和在主界面中的起始行坐標(biāo)row和列坐標(biāo)column,例如圖3中的“L型”方塊:
shape=2;rot=1(旋轉(zhuǎn)三個(gè)90°,分別為2,3,4);
row=0;column=4;
3.1 方塊的下移
1) 下移的合法性判斷:方塊下移的前提是,方塊沒有到達(dá)最底部,這可以通過行坐標(biāo)row<14來判斷,方塊下移時(shí)要通過的位置沒有被前面的方塊填充,這個(gè)需要通過與主界面一一映射的二維數(shù)組相對(duì)應(yīng)的單元是否為“1”來判斷,如果以上條件合法,則,方塊下移。
2) 下移的實(shí)現(xiàn):方塊下移也是通過修改主界面上的小方塊(控件)的Visible屬性來實(shí)現(xiàn)的。例如圖3中的“L型”方塊下移一格,需要修改控件:
控件4.visible=1;控件23.visible=1;
控件31.visible=true;控件32.visible=true;如圖4。
3.2 方塊平移
方塊的平移包括左移和右移兩種情況,無論那種情況都要首先進(jìn)行合法性判斷。
1) 合法判斷,平移的合法性判斷比較簡單,只需判斷它旁邊相鄰位置是否被填充為,可以通過對(duì)映射二維數(shù)組中相對(duì)應(yīng)的單元是否為“1”來實(shí)現(xiàn),同時(shí)也要判斷是否已經(jīng)到了左右邊界。
2) 平移實(shí)現(xiàn),方塊平移也是通過修改主界面上的小方塊(控件)的Visible屬性來實(shí)現(xiàn)的。例如圖4中的方塊左移一格,需要將“13”、“22”、“32”控件的visible=1;“12”、“21”、“30”控件的visible=true即可。
3.3 方塊旋轉(zhuǎn)
1) 合法性判斷,在游戲中,方塊做順時(shí)針旋轉(zhuǎn),每次旋轉(zhuǎn)90°,方塊旋轉(zhuǎn)前的合法性檢查稍微要復(fù)雜一些,主要涉及到它旋轉(zhuǎn)所要經(jīng)過的位置不能有已經(jīng)填充的方塊。
例如圖4中的“L型”方塊旋轉(zhuǎn)前(順時(shí)針90°),必須檢查“21”、“30”、“14”、“23”處沒有被填充方塊,這個(gè)檢查也是通過對(duì)二維數(shù)組中相對(duì)應(yīng)的單元是否為“1”。來判斷。
2) 旋轉(zhuǎn)的實(shí)現(xiàn),當(dāng)合法性檢查后,就可以通過修改相關(guān)位置的控件visible值來實(shí)現(xiàn)旋轉(zhuǎn)。方法和平移、下落一樣。
3.4 算法實(shí)現(xiàn)
從前述所知,游戲中7種基本型方塊加上他們的旋轉(zhuǎn)型方塊總共有19種類型,程序算法只需要根據(jù)他們的形狀代碼shape、旋轉(zhuǎn)型rot,在主界面中的行坐標(biāo)row和列坐標(biāo)column,每做一次平移、下落、旋轉(zhuǎn),要跟蹤修改他的shape、rot、row,column等值,為下一次操作提供枚舉依據(jù),然后用代碼對(duì)每一種情況進(jìn)行處理即可。
由于篇幅有限,這兒沒有給出全部源代碼,有興趣的讀者可以與本文作者聯(lián)系索取完全編譯通過的源代碼
參考文獻(xiàn):
[1] 唐凱軍,湯惠莉.80例上手VB6編程[M].濟(jì)南:山東電子音像出版社,2004.
[2] 韋綱.FlashMX2004多媒體課件制作教程[M].北京:海洋出版社,2005.
[3] 王燕.面向?qū)ο蟮睦碚撆cC++實(shí)踐[M].北京:清華大學(xué)出版社,1997.