俄羅斯方塊的簡單實現

也是很早很早的東西了:P


這是我幾年以前寫的《Seven Puzzles》(該遊戲爲DOS版,可在鄙人主頁http://ssscomic.yeah.net內找到)裏的俄羅斯方塊的實現方法,當時接觸編程僅半年而已,希望可以給初學者一點幫助。

幾乎沒有寫什麼代碼,而且後階段方塊旋轉、消去方面更是隻大致介紹了一點方法,不過應該還是可以讓人明白的。

本人才疏學淺,如有不當之處,還望各位多多指教。


世界

世界即遊戲進行的場所,在俄羅斯方塊裏就是MXN個小格子,我們可以使用一數組來表示

BYTE g_byScene[N][M]

其中,N爲行數、M爲每行格數,左上角爲(0,0)

我們可以繼續定義

#define SCENE_EMPTY 0

就是當g_byScene[y][x]==0時代表該格爲空,可以放入方塊,否則當方塊落到(y+1,x)時就不可以繼續下落

因爲後面還有許些功能可能需要用到g_byScene,所以暫時只用定義0值,以後再說。


角色

角色就是玩家可控制的那個東東了,在這裏就是由4塊小正方體組合成的方塊。

大家可以窮舉出所有可能的組合

—————————————————
**
**

—————————————————
*
**** 、 *
*
*
—————————————————
**     *
 ** 、**
      *
—————————————————
 **   *
**  、**
       *
—————————————————
 *     *   *
*** 、** 、** 、*** 
       *   *     *
—————————————————
*     **          *
*** 、*  、*** 、 *
      *      *   **
—————————————————
  *   *          **
*** 、*  、*** 、 *
      **   *      *
—————————————————

大家還看得清楚吧,由於不能使用圖片,所以只好用字符方式,一共7種方塊,旋轉變化後共有17種。

這些方塊都可以置於4X4的空格之中,圖簡單,我們可以建一個4X4大小的數組,儲存方塊信息,由於一共有17種,所以應該

#define ELEMENT_NUM_T_MAX 17

BYTE g_byElement[ELEMENT_NUM_T_MAX][4][4]

其中每個數值應該在遊戲初始化時定義,這樣在遊戲中我們就可以通過方塊號(0-16)來索引方塊了。

爲了方便實現旋轉,最好按照順時針變化的順序將只是方向不同的方塊放到一起,我上面的順序可能有點不對。


方塊的下落

我們還需要定義

int g_iX,g_iY; //這是方塊座標,對g_byElement[][][]來說,這個座標是左上角座標
BYTE g_byElementCur; //這是當前活動的方塊、0-16

然後,寫個移動判斷函數,就可以簡單的遊戲了(方塊不能轉動)

向下移動的主要判斷部分,沒有進行邊界判斷,返回false爲不可移動、true爲可以移動


for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
if(g_byElement[g_byElementCur][i][j]!=SCENE_EMPTY
&&g_byScene[g_iY+i+1][g_iX+j]!=SCENE_EMPTY)
return false;
}

return true;

應該沒有寫錯吧!^^

處理鍵盤的同時還應該不停的計時,保證方塊每一段時間下落一格(g_iY++),直到不能下落爲止。


方塊的旋轉

方塊的旋轉其實和位圖旋轉沒有關係,只是方塊號改變了而已,我剛纔將方塊按順時針旋轉放在一起,也就是這個原因,我們可以通過g_byElementCur++、g_byElementCur--來實現順時針或逆時針旋轉,當然要做邊界的判斷。

另外,由於方塊旋轉後,佔用的位置就改變了,所以還需要判斷目前位置是否可以旋轉,和判斷下落的方法差不多。


方塊的消去

方塊落定後,就應當馬上刷新g_byScene[][],並做消去判斷,如果某一行可以消去,還應該將該行上的所有g_byScnen[][]值向下移一行,並刷新屏幕。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章