TIL 0105 TextRPG - 4(개인) / 마무리

강성원·2024년 1월 5일
0

TIL 오늘 배운 것

목록 보기
10/69
post-thumbnail

오늘은 휴식 기능과 레벨업 기능을 구현했고, 자잘한 수정을 했다.

1. 휴식 기능 (여관 클래스)

여관 클래스를 만들고 플레이어의 체력을 조건부로 회복해주는 기능을 구현했다.

1-1. 출력 담당 메서드

ShowInn()

public void ShowInn()
{
    Console.Clear();
    Console.WriteLine(
        "               :*@#:  @%##@*       \r\n" +
        "             -##- -##=@=  ##       \r\n" +
        "          .=%*:     .*@*. ##       \r\n" +
        "        :*%+.         .=%*%#       \r\n" +
        "      -#%-               -#%-      \r\n" +
        "    =%*:                   :*%=.   \r\n" +
        " .+%+.                       .+%*. \r\n" +
        "*@@#############################@@*\r\n" +
        "     .@-                   -@:     \r\n" +
        "     .@-  -+==+=           :@:     \r\n" +
        "     .@-  ##::+@           -@:     \r\n" +
        "     .@-  #*  =@   @%####@:-@:     \r\n" +
        "     .@-  #*  =@   @+   .@-:@:     \r\n" +
        "     .@-  *%###%   @=   :@--@:     \r\n" +
        "     .@-           @=   :@-:@:     \r\n" +
        "     .@-           @+   :@-:@:     \r\n" +
        "     .@=:::::::::::@*:::-@==@:     \r\n");

    Console.WriteLine("================ 여관에서 휴식하기 ================");
    Console.WriteLine($"500 Gold를 내면 여관에서 체력을 회복할 수 있습니다. \n(보유 골드 : {player.Gold})");
    Console.WriteLine("==================================================");
}

ShowInnMenu()

public void ShowInnMenu()
{
    Console.WriteLine("\n1. 휴식하기");
    Console.WriteLine("0. 나가기");

    Console.WriteLine("원하시는 행동을 입력해주세요.");
    Console.Write(">> ");
}

SelectMenu(string playerInput, ref Scenes scene)

public void SelectMenu(string playerInput, ref Scenes scene)
{
    switch (playerInput)
    {
        case "0": // 마을로 나가기
            scene = Scenes.Town;
            break;
        case "1": // 휴식 시도
            Rest(player, ref scene);
            break;
    }
}
  • 플레이어 입력에 따라서 Rest 함수를 호출한다.

1-2. 휴식 로직

public void Rest(Player player, ref Scenes scene)

public void Rest(Player player, ref Scenes scene)
{
    //현재 체력이 100이면
    if(player.Hp >= 100) 
    {
        Console.WriteLine("\n체력이 이미 100입니다.");
        Console.Write("아무 키나 입력하세요...");
        Console.ReadLine();
    }
    //골드가 500이상이면 휴식 성공
    else if (player.Gold >= 500)
    {
        player.Hp = 100;
        player.Gold -= 500;
        ShowRest();
    }
    //골드 500미만이면 장면 Town으로 전환
    else
    {
        scene = Scenes.Town;
        ShowKicked();
    }
}
  • 체력이 100이면 휴식을 취하지 않고 돌아간다.

  • 체력이 100 미만이고 500골드 이상 소지하고있으면 플레이어의 Hp에 100을 할당하고 500골드를 감소시킨다.

  • 500골드 미만이면 장면을 Town으로 전환해버려서 내쫓는다.


2. 레벨업 기능

던전을 클리어 한 횟수에 따라서 레벨업 하는 기능을 구현했다.

LevelUp()

public class Player
{
    public void LevelUp()
    {
        //레벨 만큼 클리어하면
        //레벨 + 1, 공격력 +0.5, 방어력 +1

        if(Level <= ClearCount)
        {
            ClearCount = 0;
            ++Level;
            Attack += 0.5f;
            ++Defence;
            ShowLevelUp();
        }
    }
}
  • 던전을 클리어한 횟수가 현재 레벨 이상인 경우에 레벨업 로직을 진행한다.
  • 클리어 횟수 초기화, 레벨 1 증가, 공격력 0.5증가, 방어력 1 증가

3. 자잘한 수정

3-1. 싱글톤 -> 의존성 주입

원래는 플레이어를 싱글톤으로 만들고 운영했었다.

public class Player
{
    private static Player instance;
    public static Player Instance
    {
        get
        {
            if (instance == null)
                instance = new Player();

            return instance;
        }
    }
}

이렇게 싱글톤 패턴을 적용해놓은 후에 다른 클래스에서 정적 멤버를 호출하는 방식을 사용했는데,
그냥 의존성 주입으로 전달해줘도 될 것 같다는 생각이 들어서 변경해주었다.

class Game
{
    private Scenes scene = Scenes.Town;
    private Player player;
    private Store store;
    private Inventory inventory;
    private Dungeon dungeon;
    private Inn inn;

    public Game()
    {
        player = new Player();
        store = new Store(player);
        inventory = new Inventory(player);
        dungeon = new Dungeon(player);
        inn = new Inn(player);

        player.Inventory = inventory;
    }
}

이렇게 Player 객체를 만들고 다른 클래스들의 생성자로 넘겨주었다.

스택 오버플로우 문제도 이렇게 하면 생각할 것도 없었는데,,,

3-2. 게임 끝내기

게임을 끝내는 기능이 없었다.
그래서 추가해주었다.

Environment.Exit(0);

이 메서드를 호출해서 프로그램이 끝나도록 만들었다.
간단.


4. 작은 발표회

오늘은 팀 내부에서 자체적으로 각자 여태까지 한 결과물을 설명해보는 시간을 가졌고, 서로의 코딩 스타일이나 아이디어를 볼 수 있는 아주 좋은 시간이 됐다.

피곤해서 안고치고 넘어갈 뻔한 부분도 팀장님이 알려주셔서 고칠 수 있었다. (ㅎㅎ)

그리고 생각보다 코딩 스타일들이 다 달라서 다음 주의 팀 프로젝트 일정이 조금은 걱정이 되지만, 조율해나가는 경험은 성장에 도움이 될 것이라고 생각한다.

개인적으로는 남의 코드를 읽는 것이 세상에서 제일 어려운 것 중에 하나이다.
오늘 팀원분들이 써놓은 코드는 당연히 바로 이해하지 못했지만 같이 쓰인 주석을 보며 더듬더듬 이해할 수 있었다.
협업을 위해서는 이해하기 좋은 주석의 작성이 정말로 중요하다는 것을 다시금 느꼈다.


주말에는 시간이 비면 List나 접근제한자를 알아보고 간단히 글을 쓸 예정이다.

TextRPG 개인 프로젝트 깃허브 : https://github.com/ChocoMucho/TextRPG-Personal-Project

profile
개발은삼순이발

0개의 댓글