【テトリス作成⑧】消去して一段下がる実装について深掘る

```  
(見本)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;
        }
    }
    //⑧上にあるブロックを１段下げる
    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つずつブロックを生成する
②２次元配列の確認
　　　int y と int xが空の時はtrue
③１つでも埋まっていない場合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つずつブロックを生成する
②２次元配列の確認
　　　int y と int xが埋まっているか空の時はtrue
③grid[x,y]　に格納されているgameObjectを破壊する
④２次元配列のデータを消去(空にする)

【上にあるブロックを１段下げる関数】
```
 ①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軸(横)消去して、一段ずつ下げる
④今のグリッドは空ではないかの確認
　　　空でない時は５６７
⑤現在のグリッドを１段下に登録
⑥　１段下にして、下のグリッドをからにする
⑦ブロックの場所を１段下げる

【全ての行をチェックして埋まっていれば消去する関数】
```
 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を消去する
⑤上にあるブロックを１段下げる関数の呼び出し
  (y + 1)消した行を下げる
⑥yを正常な位置へ

for文、if文、演算子について
https://qiita.com/hanatan079/items/01530bc45bab85f3d19f



【呼び出し】
```
GameManeger.cs(BottomBoard関数内)

        ①board.ClearAllRows();

```
①埋まっていれば消去する