내일배움캠프/강의 과제

C# 문법 종합반 - 3주차 : 스네이크 게임 만들기

서보훈 2024. 9. 22. 14:52

제공된 코드를 이용하여 스네이크 게임을 제작해야하는 과제입니다.

제공 코드는 다음과 같습니다.

더보기
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {
        // 뱀의 초기 위치와 방향을 설정하고, 그립니다.
        Point p = new Point(4, 5, '*');
        Snake snake = new Snake(p, 4, Direction.RIGHT);
        snake.Draw();

        // 음식의 위치를 무작위로 생성하고, 그립니다.
        FoodCreator foodCreator = new FoodCreator(80, 20, '$');
        Point food = foodCreator.CreateFood();
        food.Draw();

        // 게임 루프: 이 루프는 게임이 끝날 때까지 계속 실행됩니다.
        while (true)
        {
            // 키 입력이 있는 경우에만 방향을 변경합니다.
          
            // 뱀이 이동하고, 음식을 먹었는지, 벽이나 자신의 몸에 부딪혔는지 등을 확인하고 처리하는 로직을 작성하세요.
            // 이동, 음식 먹기, 충돌 처리 등의 로직을 완성하세요.
            
            Thread.Sleep(100); // 게임 속도 조절 (이 값을 변경하면 게임의 속도가 바뀝니다)

            // 뱀의 상태를 출력합니다 (예: 현재 길이, 먹은 음식의 수 등)
        }
    }
}

public class Point
{
    public int x { get; set; }
    public int y { get; set; }
    public char sym { get; set; }

    // Point 클래스 생성자
    public Point(int _x, int _y, char _sym)
    {
        x = _x;
        y = _y;
        sym = _sym;
    }

    // 점을 그리는 메서드
    public void Draw()
    {
        Console.SetCursorPosition(x, y);
        Console.Write(sym);
    }

    // 점을 지우는 메서드
    public void Clear()
    {
        sym = ' ';
        Draw();
    }

    // 두 점이 같은지 비교하는 메서드
    public bool IsHit(Point p)
    {
        return p.x == x && p.y == y;
    }
}
// 방향을 표현하는 열거형입니다.
public enum Direction
{
    LEFT,
    RIGHT,
    UP,
    DOWN
}

게임이 실행될 메인 함수의 시작부와 위치를 저장할 수 있는 Point 클래스, 방향을 지정해주는 열거형 Direction이 주어진상태입니다.

 

스네이크 게임은 뱀이 한방향으로 계속 움직이며, 플레이어는 조작을 통해 뱀이 움직이는 방향을 변경할 수 있습니다.

점수는 뱀이 먹이를 먹을때마다 증가하며, 뱀이 먹이를 먹으면 뱀의 길이가 한칸 늘어납니다.

마지막으로 뱀의 머리가 벽에 닿거나 자신의 몸통에 닿을경우 게임이 종료되게 됩니다.

 

이러한 게임의 흐름을 기반으로 각 클래스와 함수의 내용을 만들어가겠습니다.


메인의 시작부에 우리가 만들어서 사용해야할 클래스가 존재합니다.

Point p = new Point(4, 5, '*');

Snake snake = new Snake(p, 4, Direction.RIGHT);
snake.Draw();

// 음식의 위치를 무작위로 생성하고, 그립니다.
FoodCreator foodCreator = new FoodCreator(80, 20, '$');
Point food = foodCreator.CreateFood();
food.Draw();

여기서 Snake 클래스에는 Point 클래스와 숫자값, Direction 열거형을 변수로 사용하며 이 변수를 생성자를 통해 지정하고, Draw 함수를 통해 플레이어가 조종할 뱀의 모습을 그리는것을 알 수 있습니다.

 

또한 FoodCreator 를 사용하여 맵의 무작위 위치에 닿으면 뱀의 길이가 늘어나는 먹이를 만들며, 함수로 Point 클래스를 반환하는 CreateFood() 를 가지고 있음을 알 수 있습니다.

 

먼저 Snake 클래스를 만들도록 하겠습니다.

 


Snake 클래스

전체 코드입니다.

더보기
public class Snake
{
    public List<Point> body;
    public Direction direction;

    //생성자
    public Snake(Point tail, int length, Direction _direction)
    {
        this.direction = _direction;
        body = new List<Point>();
        for (int i = 0; i < length; i++)
        {
            Point p = new Point(tail.x, tail.y, '*');
            body.Add(p);
            tail.x += 1;
        }
    }

