(見本)Board.cs
//⑧すべての行をチェックする
bool IsComplete(int y)
{
for (int x =0; x < width; x++)
{
if (grid[x,y]== null)
{
return false;
}
}
return true;
}
//⑧消去する関数
void ClearRow(int y)
{
for (int x =0; x < width; x++)
{
if (grid[x,y] != null)
{
Destroy(grid[x,y].gameObject);
}
grid[x,y] = null;
}
}
//⑧上にあるブロックを1段下げる
void ShiftRowsDown(int startY)
{
for (int y = startY; y < height; y++)
{
for (int x = 0; x < width; x++)
{
if (grid[x,y] != null)
{
grid[x,y -1] = grid[x,y];
grid[x,y] = null;
grid[x,y -1].position += new Vector3(0,-1,0);
}
}
}
}
//⑧すべての行をチェックして埋まっていれば消去する
public void ClearAllRows()
{
for(int y = 0; y < height; y++)
{
if(IsComplete(y))
{
ClearRow(y);
ShiftRowsDown(y + 1);
y--;
}
}
}
解説
【全ての行をチェックする関数】
bool IsComplete(int y)
{
①for (int x =0; x < width; x++)
{
②if (grid[x,y]== null)
{
③return false;
}
}
④return true;
}
①0ポジジョンから横幅(10)になるまで1つずつブロックを生成する
②2次元配列の確認
int y と int xが空の時はtrue
③1つでも埋まっていない場合falseをかえす
④全て埋まっていた時trueを返す
【消去する関数】
void ClearRow(int y)
{
①for (int x =0; x < width; x++)
{
②if (grid[x,y] != null)
{
③Destroy(grid[x,y].gameObject);
}
④grid[x,y] = null;
}
}
①0ポジジョンから横幅(10)になるまで1つずつブロックを生成する
②2次元配列の確認
int y と int xが埋まっているか空の時はtrue
③grid[x,y] に格納されているgameObjectを破壊する
④2次元配列のデータを消去(空にする)
【上にあるブロックを1段下げる関数】
①void ShiftRowsDown(int startY)
{
②for (int y = y; y < height; y++)
{
③for (int x = 0; x < width; x++)
{
④if (grid[x,y] != null)
{
⑤grid[x,y -1] = grid[x,y];
⑥grid[x,y] = null;
⑦grid[x,y -1].position += new Vector3(0,-1,0);
}
}
}
}
①ShiftRowsDown変数、int startY引数
②y軸、引数y(30行目)より上の行を消去したい
③x軸(横)消去して、一段ずつ下げる
④今のグリッドは空ではないかの確認
空でない時は567
⑤現在のグリッドを1段下に登録
⑥ 1段下にして、下のグリッドをからにする
⑦ブロックの場所を1段下げる
【全ての行をチェックして埋まっていれば消去する関数】
public void ClearAllRows()
{
①for(int y = 0; y < height; y++)
{
②if(③IsComplete(y))
{
④ClearRow(y);
⑤ShiftRowsDown(y + 1);
⑥y--;
}
}
}
①0ポジジョンから高さ(30)になるまで1つずつブロックを生成する
②y(高さ)は埋まっているのか確認
③ 全ての行をチェックする関数呼び出し、引数y=int y
④消去する関数の呼び出し、引数y=int y
全て埋まっているならばyを消去する
⑤上にあるブロックを1段下げる関数の呼び出し
(y + 1)消した行を下げる
⑥yを正常な位置へ
for文、if文、演算子について
https://qiita.com/hanatan079/items/01530bc45bab85f3d19f
【呼び出し】
GameManeger.cs(BottomBoard関数内)
①board.ClearAllRows();
①埋まっていれば消去する