javascript(テトリス003_ピースの回転)
■回転するロジックを考えてみる。
前回まで1マスで考えてきたけど、下のような3マスに拡張する。この場合、ピースを回転させる操作が必要。
まず、どこを中心に回転させるか考えてみたい。重心位置に近いところで回った方が直感的なイメージに合う気がするので、重心位置を求める。3マス分の下の図を、1マスの正方形と2マスの長方形が隣り合っていると考えると、それぞれの重心は (x, y) = (1, 1), (x, y) = (3, 2)となる。1目盛を1とする。((正方形の位置×正方形の重さ) + (長方形の位置×長方形の重さ)) / 全体の重さ、で計算すると、x = ((1 * 1) + (3 * 2)) / 3 = 2.3333, y = ((1 * 1) + (2 * 2)) / 3 = 1.66666 となる(赤丸部分)。
ここから一番近い点は下の①の赤丸部分となる。あるいは、少し遠いように見えるけど右下のマスを中心とした②。下の図で数字の部分はマス毎のIDを示す。
次に、①や②で回転するロジックを考える。上のマスのIDから、実際にどう変化させればいいか分かるので、そこから考えると、①では、+10(下へ), -1(左へ), -10(上へ), +1(右へ)を繰り返す形になる。各マスのIDを要素とする配列に対してこの操作を行うサンプルが下。
let block = [15,25,24]
let addArray = [+10, -1, -10, +1]
let addArray2 = [+11, +9, -11, -9]
//①
//[25,24,14]
//[24,14,15]
//[14,15,25]
//(要素1) +10 → -1 → -10 → +1
//(要素2) -1 → -10 → +1 → +10
//(要素3) -10 → +1 → +10 → -1
//(仮) +1 → +10 → -1 → -10
//②
//[26,25,15]
//[35,25,26]
//[24,25,35]
//(要素1) +11 → +9 → -11 → -9
//(要素2) 0 → 0 → 0 → 0
//(要素3) -9 → +11 → +9 → -11
function click0a() {
block[0] = block[0]+addArray[0];
block[1] = block[1]+addArray[1];
block[2] = block[2]+addArray[2];
console.log(block);
console.log("OrgAddArray:"+addArray);
let temp = addArray.shift();
addArray.push(temp);
console.log("ShiftAddArray:"+addArray);
}
function click0b() {
block[0] = block[0]+addArray2[0];
block[2] = block[2]+addArray2[3];
console.log(block);
console.log("OrgAddArray2:"+addArray2);
let temp = addArray2.shift();
addArray2.push(temp);
console.log("ShiftAddArray2:"+addArray2);
}
ここで、「配列.shift()」は、配列の1番目の要素を取得し(配列内から削除)、「配列.push (要素)」は、要素を配列の最後に追加する。この2つの操作で、演算用の配列内の要素を変化させている。
コンソール画面の結果が下。意図したとおりに動いているよう。
回転のロジックは何となくイメージが付いたけど、4マスにすることも考えて、もう少し一般化できないものか。