Unity_2기 내일배움캠프 TIL

Unity_2기 3주차 (231114)

잼잼재미 2023. 11. 14. 20:55

오늘은 어제 제출한 개인 과제, 스파르타 던전 Text게임 튜터님의 피드백을 받았다.

전체적으로 많이 헤맸고, 어려워서 필수 구현부분까지만 만들었는데 생각보다 피드백이 좋았다.

 

● 피드백 내용

 - 깃, 리드미 정리를 잘함
 - 요구사항 충실하게 구현 잘함
 - 클래스 상속과 생성자에 관련된 부분들을 한번 더 공부해서 정리가 필요

 

리드미를 검색을 해서 최대한 깔끔하게 정리했긴 하지만, 이 부분에서 칭찬을 받으니 사실 조금 의외였다.

그리고 요구사항을 모두 잘 구현하였다는 피드백을 받았고, 클래스 상속과 생성자에 관련된 부분을 한번 더 공부가 필요하다는 피드백을 받았는데, 이 부분은 Item을 정의하고 기타 생성자를 정의하지 않고, 기본 생성자를 호출하고 하나씩 변수를 대입했기 때문에 받은 피드백인 것 같다.

 

그리고 오늘 스파르타코딩클럽 C# 4주차 강의를 모두 들었다. 확실히 앞 주차에 비해서 많이 어렵다고 생각했다. 생각보다 완전히 처음 들어보는 내용도 많아서 당황했지만 티스토리에 최대한 다 정리를 했다. 

 

● 강의 내용

1. 델리게이트, 람다, Func, Action ☞ : https://kkln2486.tistory.com/76

 

델리게이트 (Delegate), 람다(Lambda), Func, Action

● 델리게이트 - 메서드를 참조하는 타입 (함수 포인터와 비슷한 개념, 똑같지는 않음) - 메서드를 매개변수로 전달하거나 변수에 할당할 수 있음 - 참조할 메서드의 매개변수와 동일하게 정의해

kkln2486.tistory.com

 

2. LINQ ☞ : https://kkln2486.tistory.com/77

 

LINQ

● LINQ - 쿼리 언어 확장 - 데이터 소스에서 데이터를 쿼리하고 조작하는데 사용 // 데이터 소스 정의 (컬렉션) List numbers = new List { 1, 2, 3, 4, 5 }; // 쿼리 작성 (선언적인 구문) var evenNumbers = from num in

kkln2486.tistory.com

 

3. Nullable형 ☞ : https://kkln2486.tistory.com/78

 

Nullable 형

● Nullable 형 - null 값을 가질 수 있는 값형에 대한 특별한 형식 - 기본적으로 값형은 null을 허용하지 않음 - 값형 변수에 null 값을 지정할 수 있는 방법을 제공 * null : 아무것도 없음을 의미, 참조

kkln2486.tistory.com

 

4. 문자열 빌더 ☞ : https://kkln2486.tistory.com/79

 

문자열 빌더 (StringBuilder)

● 문자열 빌더 - 문자열에 대한 추가, 삽입, 치환, 삭제 작업을 수행 - 내부 버퍼를 사용하여 문자열 조작을 수행하므로 크기를 동적으로 조정 가능 - 반복적인 문자열 조작 작업이 발생해도 효

kkln2486.tistory.com

 

4주차 마지막 강의를 들으니 역시 숙제가 있었다. 숙제는 앞의 개인 과제와 비슷한 텍스트 RPG게임 턴제 만들기였다.

개인과제에서 아이템, 인벤토리, 캐릭터 능력치 같은 기본적인 것들을 구현했기 때문에 추가로 몇가지만 구현하기로 했다.

 

● 추가 구현

1. 던전입장

static void DisplayDungeon()
{
    int randomValue = random.Next(0, 3);

    Console.Clear();
    Console.WriteLine("던전");
    Console.WriteLine();

    switch (randomValue)
    {
        case 0:
            monster.Name = "슬라임";
            monster.Atk = 20;
            monster.Def = 3;
            monster.Hp = 20;
            break;

        case 1:
            monster.Name = "오크";
            monster.Atk = 40;
            monster.Def = 5;
            monster.Hp = 20;
            break;

        case 2:
            monster.Name = "드래곤";
            monster.Atk = 50;
            monster.Def = 8;
            monster.Hp = 30;
            break;

        default:
            break;
    }

    Console.WriteLine($"{monster.Name} 이(가) 등장했습니다.");
    Console.WriteLine();
    Console.WriteLine($"[{monster.Name}]");
    Console.WriteLine($"공격력 : {monster.Atk}");
    Console.WriteLine($"방어력 : {monster.Def}");
    Console.WriteLine($"체 력 : {monster.Hp}");
    Console.WriteLine();
    Console.WriteLine("[플레이어]");
    Console.WriteLine($"공격력 : {player.Atk}");
    Console.WriteLine($"방어력 : {player.Def}");
    Console.WriteLine($"체 력 : {player.Hp}");
    Console.WriteLine();
    Console.WriteLine("1. 싸우기");
    Console.WriteLine("2. 도망가기");
    Console.WriteLine();
    Console.WriteLine("원하시는 행동을 입력해주세요.");

    int input = CheckValidInput(1, 2);

    switch (input)
    {
        case 1:
            Battle();
            break;

        case 2:
            DisplayGameIntro();
            break;
    }

}

