C# 문법 종합반 3주차 과제 1 - 지렁이 게임

2023. 8. 18. 20:44C# 문법 종합반

이번 과제는 흔히 볼 수 있는 지렁이가 먹이를 먹으면 1칸 씩 길이가 늘어나는 게임이다.

다만 나는 도저히 이를 구현할 수 없어서 비슷하게라도 만들어보려 한다.

 

10x10의 맵을 구성하고, 랜덤한 위치에 1칸짜리 먹이와 플레이어가 생성된다.

플레이어는 키보드 화살표를 이용해 먹이를 먹을 수 있다.

+ 장애물을 설정해 장애물을 만나면 게임 실패

+ 먹은 횟수 설정

+ 게임 시간 설정

+ 게임 종료 시, 먹은 횟수를 통해 스코어 설정

(+로 넣은 부분은 아직 구현하지 못했다.)

 

 

1. 맵 설정

: 먼저 int[,] map = new int [10, 10] 을 통해, 콘솔을 열면 10x10의 네모 칸이 나타나도록 구현했다.

: 플레이어, 음식, 장애물은 x, y 좌표에 따라 나타나고, 플레이어가 먹이를 먹었는지는 bool 을 통해 판단한다.

            int[,] map = new int[10, 10]  // 초기 맵 설정
                {
                    {1,1,1,1,1,1,1,1,1,1},
                    {1,0,0,0,0,0,0,0,0,1},
                    {1,0,0,0,0,0,0,0,0,1},
                    {1,0,0,0,0,0,0,0,0,1},
                    {1,0,0,0,0,0,0,0,0,1},
                    {1,0,0,0,0,0,0,0,0,1},
                    {1,0,0,0,0,0,0,0,0,1},
                    {1,0,0,0,0,0,0,0,0,1},
                    {1,0,0,0,0,0,0,0,0,1},
                    {1,1,1,1,1,1,1,1,1,1},
                };
                
            Random rand = new Random(); // 랜덤한 위치에 플레이어, 음식 나타나도록 설정
            int PlayerX = 1; // 플레이어 X좌표
            int PlayerY = 1; // player Y location
            int foodX = rand.Next(0, 9); // food X loca
            int foodY = rand.Next(0, 9); // food Y loca
            int blockX = rand.Next(0, 9); // 장애물 X loca
            int blockY = rand.Next(0, 9); // 장애물 Y loca

            bool foodEat = false; // 플레이어가 음식을 먹었는지 여부 판단

 

2. 맵 내 오브젝트 설정

: 게임이 진행될 때 (사용자가 키보드 움직임을 입력하면) 입력값에 따라 이동 혹은 먹이와 플레이어, 장애물이 재생성되고 이에 따라 Console.Clear를 통해 새로운 값을 받아 출력한다.

: 테두리는 꽉찬 네모, 안의 이동 가능한 맵은 빈 네모로 구성했다. 플레이어는 동그라미, 음식은 별, 장애물은 온천 표시로 나타냈다.

: 플레이어와 food의 좌표가 만나면 bool foodEat 이 활성화되며, 새로운 곳에 food가 생성되도록 했다.
: 해당 부분은 while문을 통해, 계속 반복된다. (음식이 계속 생성된다.)

            while (true)
            {
                Console.Clear(); // 맵 재로딩

                if (foodEat)
                {
                    foodX = rand.Next(0, 9);
                    foodY = rand.Next(0, 9);
                    foodEat = false;
                }

                if (PlayerX == foodX && PlayerY == foodY) // 플레이어와 푸드의 좌표가 만나면
                {
                    foodEat = true;
                }


                for (int i = 0; i < 10; i++)
                {
                    for (int j = 0; j < 10; j++)
                    {
                        if (map[i, j] == 1)
                        {
                            Console.Write("■ "); // 맵
                        }
                        else if (i == PlayerX && j == PlayerY)
                        {
                            Console.Write("○ ");  // 플레이어 아이콘
                        }
                        else if (i == foodX && j == foodY)
                        {
                            Console.Write("☆ ");  // 음식 아이콘
                        }
                        else if (i == blockX && j == blockY)
                        {
                            Console.Write("♨ "); // 장애물 아이콘
                        }
                        else
                        {
                            Console.Write("□ "); // 
                        }

                    }
                    Console.WriteLine();
                }

 

3. 키보드 설정

: ConsoleKeyInfo 를 통해 player의 움직임을 구현했다.

                ConsoleKeyInfo keyInfo = Console.ReadKey();

                switch (keyInfo.Key)
                {
                    case ConsoleKey.UpArrow:
                        if (PlayerX > 1)
                            PlayerX--; // 위쪽 이동
                        break;
                    case ConsoleKey.DownArrow:
                        if (PlayerX < 8)
                            PlayerX++; // 아래쪽 이동
                        break;
                    case ConsoleKey.LeftArrow:
                        if (PlayerY > 1)
                            PlayerY--; // 왼쪽 이동
                        break;
                    case ConsoleKey.RightArrow:
                        if (PlayerY < 8)
                            PlayerY++; // 오른쪽 이동
                        break;

 

4. 기타 사항

: 랜덤하게 먹이 혹은 장애물이 생겨나지 않는 버그가 있다. (아마 10x10의 테두리 부분에 생성된 것이 아닐까 싶다.)

: 장애물을 더 많이 출력하고 싶다.

: 장애물을 만났을 시 게임 종료되도록 설정 예정.

: 먹은 먹이의 수를 카운트하도록 설정 예정.

 

 

 

일반적인 스네이크 게임과는 결이 다른 팩맨 느낌의 게임이지만, 먹을 때 마다 플레이어 뒤로 한칸씩 늘어나도록 설정하면 그래도 비슷하게 구현할 수 있지 않을까 싶다.