任亞飛
俄羅斯方塊是由阿列克謝·帕基特諾夫于1984年6月發明的休閑游戲。俄羅斯方塊原名是俄語Тетрис(英語是Tetris),這個名字來源于希臘語tetra,意思是“四”,而游戲的作者最喜歡網球(tennis)。于是,他把兩個詞tetra和tennis合而為一,命名為Tetris,這也就是俄羅斯方塊名字的由來。玩法主要是由不同形狀的方塊從上面不斷落下,填滿一排時就會消除并增加分數,方塊摞到頂時游戲結束。這次我們用Scratch制作俄羅斯方塊游戲,感受自己成為這款游戲的創造者的興奮吧!
1.角色背景繪制與背景格的生成
2.角色控制與運動以及判斷輸贏
3.消除方塊與方塊回填
1.角色背景繪制與背景格的生成角色“底板格”大小是24×24,由3個造型組成,綠色、黃色兩個相同大小的格子造型;一條橫線的造型,3個造型的輪廓粗細為10。
角色“方塊”采用黃色填充,大小也是24×24,本文總共由7個造型組成,根據24×24的大小的格子來組合成7個不同的造型圖案。
角色“下一步”是復制角色“方塊”,然后改了填充顏色為黑(如圖1)。

背景格生成程序定義了兩個函數:分別為“行”和“游戲背景”。
角色“底板格”的“行”函數,因為角色“底板格”綠底背造型為24×24的大小,所以往x軸的方向移動24步為一個格子距離,背景的大小為10×15格,一行格子的數量為10個。由此可以把函數“行”定義為:換成角色“底板格”綠底背的造型,圖章一次后將x坐標增加24重復10次。
角色“底板格”的“游戲背景”函數:每開始一次游戲,我們需要把上次游戲的圖章部分刪除掉,給角色“底板格”一個起始坐標值,同時隱藏該角色“底板格”,因為我們只需要看到圖章部分,角色在舞臺顯示有點格格不入,所以隱藏掉。開始執行函數“行”,那么一排就生成好了,然后回到x軸方向的原點,把y軸增加-24,和函數“行”一起重復執行15次,10×15的大小的背景格就瞬間生成了。
線程:點擊綠旗后執行函數“游戲背景”,背景瞬間生成(如圖2)。

2.背景繪制
繪制背景時注意背景的黃色邊框線顏色跟角色“方塊”顏色要相同,給角色“方塊”控制左右移動,旋轉,到達底部時圖章的判斷(如圖3)。

3.角色控制與運動
新建三個全局變量:“造型”“游戲控制”“分數”。
角色“方塊”:方塊從正中間向下掉,掉落的造型是角色“下一步”顯示的造型,利用鍵盤方向鍵控制角色“方塊”的左右移動以及水平翻轉。
方塊的下落:方塊面向90度的方向,隱藏方塊,換成1到7的隨機造型,本文角色固定在(-48,172)坐標值上,將變量“造型”設為角色“下一步”的造型編號;重復執行以下腳本:等待0.5秒,顯示,將y坐標增加-24,換成變量“造型”的造型。如果碰到舞臺底部的黃色,就把y坐標增加24,蓋下圖章,再次把變量“造型”設為角色“下一步”的造型編號,廣播“判斷消除”的消息(注:此消息是在角色“背景格”作消格和填充的用途),再次回到原點起始坐標值隱藏該角色(如圖4)。

方塊的移動水平翻轉:按下鍵盤方向鍵左對應x軸方向,按下就增加-24,如果碰到左邊顏色黃那么x軸就增加24;按下鍵盤方向鍵右對應x軸方向增加24,如果碰到右邊顏色黃那么x軸就增加-24;按下鍵盤方向鍵上右旋轉90度,碰到顏色黃,說明不夠翻轉距離,返回90度抵消,相當于減去90度回到原來的度數;按下鍵盤方向鍵下主要是給角色“方塊”下落速度,y坐標增加-24,一直按達到快速下降的原理,如果碰到舞臺底部或者角色“方塊”的顏色為黃色就把y軸增加24圖章該角色造型(如出現bug可以參考下圖給一個角色下落區間)(如圖5)。

角色“下一步”:作用是游戲區域下落的方塊提前在舞臺的右下方“下一步”那里顯示出來。
具體實現:我們給變量“游戲控制”賦值為0,把角色“下一步”固定在舞臺右下方下一步的區域,面向90度的方向,換成1到7的隨機造型;重復執行以下腳本——等待角色“方塊”的y坐標等于172,換成1到7的隨機造型,將變量“游戲控制”增加1,等待0.5秒。(注:本文角色“方塊”的y坐標起始值在舞臺的y坐標172高度。)
重復執行等待一秒,將變量“游戲控制”設為0。變量具體作用是控制游戲的結束(如圖6)。

4.判斷輸贏
根據變量“游戲控制”來判斷。因為角色“方塊”是從y坐標172向下掉落的,遇到黃色就會圖章自己,自己的顏色也是黃色,如果一直圖章到頂部了,變量“游戲控制”就會增加到2(因為變量“游戲控制”重復執行設為0的時間是1秒,而該變量增加1的條件是角色“方塊”y坐標值等于172,獲取變量“游戲控制”增加的時間是0.5秒,該變量增加到2理論邏輯也就成立)。也就是大于1,那么我們在背景腳本寫當變量“游戲控制”大于1時停止所有腳本運行達到游戲結束的功能(如圖7)。

5.消除方塊與方塊回填
當方塊填滿背景格一排以及多排的時候及時消除填滿區域,剩余的方塊會落到消除的區域,且X軸的方向不變。
消除原理——建立變量分數,利用角色“底板格”判斷線造型從下往網上偵測,必須要從背景左邊x,底部y的方向重復偵測判斷15次,因為背景是10×15的大小。如果沒有碰到綠色,代表這一排是方塊格滿的,把變量“分數”增加24,然后用函數“行”把這一排用角色“底板格”的綠底背造型圖章完這一排變成背景的底色綠色。
回填原理——如果碰到綠色,X軸方向增加24,一行是10個格子,重復10次換成角色“底板格”黃色格的造型去背景10×15的區域偵測碰到黃色,如果偵測到有碰黃色一次,就將現有的y坐標值減去變量“分數”的值,回落到消除的地方圖章黃色格達到現有方塊回填的效果。變量“分數”增加值條件為消除一行增加24,y坐標同時也增加24同步進行,以此類推,所以回填圖章的邏輯就是當前y左邊值減去變量“分數”值去回填。再次把y坐標增加變量“分數”值上去繼續偵測;同理偵測到綠色,那么就要換成“綠底背”的造型,減去y坐標的變量分數值,圖章綠底背造型(說明偵測的地方沒有黃色格子填充,所以下去圖章綠色格子)。又返回上次坐標繼續偵測。
“判斷消除”函數,角色“方塊”掉落碰到黃色圖章后發送判斷消息,當角色“底板格”接到角色“方塊”消息后執行函數判斷消除。角色“方塊”每圖章一次,角色“底板格”就判斷一次消除和回填。達到游戲消除和回填功能。