    //뱀을 그리는 함수
    public void Draw()
    {
        foreach(Point p in body)
        {
            p.Draw();
        }
    }

    public void Move()
    {
        Point tail = body.First();
        body.Remove(tail);

        Point head = NextPoint();
        body.Add(head);
        tail.Clear();
    }

    private Point NextPoint()
    {
        Point headPoint = body.Last();
        Point returnPoint = new Point(headPoint.x, headPoint.y, headPoint.sym);
        switch(direction)
        {
            case Direction.LEFT:
                returnPoint.x -= 1;
                break;
            case Direction.RIGHT:
                returnPoint.x += 1;
                break;
            case Direction.DOWN:
                returnPoint.y += 1;
                break;
            case Direction.UP:
                returnPoint.y -= 1;
                break;
        }

        return returnPoint;
    }

    public bool IsGetFood(Point foodPoint)
    {
        Point head = NextPoint();
        if(head.IsHit(foodPoint))
        {
            foodPoint.sym = head.sym;
            body.Add(foodPoint);
            return true;
        }
        else
        {
            return false;
        }
    }

    public bool IsHitWall()
    {
        Point head = body.Last();
        if(head.x <= 0 ||  head.x >= 80 || head.y <= 0 || head.y >= 20)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    public bool IsHitBody()
    {
        Point head = body.Last();
        for(int i = 0; i < body.Count - 1; i++)
        {
            if (head.IsHit(body[i]))
            {
                return true;
            }
        }
        return false;
    }
}

이 클래스는 게임을 진행하며 플레이어가 조종할 뱀의 정보와 움직임등을 당담하는 클래스입니다.

 

먼저 클래스의 필드와 생성자를 만들어주겠습니다.

public List<Point> body;
public Direction direction;

//생성자
public Snake(Point tail, int length, Direction _direction)
{
    this.direction = _direction;
    body = new List<Point>();
    for (int i = 0; i < length; i++)
    {
        Point p = new Point(tail.x, tail.y, '*');
        body.Add(p);
        tail.x += 1;
    }
}

객체 생성시 Point 클래스와 숫자, Direction 열거형을 받아오게 되는데, 이를 각각 꼬리의 위치, 뱀의 길이, 처음 뱀이 움직일 방향 으로 지정하고 생성자를 만들어주었습니다.

 

또한 뱀의 길이는 꾸준히 증가하며, 최대길이를 지정해줄 수 없기 때문에 각 몸통의 포인트를 리스트로 관리합니다.

 

이후 생성자를 통해 리스트에 처음 저장되는 포인트를 뱀의 꼬리로하여 포인트를 오른쪽으로 한칸씩 옮기며 뱀의 몸통을 만들어줍니다.

 

다음은 뱀을 그려주는 함수입니다.

//뱀을 그리는 함수
public void Draw()
{
    foreach(Point p in body)
    {
        p.Draw();
    }
}

뱀의 몸통을 지정하는 각 포인트 클래스 에는 포인트의 x, y 좌표값과 포인트를 어떤 형태로 채울지 결정하는 char 변수가 저장되어있습니다.

 

몸통 리스트에서 각 포인트 클래스를 꺼내와 자신이 저장하고있는 위치에 저장된 형태로 값을 출력하는 Draw함수를 리스트 전체에서 불러와 뱀을 그려줍니다.

Point 클래스의 Draw() 함수는 사전에 주어진 상태이며, 이런 형태로 되어있습니다.

// 점을 그리는 메서드
public void Draw()
{
    Console.SetCursorPosition(x, y);
    Console.Write(sym);
}

 

 

뱀의 움직임을 당담하는 함수를 만들어주겠습니다.

public void Move()
{
    Point tail = body.First();
    body.Remove(tail);

    Point head = NextPoint();
    body.Add(head);
    tail.Clear();
}

몸통 리스트의 첫번째 내용물을 가져와 꼬리로 지정해주며, 지정한 포인트를 지워주도록 합니다.

// 점을 지우는 메서드
public void Clear()
{
    sym = ' ';
    Draw();
}

Point 클래스의 Clear() 함수는 사전에 주어져있으며, 자신이 저장된 포인트를 공백으로 채우도록 되어있습니다.

 

이후 다음이동할 위치의 좌표값에 새로운 포인트를 만들어 이를 머리로 저장하고 리스트의 마지막에 추가해줍니다.

아래는 다음 위치의 좌표값을 얻어내는 함수입니다.

private Point NextPoint()
{
    Point headPoint = body.Last();
    Point returnPoint = new Point(headPoint.x, headPoint.y, headPoint.sym);
    switch(direction)
    {
        case Direction.LEFT:
            returnPoint.x -= 1;
            break;
        case Direction.RIGHT:
            returnPoint.x += 1;
            break;
        case Direction.DOWN:
            returnPoint.y += 1;
            break;
        case Direction.UP:
            returnPoint.y -= 1;
            break;
    }

    return returnPoint;
}

몸통 리스트의 마지막 포인트를 가져온 뒤, 이를 머리로 지정해줍니다.

이후 머리의 정보를 복제한 새로운 포인트를 만든 뒤, 현재 뱀의 Direction 변수의 상태에 따라 새로운 포인트의 위치를 변경해주고 새로운 포인트를 반환해줍니다.

 

다음으로 음식을 획득할 때 작동할 함수를 만들어주겠습니다.

public bool IsGetFood(Point foodPoint)
{
    Point head = NextPoint();
    if(head.IsHit(foodPoint))
    {
        foodPoint.sym = head.sym;
        body.Add(foodPoint);
        return true;
    }
    else
    {
        return false;
    }
}

음식을 획득할 때, 획득에 성공하면 다음 위치에 음식을 생성해주어야 합니다.

따라서 이 함수의 반환값을 bool 형식으로 만들어 음식을 획득한 순간 true를 반환하여 다음 위치에 음식을 생성하는 트리거로써 활용합니다.

 

또한 음식을 획득하면 뱀의 길이가 한칸 들어나야합니다.

음식또한 Point 클래스로 만들어진 상태이기 때문에, 이 음식 포인트의 char 변수를 뱀의 형태로 변경하고, 음식 포인트 자체를 뱀의 몸통 리스트에 추가하여 새로운 머리로 만드는 형태로 뱀이 음식을 먹으면 성장하도록 만들어주었습니다.

 

음식의 획득 판정은 Point의 IsHit(Point p) 함수를 통해 체크하게 됩니다.

// 두 점이 같은지 비교하는 메서드
public bool IsHit(Point p)
{
    return p.x == x && p.y == y;
}

해당 함수는 자신의 포인트와 매개변수의 포인트의 x,y 값을 비교하여 두 값이 모두 같으면 true를 반환합니다.

음식의 획득을 당담하는 함수에서 매개변수로 현재 음식의 포인트를 받게되고, 이 매개변수와 뱀의 다음 진행방향 위치의 포인트를 비교하게됩니다.

 

이후 게임의 진행을 당담하는 반복문을 만들 때, 음식을 획득하지 않을때는 Move() 함수를 사용하여 꼬리를 지우며 다음위치에 머리가 생성되고, 음식을 획득할때는 해당 함수를 통해 음식의 char를 뱀 모습으로 바꾸며 이를 리스트에 추가하고, 꼬리를 지우지 않게 되어서 음식을 먹으면 뱀이 길어지게 됩니다.

 

마지막으로, 게임 종료를 위한 트리거 함수들입니다.

public bool IsHitWall()
{
    Point head = body.Last();
    if(head.x <= 0 ||  head.x >= 80 || head.y <= 0 || head.y >= 20)
    {
        return true;
    }
    else
    {
        return false;
    }
}

public bool IsHitBody()
{
    Point head = body.Last();
    for(int i = 0; i < body.Count - 1; i++)
    {
        if (head.IsHit(body[i]))
        {
            return true;
        }
    }
    return false;
}

이 함수들은 뱀이 움직인 후, 머리가 벽이나 몸통에 닿았는지를 판단하여 게임을 종료할지 여부를 결정하게 됩니다.

벽의 경우 X축이 0 , 80 Y값이 0, 20 으로 만들어 줄 예정이기 때문에, 머리의 포인트가 해당 값 이상을경우 true를 반환하여 게임을 종료하게 합니다.

 

몸통의 경우 머리의 포인트 위치 변수를 각 몸통의 포인트 위치 변수와 비교하여 변수값이 같을경우 게임을 종료합니다.

이때, body.Count -1 을 사용하는 이유는, 몸통 리스트의 마지막 값은 머리이기 때문에, 이를 포함하면 게임 종료 판정을 발생시키기 때문입니다.

 

이것으로 Snake 클래스의 구성이 완료되었습니다.

다음은 음식을 생성하는 FoodCreator 클래스를 만들어주겠습니다.


FoodCreator 클래스

이 클래스의 구성은 이러합니다.

public class FoodCreator
{
    int x;
    int y;
    char sym;

