0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-11-17
(見本)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();

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0