JS練習例項 編寫經典小遊戲俄羅斯方塊

2021-09-18 02:21:01 字數 3237 閱讀 5052

遊戲區域:遊戲區域是固定的,這裡將它設為寬10單位,高16單位的矩形區域,前端顯示用**來實現,並將每個td儲存在乙個二維陣列中,用於渲染遊戲過程。

方塊:方塊有7種形狀,用乙個4*4的矩陣來儲存方塊的形狀;按方向上鍵方塊可以旋轉,可通過矩陣旋轉來實現;方塊可以左右移動,需要判斷是否出界機左右是否已有方塊;還需注意判斷方塊是否已經觸底。按方向下鍵方塊可以速降。

分數:在每一次方塊降落完成後判斷能否得分。

這部分下文有用上在回來看就行,現在看可能有點混亂( ・ㅂ・)و 。

block_now, block_next; 當前,下一方塊物件,將block_next賦值給block_now,再建立新方塊後賦值給block_next。

allblock: 16*10的矩陣 已完成方塊

ground:16*10的遊戲區域,獲取dom,渲染遊戲區域

實現這個遊戲的最核心就在於這個方塊類了,我們將建立乙個方塊型別,然後7種形狀的方塊繼承這個方塊類。

方塊類的屬性

方塊的例項屬性有:移動方向,狀態,形狀,當前位置,顏色。

function block() 

this.pos = [0, 3];//所在行,列

this.color = ["#ffaec9", "#b5e61d", "#99d9ea", "#c8bfe7", "#b97a57"];

}

這裡先明確一下方塊和形狀的關係哈,後面經常用上這個概念。如下,4*4的矩陣我把它叫「方塊」然後有顏色(綠色)的部分我叫它形狀。

7種方塊子類

function block_i()   

block_i.prototype = new block();

其他形狀與上面類似:

s : [[0, 1, 1, 0],[1, 1, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0]];

j : [[0, 1, 0, 0],[0, 1, 0, 0],[1, 1, 0, 0],[0, 0, 0, 0]];

o : [[1, 1, 0, 0],[1, 1, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0]];

z : [[1, 1, 0, 0],[0, 1, 1, 0],[0, 0, 0, 0],[0, 0, 0, 0]];

t : [[0, 1, 0, 0],[1, 1, 1, 0],[0, 0, 0, 0],[0, 0, 0, 0]];

l : [[1, 0, 0, 0],[1, 0, 0, 0],[1, 1, 0, 0],[0, 0, 0, 0]];

方塊類的方法

方塊類的方法有:旋轉方塊,移動方塊,速降方塊,列印方塊

旋轉方塊

1.旋轉方塊時我們先將矩陣順時針旋轉90度

for(var i = 0,dst = 3;i < 4;i++, dst--)
2.再將旋轉後的影象移到矩陣左上角,這樣可以表現出在原地旋轉的效果。

for(var i = 0;i < 4;i++)

}if (flag) }}

3.最後將旋轉後的矩陣儲存回原來的矩陣

速降方塊

1.先算出方塊矩陣中有形狀的內容的右邊界和下邊界(因為我們已經將圖案放在左上角了所以不用求左上邊界ヾ( ̄▽ ̄)),比如s形的方塊右邊界是3,下邊界是2這樣。這個用兩個迴圈就能實現了。

2.判斷形狀(注意是形狀)的正下方有沒有方塊(檢查allblock)

下方有方塊時:

(1)計算當前形狀下邊界的塊對應下方的塊的距離y,如圖

(2)計算下方最頂方塊距離上方塊對應位置距離x,如圖

(3)取兩個距離中較小的距離為方塊垂直移動距離,移動方塊。並將方塊狀態修改。

下方沒有方塊時,方塊降至最低,計算距離時,記得得加上方塊底部與形狀底部的距離。並將方塊狀態修改。

移動方塊

使用者通過鍵盤方向鍵來移動方塊:左(37) 上(38) 右(39) 下(40)括號內為鍵碼。

對鍵盤事件進行監聽:

用this.dir記錄方塊當前移動方向。

當使用者按上鍵時,呼叫旋轉方塊函式;

按左右時,將方塊所在列(this.pos[1])加或減1;

按下鍵時,呼叫速降方塊函式。

最後列印方塊(判斷是否出界等問題在列印方塊步驟)

列印方塊

判斷待列印方塊是否超出邊界

判斷要渲染(給形狀上色)的地方是否已經有方塊了

擦除上一時刻方塊

繪製這一時刻方塊

若方塊下落完畢(this.end = 1),將方塊加入到已下落方塊矩陣(allblock)中

好啦!完成到這步就勝利在望了,撒花ヾ( ̄▽ ̄)~

產生方塊

用兩個隨機數隨機產生方塊形狀和顏色:

function createblock(r1, r2) 

block_new.color = block_new.color[r2];

return block_new;

}

2.生產分數

在每次列印方塊時都判斷一下是否可以得分消去。

若可以得分,就將allblock中該行刪除(splice),並在最開始位置加上一行空白行([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

然後在ground中,將該行樣式變為上一行樣式,以此類推。呈現出消去該行的效果。

3.記錄最高分

我還弄了個用cookie記錄最高分的功能,每次得分時判斷下是否為最高分,並顯示,具體還是看**啦。

差不多啦,恩恩去吃飯。

04 20 小遊戲練習

import time import random 註冊資訊 name input 請輸入使用者名稱 age input 您好,請輸入您的年齡 format name user info user properties x 1 5 用於存放使用者道具 properties x3 250g x1 5 ...

2048小遊戲編寫思路

有點難 關鍵知識點 下面請各位讀者先學習一下該遊戲中涉及到的幾個關鍵知識點,有了這些必備條件,我們才好講解 2048 遊戲的設計思路。1 改變文字顏色 2048小遊戲的整體的設計思路是 遊戲介面初始化,共有 4 行 4 列,總計 16 個位置,遊戲開始時,在任意的兩個位置上,隨機產生數字 2 或 4...

原生JS編寫小遊戲 跳一跳

1.先隨機生成地圖 2.按住按鈕釋放後完成動作並進行判斷 首先po一下 如下 按住它 主要分為用來繪製圓柱體分布的draw 函式,用來繫結按鈕事件的bindevent 函式,用來監聽css3動畫是否結束的gettransition 函式,用來判斷棋子是否出界的函式judeg 函式。而控制棋子運動的距...