ぷよぷよを作ろう

プログラム全体の構造

最初に「index.php」がロードされます。

config.js
設定ファイル
stage.js
ぷよの落下、「全消し」の表示など、ステージ(フィールド)の表示を制御
puyoimage.js
ぷよの画像やゲームオーバー時の「ばたんきゅー」の表示を制御
score.js
スコアの計算・表示を制御
game.js
プログラムの全体の制御
player.js
プレイヤーの操作を制御

ぷよぷよ

フィールドを作る

ぷよぷよの舞台である作成と制御について説明しましょう。フィールドはstage.jsで「Stage」クラスとして作ります。フィールドは縦12×横6のマス目です。 この2次元配列boardの要素は、初期状態ではすべて0ですが、これはぷよぷよがフィールドに存在しないことを意味します。フィールド(board)にぷよを配置する処理を担うのがsetPuyo関数です。この関数は次の3つの引数を持ちます。

setPuyo関数
引数名 用途
x x軸方向の位置(0~5)
y y軸方向の位置(0~11)
puyo ぷよの色(1~5)
this.board[y][x] = {
    puyo: puyo,
    element:puyoImage
}
board要素の状態
0 初期状態
null ぷよを消した状態
{ puyo,element } ぷよが存在する状態
2つのぷよを作成

落ちてくる2つのぷよを作成している部分
createNewPuyo関数

  • 「中心ぷよ」と「動くぷよ」で構成
  • 色はランダム
  • 画面外の上部・中央から落ちてくる

ぷよの基準

puyoStatus
フィールドの位置
centerPuyo
中心ぷよの色
movablePuyo
動くぷよの色
centerPuyoElement
中心ぷよのDOMオブジェクト
movablePuyoElement
回転ぷよのDOMオブジェクト
this.puyoStatus = {
    x: 2, //中心ぷよの位置:左から2列目
    y: -1, //画面上部ギリギリから出てくる
    left: 2 * Config.puyoImgWidth,
    top: -1 * Config.puyoImgHeight,
    dx: 0, //動くぷよの相対位置
    dy: -1,
    rotation: 90 //動くぷよの角度は90度
};

ぷよの色を乱数で決める

this.centerPuyo = Math.floor ( Math.random() * puyoColors) + 1;
1
緑色:緑ぷよ
2
青色:青ぷよ
3
紫:紫ぷよ
4
赤:赤ぷよ
5
黄:黄ぷよ
const puyoColors = Math.max(1,Math.min(5, Config.puyoColors));

色が決定したら、続けて、ぷよのDOMオブジェクトを用意します。getPuyo関数を使います。

Stage.stageElement.appendChild(this.centerPuyoElement);
Stage.stageElement.appendChild(this.movablePuyoElement);

 作成した2つのぷよは、player.jsで定義しているsetPuyoPosition関数を使って初期位置を描画します。

ゲームの進行の管理

ゲーム全体の「初期化」とゲームの「メインループ」を制御しているgame.jpについて説明します。
「windowのloadイベント」が発生すると、game.jsのinitialize関数でゲーム全体の初期化を行い、その後、loop関数でゲームのメインループに入ります。メインループは、プログラムが終了するまで永久に続きます。

window.addEventListener("load", () = >{
    initialize();
    loop();
});
「ぷよを消せるか?」の判定

ぷよぷよでは、「同じ色のぷよが4個以上くっついているか?」の判定方法を解説します。


checkErase関数が、ぷよを消せるかの判定を行っています。フィールドの全マスに対し、「同じ色のぷよが4個以上のつながっているか?」をチェックしています。


<script>
board = [
    [1,1,1,1,0,0],
    [0,1,0,0,0,1],
    [0,1,1,0,1,1]
];

const sequencePuyoInfoList = [];

const checkSequentialPuyo = (x,y) = > {
    //すでに[x,y]がsequentialPuyoListにある場合はreturn
    if(sequencepuyoInfoList.some(p = > p[0] === x && p[1] === y)){
        return;
    }
    sequencePuyoInfoList.push([x,y]);
    
    const direction = [[0,1],[1,0],[0,-1],[-1,0]];
    for(let i = 0; i < direction.length; i++){
        const dx = x + direction[i][0];
        const dy = y + direction[i][1];
        //フィールドの外にはみ出た
        if(dx < 0 || dy < 0 || dx >= 6 || dy >= 3){
            continue;
        }
        //1でない
        if(board[dy][dx] !== 1){
            continue;
        }
        checkSequentialPuyo(dx,dy);
    }
}

checkSequentialPuyo(1,0);
console.log(sequencePuyoinfoList);
</script>

プロフィール

プロフィール
名前 ぬえさぶろう
仕事 PCの修理受付・取扱説明書作成
好物 大豆食品
スキル jQuery

翔泳社

ぷよぷよ検証

toTop