    Random random = new Random();

    public FoodCreator(int _x, int _y, char _sym)
    {
        x = _x; 
        y = _y;
        sym = _sym;
    }

    public Point CreateFood()
    {
        int randX = random.Next(1, x);
        int randY = random.Next(1, y);

        return new Point(randX, randY, sym);
    }
}

 

메인함수에서 사용되는 이 클래스의 생성자는 숫자 2개의 Char 값 1개로 구성되어있습니다.

FoodCreator foodCreator = new FoodCreator(80, 20, '$');

 

이 3개의 매개변수를 각각 음식이 생성될 수 있는 최대값 2개(벽)와 음식의 형태로 지정하여 사용하였습니다.

 

필드와 생성자입니다.

int x;
int y;
char sym;

Random random = new Random();

public FoodCreator(int _x, int _y, char _sym)
{
    x = _x; 
    y = _y;
    sym = _sym;
}

필드에는 음식이 생성될 최대 위치값과 음식의 형태를 저장할 변수를 선언해주었습니다.

또한 무작위 위치에 음식을 생성해야하기 때문에 랜덤 클래스의 객체를 선언해주었습니다.

 

메인함수에서 사용될 음식을 생성하는 함수입니다.

public Point CreateFood()
{
    int randX = random.Next(1, x);
    int randY = random.Next(1, y);

    return new Point(randX, randY, sym);
}

 

 

Random.Next() 는 왼쪽값 이상, 오른쪽 값 미만으로 무작위 값을 생성하기 때문에 1 ~ 79, 1 ~ 19 사이의 값을 생성하게 됩니다.

 

또한 반환값을 Point 클래스로 하여 이 함수가 가진 내용으로 새로운 포인트를 반환하게 됩니다.

 

FoodCreator 클래스는 이 내용이 끝입니다.

이제 메인함수에서 게임을 만들어보겠습니다.

 


전체 메인 함수입니다.

더보기
static void Main(string[] args)
{
    // 뱀의 초기 위치와 방향을 설정하고, 그립니다.
    Point p = new Point(4, 5, '*');
    Snake snake = new Snake(p, 4, Direction.RIGHT);
    snake.Draw();

    // 음식의 위치를 무작위로 생성하고, 그립니다.
    FoodCreator foodCreator = new FoodCreator(80, 20, '$');
    Point food = foodCreator.CreateFood();
    food.Draw();

    int foodCount = 0;

    DrawWall();

    // 게임 루프: 이 루프는 게임이 끝날 때까지 계속 실행됩니다.
    while (true)
    {
        // 키 입력이 있는 경우에만 방향을 변경합니다.
        if (Console.KeyAvailable)
        {
            ConsoleKeyInfo inputKey = Console.ReadKey(true);
            switch (inputKey.Key)
            {
                case ConsoleKey.UpArrow:
                    snake.direction = Direction.UP;
                    break;
                case ConsoleKey.DownArrow:
                    snake.direction = Direction.DOWN;
                    break;
                case ConsoleKey.LeftArrow:
                    snake.direction = Direction.LEFT;
                    break;
                case ConsoleKey.RightArrow:
                    snake.direction = Direction.RIGHT;
                    break;
            }
        }
        // 뱀이 이동하고, 음식을 먹었는지, 벽이나 자신의 몸에 부딪혔는지 등을 확인하고 처리하는 로직을 작성하세요.
        if(snake.IsGetFood(food))
        {
            foodCount++;
            food = foodCreator.CreateFood();
            food.Draw();
        }
        else
        {
            snake.Move();
        }

        snake.Draw();
        // 이동, 음식 먹기, 충돌 처리 등의 로직을 완성하세요.

        Thread.Sleep(100); // 게임 속도 조절 (이 값을 변경하면 게임의 속도가 바뀝니다)


        if (snake.IsHitBody() == true || snake.IsHitWall() == true)
        {
            //반복종료(게임 종료)
            break;
        }
        // 뱀의 상태를 출력합니다 (예: 현재 길이, 먹은 음식의 수 등)
        Console.SetCursorPosition(0, 21);
        Console.WriteLine($"Food Count : {foodCount}");
    }

    GameOver();
    Console.ReadLine();
}

//벽 생성
static void DrawWall()
{
    for(int i = 0; i < 80; i++)
    {
        Console.SetCursorPosition(i, 0);
        Console.Write("#");
        Console.SetCursorPosition(i, 20);
        Console.Write("#");
    }

    for(int j = 0; j < 20; j ++)
    {
        Console.SetCursorPosition(0, j);
        Console.Write("#");
        Console.SetCursorPosition(80, j);
        Console.Write("#");
    }
}

//게임 종료
static void GameOver()
{
    Console.SetCursorPosition(25, 22);
    Console.Write("Game Over");
}

먼저 메인 이외의 함수를 보도록 하겠습니다.

이 함수들은 벽을 생성하고, 게임종료 텍스트를 띄우는 간단한 역할들을 합니다.

//벽 생성
static void DrawWall()
{
    for(int i = 0; i < 80; i++)
    {
        Console.SetCursorPosition(i, 0);
        Console.Write("#");
        Console.SetCursorPosition(i, 20);
        Console.Write("#");
    }

    for(int j = 0; j < 20; j ++)
    {
        Console.SetCursorPosition(0, j);
        Console.Write("#");
        Console.SetCursorPosition(80, j);
        Console.Write("#");
    }
}

//게임 종료
static void GameOver()
{
    Console.SetCursorPosition(25, 22);
    Console.Write("Game Over");
}

벽은 게임판 주변에만 세우도록, x 가 0, 80 일때와 y가 0, 20 인 위치에만 #형태로 만들어주도록 하였습니다.

또한 게임오버 텍스트를 25,22 위치를 기준으로 만들어줍니다.

 

이때, 좌표의 경우 콘솔창의 왼쪽 위를 기준으로 0, 0 이 되며, 우측으로 가면 x + 1, 아래로 가면 y + 1 이 됩니다.

 


본격적인 메인함수입니다.

이 내용은 초기에 주어진 코드입니다.

// 뱀의 초기 위치와 방향을 설정하고, 그립니다.
Point p = new Point(4, 5, '*');
Snake snake = new Snake(p, 4, Direction.RIGHT);
snake.Draw();

// 음식의 위치를 무작위로 생성하고, 그립니다.
FoodCreator foodCreator = new FoodCreator(80, 20, '$');
Point food = foodCreator.CreateFood();
food.Draw();

Snake 클래스와 FoodCreator 클래스의 함수와 생성자를 이 내용에 맞게 만들어준 상태입니다.

 

다음으로 점수를 저장할 변수를 선언하고, 벽을 생성해주었습니다.

int foodCount = 0;

DrawWall();

 

게임의 루프입니다.

// 게임 루프: 이 루프는 게임이 끝날 때까지 계속 실행됩니다.
while (true)
{
    // 키 입력이 있는 경우에만 방향을 변경합니다.
    if (Console.KeyAvailable)
    {
        ConsoleKeyInfo inputKey = Console.ReadKey(true);
        switch (inputKey.Key)
        {
            case ConsoleKey.UpArrow:
                snake.direction = Direction.UP;
                break;
            case ConsoleKey.DownArrow:
                snake.direction = Direction.DOWN;
                break;
            case ConsoleKey.LeftArrow:
                snake.direction = Direction.LEFT;
                break;
            case ConsoleKey.RightArrow:
                snake.direction = Direction.RIGHT;
                break;
        }
    }
    // 뱀이 이동하고, 음식을 먹었는지, 벽이나 자신의 몸에 부딪혔는지 등을 확인하고 처리하는 로직을 작성하세요.
    if(snake.IsGetFood(food))
    {
        foodCount++;
        food = foodCreator.CreateFood();
        food.Draw();
    }
    else
    {
        snake.Move();
    }

    snake.Draw();
    // 이동, 음식 먹기, 충돌 처리 등의 로직을 완성하세요.

    Thread.Sleep(100); // 게임 속도 조절 (이 값을 변경하면 게임의 속도가 바뀝니다)


    if (snake.IsHitBody() == true || snake.IsHitWall() == true)
    {
        //반복종료(게임 종료)
        break;
    }
    // 뱀의 상태를 출력합니다 (예: 현재 길이, 먹은 음식의 수 등)
    Console.SetCursorPosition(0, 21);
    Console.WriteLine($"Food Count : {foodCount}");
}

 

각 단계별로 설명하겠습니다.

 

먼저, 루프의 시작에 플레이어의 입력을 받아줍니다.

// 키 입력이 있는 경우에만 방향을 변경합니다.
if (Console.KeyAvailable)
{
    ConsoleKeyInfo inputKey = Console.ReadKey(true);
    switch (inputKey.Key)
    {
        case ConsoleKey.UpArrow:
            snake.direction = Direction.UP;
            break;
        case ConsoleKey.DownArrow:
            snake.direction = Direction.DOWN;
            break;
        case ConsoleKey.LeftArrow:
            snake.direction = Direction.LEFT;
            break;
        case ConsoleKey.RightArrow:
            snake.direction = Direction.RIGHT;
            break;
    }
}

Console.KeyAvailable은 사용자의 키 입력을 인식하는 내용으로 키 입력이 있으면 true, 없으면 false 값을 반환하게 됩니다.

 

이후 ConsoleKeyInfo 의 형태로 사용자의 키 입력을 받아줍니다.

해당값은 입력한 키 값의 정보를 가지고 있으며 Key 속성을 통해 어떤 키를 입력했는지 알 수 있습니다.

방향키의 경우 ConsoleKey.UpArrow 등의 형태로 값을 반환하며

Up = 위

Down = 아래

Left = 왼쪽

Right = 오른쪽

의 값을 반환합니다.

 

이 형태에 맞추어 객체 선언을 한 Snake클래스의 direction 변수를 열거형에 맞추어 변환하여 입력합니다.

 

뱀의 이동을 구현하는 단계입니다.

// 뱀이 이동하고, 음식을 먹었는지, 벽이나 자신의 몸에 부딪혔는지 등을 확인하고 처리하는 로직을 작성하세요.
if(snake.IsGetFood(food))
{
    foodCount++;
    food = foodCreator.CreateFood();
    food.Draw();
}
else
{
    snake.Move();
}

snake.Draw();

이전, 음식획득을 구현할때 언급하였듯이 음식을 획득하면 꼬리를 지우지 않고 음식의 모습을 변경하여 몸통에 추가합니다.

또한 점수를 올리고 새로운 음식을 생성하여 표시하는 역할을 수행합니다.

 

음식을 획득하지 못했을경우, Snake 클래스의 Move 함수를 호출하여 다음위치에 머리 포인트를 생성하여 뱀의 몸통 리스트에 추가하고, 첫 리스트를 삭제하여 꼬리를 지워 움직임을 표현합니다.

 

이후 snake.Draw() 를 사용하여 뱀을 그려줍니다.

 

마지막으로 게임 종료를 판단하고, 상태를 출력합니다.

Thread.Sleep(100); // 게임 속도 조절 (이 값을 변경하면 게임의 속도가 바뀝니다)


if (snake.IsHitBody() == true || snake.IsHitWall() == true)
{
    //반복종료(게임 종료)
    break;
}
// 뱀의 상태를 출력합니다 (예: 현재 길이, 먹은 음식의 수 등)
Console.SetCursorPosition(0, 21);
Console.WriteLine($"Food Count : {foodCount}");

Thread.Sleep() 은 일정시간 콘솔을 멈추는 기능으로, 게임이 너무 빠르게 흘러가는것을 방지하니다.

 

이후 뱀의 머리가 벽이나 몸통에 부딧쳤는지를 판단하고, 부딧쳤을경우 반복문을 끊어 게임을 종료합니다.

마지막으로 벽 하단에 커서를 지정하여 현재 점수를 출력해줍니다.

 

반복이 종료되면 게임 종료를 출력하고, 입력을 기다리는것으로 즉시 프로그램이 종료되지 않도록 방지해줍니다.

GameOver();
Console.ReadLine();

 

실행하면 이러한 프로그램이 작동합니다.

 

 

개인적인 소감으로는 생성자를 제공할 때, 각 생성자의 매개변수가 어떤 역할을 하는지 주어졌으면 좀 더 좋지 않았을까 하는 생각이 듭니다.

 

해당 내용의경우 진행중 감이 안잡혀 풀이를 참조한 내용이 있기 때문에, 풀이와 비교는 진행하지 않도록 하겠습니다.