javascript(テトリス002_揃った行を消す)
■ピースが揃った場合の処理を追加する。
今は1マス分のみのピースが落ちる形で作っている。左上から、各オブジェクトに0~199の番号を付けており、それに対応する形の配列(board)を用意して0(ピースがない状態)、1(置かれた状態)としている。そのため、一番下の1行が揃う場合、オブジェクトや配列の番号の190~199がそれぞれ1となる。
この判定を行うコードを下のように作った。
function deleteSetLine() {
let deleted = [];
for (let i=0; i<20; i++) {
let flag = 0;
for (let j=0; j<10; j++) {
if (board[i*10+j] === 0) {
break;
} else {
flag++;
}
}
if (flag === 10) {
deleted.push(i);
}
console.log("aaaa:"+flag);
}
if (deleted.length > 0) {
for (const start_line of deleted) {
board.splice(start_line*10, 10);
board.unshift(0,0,0,0,0,0,0,0,0,0);
for (let i=0; i<200; i++) {
if(board[i]===0) {
let temp = i;
$('.squ' +temp).css('background-color', 'White');
} else{
let temp = i;
$('.squ' +temp).css('background-color', 'Green');
}
}
deleted=[];
}
}
}
ここで、1行がすべて揃った行の左端の番号を push で配列に追加し、その後、そこを起点とした10の要素を splice で削除し、unshift で先頭から新規に置かれていない状態の数値(0)を追加する。これでまず board を更新し、それに同期させるようオブジェクト全体の色を更新する。全体を下にずらす形にしなければならないので、200のオブジェクトへの処理は避けられないと思う。
実行結果が下。適当に作ったピースの積み重ね(緑色の部分)の隙間に赤いピースを入れ1行が揃う。
一番下の1行が消えて全体が下にずれる。
1マスのピースだけ動かしているので、複数行を同時に消す確認はできないけど、ロジック的には複数でも問題ないはず。2マス分、3マス分のピースの組み合わせは下のような感じ。ピースの回転とか考えると3マス分で見た方が良さそうなので、次は3マス分に拡張して課題とか考えてみる。