rand.Next() 함수를 통해 랜덤 값을 0~3을 받고, 숫자에 따라 랜덤한 몬스터가 생성되도록 했다.

 

2. 몬스터 클래스 추가

public class Monster
{
    public string Name { get; set; }
    public int Atk { get; set; }
    public int Def { get; set; }
    public int Hp { get; set; }
}

각 몬스터 능력치를 모두 프로퍼티로 정의했다.

 

3. 배틀

 

static void Battle()
{
    Console.Clear();

    Console.WriteLine($"플레이어가 {monster.Name} 을(를) 공격합니다.");

    // 플레이어 공격
    if(player.Atk > monster.Def)
    {
        monster.Hp -= (player.Atk - monster.Def);

        if(monster.Hp <= 0)
        {
            Console.WriteLine($"플레이어가 {monster.Name} 을(를) 쓰러트렸습니다.");
            Console.WriteLine();
            Console.WriteLine("아무키나 입력해주세요.");
            Console.ReadKey();

            DisplayDungeon();
        }
    }
    else
    {
        Console.WriteLine("플레이어가 공격에 실패했습니다.");
    }

    // 몬스터 공격
    Console.WriteLine($"{monster.Name} 이(가) 플레이어를 공격합니다.");
    if (monster.Atk > player.Def)
    {
        player.Hp -= (monster.Atk - player.Def);

        if (player.Hp <= 0)
        {
            Console.WriteLine($"{monster.Name} 이(가) 플레이어를 쓰러트렸습니다.");
            Console.WriteLine();
            Console.WriteLine("============ GAME OVER ============");

            Environment.Exit(0);
        }
    }
    else
    {
        Console.WriteLine($"{monster.Name} 이(가) 공격에 실패했습니다.");
    }

    Console.WriteLine();
    Console.WriteLine($"[{monster.Name}]");
    Console.WriteLine($"공격력 : {monster.Atk}");
    Console.WriteLine($"방어력 : {monster.Def}");
    Console.WriteLine($"체 력 : {monster.Hp}");
    Console.WriteLine();
    Console.WriteLine("[플레이어]");
    Console.WriteLine($"공격력 : {player.Atk}");
    Console.WriteLine($"방어력 : {player.Def}");
    Console.WriteLine($"체 력 : {player.Hp}");
    Console.WriteLine();
    Console.WriteLine("1. 싸우기");
    Console.WriteLine("2. 도망가기");
    Console.WriteLine();
    Console.WriteLine("원하시는 행동을 입력해주세요.");

    int input = CheckValidInput(1, 2);

    switch (input)
    {
        case 1:
            Battle();
            break;

        case 2:
            DisplayGameIntro();
            break;
    }
}

먼저 플레이어가 공격하고 몬스터가 죽지 않았다면, 몬스터가 공격하는 함수를 만들어서 반복했다.

플레이어 공격은 몬스터체력에 플레이어의 공격력 - 몬스터의 방어력 만큼 빼주었고, 몬스터의 공격은 반대로 했다.

한 번의 전투가 끝나면 플레이어와 몬스터의 능력치를 모두 볼 수 있게 해서, 싸우기와 도망가기를 선택할 수 있다.

 

4. 휴식하기 

static void Healing()
{
    Console.Clear();
    Console.WriteLine("모두 회복하였습니다.");
    Console.WriteLine();
    Console.WriteLine("아무키나 입력해주세요.");
    Console.ReadKey();

    player.Atk = 10 + player.WeaponAtk;
    player.Def = 5 + player.ArmorDef;
    player.Hp = 100 + player.ArmorHp;
}

휴식하기를 통해 모든 능력치를 기본 능력치로 변경했다.

 

● 느낀점

이번에는 3마리의 몬스터중 랜덤으로 생성하는 부분이 가장 어려웠다. 처음에는 몬스터를 각각 클래스로 구현하고 그 중 랜덤으로 인스턴스를 생성하는 식으로 구현하려고 했으나, 전투부분에서 hp를 수정하는 부분에서 많이 막혀서, 결국 이미 생성된 인스턴스에 3마리의 몬스터 중 랜덤 몬스터의 능력치 수치를 직접 변수에 대입하는 것으로 구현했다. 항상 느끼는 것인데, 구현하기 전에는 금방할 수 있을 것이라고 생각하지만 막상 구현을 시작하면 항상 막히는 부분이 있고 생각보다 많은 시간이 걸린다. 더욱더 집중해서 한번에 구현을 할 수 있는 날까지 열심히 공부해야겠다. 

'Unity_2기 내일배움캠프 TIL' 카테고리의 다른 글

Unity_2기 3주차 (231116)  (0) 2023.11.16
Unity_2기 3주차 (231115)  (0) 2023.11.15
Unity_2기 3주차 (231113)  (1) 2023.11.13
Unity_2기 2주차 (231110)  (0) 2023.11.10
Unity_2기 2주차 (231109)  (0) 2023.11.09