C#/수업 내용

[C#] 2021-08-31 2차원 배열 2048

JSH1 2021. 8. 31. 19:00
class App
{
    int[,] map = new int[4, 4];
    Random rand = new Random();

    public App()
    {
        AddNumber();
        AddNumber();
        Field();

        while (true)
        {
            ConsoleKeyInfo info = Console.ReadKey();
            Console.WriteLine();

            switch (info.Key.ToString())
            {
                case "RightArrow":
                    Push(0, 1);
                    Sum(0, 1);
                    break;

                case "LeftArrow":
                    Push(0, -1);
                    Sum(0, -1);
                    break;

                case "DownArrow":
                    Push(1, 0);
                    Sum(1, 0);
                    break;

                case "UpArrow":
                    Push(-1, 0);
                    Sum(-1, 0);
                    break;
            }

            AddNumber();
            Field();
            GameOverCheck();
        }
    }

    void GameOverCheck()
    {
        for (int y = 0; y < map.GetLength(0); y++)
        {
            for (int x = 0; x < map.GetLength(1); x++)
            {
                if (x == 0 && y == 0)
                {
                    if (map[y, x] == 0 || map[y, x] == map[y, x + 1] || map[y, x] == map[y + 1, x])
                    {
                        return;
                    }
                }

                else if (y == 0 && x == map.GetLength(1) - 1)
                {
                    if (map[y, x] == 0 || map[y, x] == map[y + 1, x] || map[y, x] == map[y, x - 1])
                    {
                        return;
                    }
                }

                else if (y == map.GetLength(0) - 1 && x == 0)
                {
                    if (map[y, x] == 0 || map[y, x] == map[y - 1, x] || map[y, x] == map[y, x + 1])
                    {
                        return;
                    }
                }

                else if (y == map.GetLength(0) - 1 && x == map.GetLength(1) - 1)
                {
                    if (map[y, x] == 0 || map[y, x] == map[y - 1, x] || map[y, x] == map[y, x - 1])
                    {
                        return;
                    }
                }

                else if (x == 0)
                {
                    if (map[y, x] == 0 || map[y, x] == map[y, x + 1])
                    {
                        return;
                    }
                }

                else if (y == 0)
                {
                    if (map[y, x] == 0 || map[y, x] == map[y + 1, x])
                    {
                        return;
                    }
                }

                else if (y == map.GetLength(0) - 1)
                {
                    if (map[y, x] == 0 || map[y, x] == map[y - 1, x])
                    {
                        return;
                    }
                }

                else if (x == map.GetLength(1) - 1)
                {
                    if (map[y, x] == 0 || map[y, x] == map[y, x - 1])
                    {
                        return;
                    }
                }

                else
                {
                    if (map[y, x] == 0 || map[y, x] == map[y, x - 1] || map[y, x] == map[y, x + 1] || map[y, x] == map[y - 1, x] || map[y, x] == map[y + 1, x])
                    {
                        return;
                    }
                }
            }
        }
        Console.WriteLine("게임오버");
    }

    void Push(int valueY, int valueX)
    {
        while (true)
        {
            int n = 0;

            for (int y = 0; y < map.GetLength(0); y++)
            {
                for (int x = 0; x < map.GetLength(1); x++)
                {
                    if (valueX == 1 && map[y, x] != 0 && x != map.GetLength(1) - 1) // RightArrow입력(x:1): map[y, x]가 0이 아니고 오른쪽 끝자리가 아닐때
                    {
                        if (map[y, x + valueX] == 0) // map[y, x]의 오른쪽자리의 값이 0일때
                        {
                            map[y, x + valueX] = map[y, x];
                            map[y, x] = 0;
                            n++;
                        }
                    }

                    else if (valueX == -1 && map[y, x] != 0 && x != 0) // LeftArrow입력(x:-1): map[y, x]가 0이 아니고 왼쪽 끝자리가 아닐때
                    {
                        if (map[y, x + valueX] == 0) // map[y, x]의 왼쪽자리의 값이 0일때
                        {
                            map[y, x + valueX] = map[y, x];
                            map[y, x] = 0;
                            n++;
                        }
                    }

                    else if (valueY == 1 && map[y, x] != 0 && y != map.GetLength(0) - 1) // DownArrow입력(y:-1): map[y, x]가 0이 아니고 아래쪽 끝자리가 아닐때
                    {
                        if (map[y + valueY, x] == 0) // map[y, x]의 아래쪽자리의 값이 0일때
                        {
                            map[y + valueY, x] = map[y, x];
                            map[y, x] = 0;
                            n++;
                        }
                    }

                    else if (valueY == -1 && map[y, x] != 0 && y != 0) // UpArrow입력(y:1): map[y, x]가 0이 아니고 위쪽 끝자리가 아닐때
                    {
                        if (map[y + valueY, x] == 0) // map[y, x]의 위쪽자리의 값이 0일때
                        {
                            map[y + valueY, x] = map[y, x];
                            map[y, x] = 0;
                            n++;
                        }
                    }
                }
            }

            if (n == 0)
            {
                break;
            }
        }
    }

    void Sum(int valueY, int valueX)
    {
        if (valueX == 1) // RightArrow입력(x:1)
        {
            for (int y = 0; y < map.GetLength(0); y++)
            {
                for (int x = map.GetLength(1) - 1; x >= 0; x--)
                {
                    if (map[y, x] != 0 && x != map.GetLength(1) - 1) // map[y, x]가 0이 아니고 오른쪽 끝자리가 아닐때
                    {
                        if (map[y, x] == map[y, x + valueX]) // map[y, x]랑 오른쪽자리의 값이 같을때
                        {
                            map[y, x + valueX] += map[y, x];
                            map[y, x] = 0;
                        }
                    }
                }
            }
        }

        else if (valueX == -1) // LeftArrow입력(x:-1)
        {
            for (int y = 0; y < map.GetLength(0); y++)
            {
                for (int x = 0; x < map.GetLength(1); x++)
                {
                    if (map[y, x] != 0 && x != 0) // map[y, x]가 0이 아니고 왼쪽 끝자리가 아닐때
                    {
                        if (map[y, x] == map[y, x + valueX]) // map[y, x]랑 왼쪽자리의 값이 같을때
                        {
                            map[y, x + valueX] += map[y, x];
                            map[y, x] = 0;
                        }
                    }
                }
            }
        }

        else if (valueY == 1) // DownArrow입력(y:1)
        {
            for (int y = map.GetLength(0) - 1; y >= 0; y--)
            {
                for (int x = 0; x < map.GetLength(1); x++)
                {
                    if (map[y, x] != 0 && y != map.GetLength(0) - 1) // map[y, x]가 0이 아니고 아래쪽 끝자리가 아닐때
                    {
                        if (map[y, x] == map[y + valueY, x]) // map[y, x]랑 아래쪽자리의 값이 같을때
                        {
                            map[y + valueY, x] += map[y, x];
                            map[y, x] = 0;
                        }
                    }
                }
            }
        }

        else if (valueY == -1) // UpArrow입력(y:-1)
        {
            for (int y = 0; y < map.GetLength(0); y++)
            {
                for (int x = 0; x < map.GetLength(1); x++)
                {
                    if (map[y, x] != 0 && y != 0) // map[y, x]가 0이 아니고 위쪽 끝자리가 아닐때
                    {
                        if (map[y, x] == map[y + valueY, x]) // map[y, x]랑 위쪽자리의 값이 같을때
                        {
                            map[y + valueY, x] += map[y, x];
                            map[y, x] = 0;
                        }
                    }
                }
            }
        }

        Push(valueY, valueX);
    }

    void Field()
    {
        for (int y = 0; y < map.GetLength(0); y++)
        {
            for (int x = 0; x < map.GetLength(1); x++)
            {
                Console.Write("  {0}  ", map[y, x]);
            }
            Console.WriteLine();
        }
        Console.WriteLine();
    }

    void AddNumber()
    {
        int blankCheck = 0;
        for (int y = 0; y < map.GetLength(0); y++)
        {
            for (int x = 0; x < map.GetLength(1); x++)
            {
                if (map[y, x] != 0)
                {
                    blankCheck++;
                }
            }
        }

        if (blankCheck == map.GetLength(0) * map.GetLength(1))
        {
            return;
        }

        while (true)
        {
            int y, x;
            y = rand.Next(0, map.GetLength(0));
            x = rand.Next(0, map.GetLength(1));

            if (map[y, x] == 0)
            {
                map[y, x] = 2;
                break;
            }
        }
    }

}

 

무한루프 수정, 게임오버 체크 추가

hello world.exe
0.01MB