240116 - 팀과제 6일차!!!(6일차 맞다)

유시아·2024년 1월 16일
0

팀과제

목록 보기
5/6

반갑다
오늘 드디어 어느정도 player파트의 코드 이해를 해냈다!!!
그래서 내가 할 수 있는 일을 했다.

내가 맡은 파트, player.cs를 요약하자면
1. 플레이어에 대한 모든 정보를 담는다 (레벨, 경험치, 체력, 마나, 공격력, 방어력 등)

struct PlayerData
{
    public ObjectState os;
    public int maxHealth;
    public int maxMP;
    public int maxExp;
    public int dungeonStage;
}
private ObjectState myState;
private int maxHealth;
private int maxMP;
private int PrevHealth { get; set; } // 이전 hp값
private int PrevMp { get; set; }
private int PrevExp = 0;
public int dungeonStage = 0;    // 플레이어가 입장 가능한 던전 스테이지
private int maxEXP= 100; // 레벨 1일때 렙업에 필요한 경험치량, 초기 설정

  1. 플레이어가 상호작용 하는 모든 행동에 따라 정보를 변경한다.
    던전에서 몬스터를 잡아 경험치와 골드를 획득하고, 몬스터에게 맞은 만큼 체력이 깎이고, 몬스터에게 쓴 스킬만큼 마나를 닳게 하고, 상점에서 골드를 쓴 만큼 소지금에서 감소시키고, 장비를 착용해 올라가는 공격력과 방어력만큼 플레이어의 스탯을 변경하고 등등등...

예를 들어 설명하면
던전에서 몬스터를 잡아 경험치와 골드를 얻었다면
내 상태창에서 증가한 경험치와 골드량을 바로 반영

  1. 정보가 담긴 함수를 정리한 후 다른 파일에서 출력하기 쉽도록 한다.
public void PlayerStats()
{
    Console.WriteLine("\n[내 정보]\n");
    Console.Write("Lv.");
    Utilities.TextColorWithNoNewLine($"{myState.Level} ", ConsoleColor.DarkRed);
    Console.Write("EXP :");
    Utilities.TextColor($"{myState.EXP} / {maxEXP}", ConsoleColor.Yellow);
    Console.WriteLine($"{myState.Name} ({myState.Class})");
    Console.WriteLine($"HP : {myState.Health} / {maxHealth}");
    Console.WriteLine($"MP : {myState.MP} / {maxMP}");
    Console.WriteLine($"공격력 : {myState.ATK}");
    Console.WriteLine($"방어력 : {myState.DEF}");
}

public void ShowStats()
{
    Console.Write("Lv.");
    Utilities.TextColorWithNoNewLine($"{myState.Level} ", ConsoleColor.DarkRed);
    Console.WriteLine($"{myState.Name} ({myState.Class})");

    Console.Write("HP ");
    Utilities.TextColorWithNoNewLine($"{myState.Health}", ConsoleColor.DarkRed);

    Utilities.TextColorWithNoNewLine("/", ConsoleColor.DarkYellow);
    Utilities.TextColorWithNoNewLine($"{maxHealth}\n", ConsoleColor.DarkRed);

    Console.Write("MP ");
    Utilities.TextColorWithNoNewLine($"{myState.MP}", ConsoleColor.Blue);
    Utilities.TextColorWithNoNewLine("/", ConsoleColor.DarkYellow);
    Utilities.TextColorWithNoNewLine($"{maxMP}\n", ConsoleColor.Blue);
}

이 함수를
여기서 쓴다.

팀원들이 중간중간 코드를 추가해서 힌트를 주지 않았다면... 절대 완성되지 못했을 것이다..

오늘 한 일

  • 플레이어 스텟 초기 설정
    전사, 마법사, 궁수, 도적 별로 초기 스탯값이 다르다!

    그래서 switch문으로 직업별초기 스탯을 다르게 출력할 수 있도록 수정했다.
switch (Name.Value) // 직업: 전사, 마법사, 궁수, 도적
{
    case "전사":
        {
            myState.Health += 400; // 전사 : 체력 +400, 마나 그대로, 공격력+200, 방어력+100
            myState.MP = 100;
            myState.ATK += 200;
            myState.DEF += 100;
            maxHealth = myState.Health;
            maxMP = myState.MP;
            break;
        }
    case "마법사":
        {
            myState.Health += 100;  // 마법사 : 체력 +200, 마나+500, 공격력+150, 방어력+50
            myState.MP += 400;
            myState.ATK += 150;
            myState.DEF += 50;
            maxHealth = myState.Health;
            maxMP = myState.MP;
            break;
        }
    case "궁수":
        {
            myState.Health += 150; // 궁수 : 체력 +150, 마나+100, 공격력+300, 방어력+80
            myState.MP += 200;
            myState.ATK += 300;
            myState.DEF += 80;
            maxHealth = myState.Health;
            maxMP = myState.MP;
            break;
        }
    case "도적":
        {
            myState.Health += 250; // 도적 : 체력 + 350, 마나 + 200, 공격력 + 350, 방어력 + 60
            myState.MP += 200;
            myState.ATK += 350;
            myState.DEF += 60;
            maxHealth = myState.Health;
            maxMP = myState.MP;
            break;
        }
}

이는 createPlayer에서도 최초로 초기 스탯을 보여준다.

  • 레벨업 할 때마다 레벨업에 필요한 경험치량 증가
    추가 구현 사항으로 레벨업에 필요한 경험치를 레벨마다 다르게 하도록 해달라고 하셨다.
    maxEXP = 렙업에 필요한 경험치량
    사실 계획했던 것은 for문을 이용해서 Level이 1씩 증가할 때마다 maxEXP를 1.5배 하려고 했으나, 아무리 머리를 짜내고 변수 위치를 옮겨도 쓸 수가 없다는 것을 깨달았다.
    아니 할 수는 있겠지만 내가 너무 감자라!!!
    그래서 이용할 수 있는 것을 써보자면,
private int maxEXP= 100; // 레벨 1일때 렙업에 필요한 경험치량

초기 경험치값을 설정해준다. 플레이어가 원래 가지고 있는 경험치가 아닌, 현재 플레이어의 레벨에서 다음 레벨업까지 필요한 경험치를 의미한다.

if (myState.EXP / maxEXP != 0)
{
    LevelUp = myState.EXP / maxEXP; // maxEXP로 나눴을때 몫(=LevelUp)이 있다 (0이 아니면)
    myState.Level += LevelUp; // 레벨에 레벨업을 더해줌(몫이 있으니까), 그럼 레벨 증가
    myState.EXP = myState.EXP % maxEXP; // 렙업하고 나머지 경험치는 maxExp로 나눠서 나머지를 저장
    maxEXP = maxEXP*2;// maxEXP 증가
    Console.WriteLine("레벨 업!!\n");
    EventManager.Instance.PostEvent(EventType.Quest, Utilities.EventPair(eQuestType.PlayerLevel, LevelUp.ToString()));
}

그리고 던전이나 퀘스트에서 획득한 경험치를 저장할 때, 플레이어가 가지고 있는 경험치와 maxEXP를 나눈다.
이때 나눠서 몫이 생긴다면, 그만큼 LevelUp 변수에 넣고
현재 가지고 있는 경험치와 maxEXP를 나눈 나머지 값은 현재 경험치값으로 넣는다.
레벨업을 한다고 모든 경험치가 다 사라지면 안되니까!
그 후에, maxEXP값을 2배로 늘려준다.

그럼 1레벨에 필요한 경험치량은 100, 2레벨은 200, 3레벨은 400... 이렇게 증가한다!

.
.
.
.
.

...근데 사실 버그가 있다.

현재 우리 게임에서 몬스터를 잡았을 때 나오는 경험치량은 5~25 사이인데, 만약에 이 경험치량을 100~200씩 올려버리면 한번에 레벨이 1보다 더 많이 증가한다.

그럼 레벨이 1>5로 변경됐으니 maxEXP가 1000이 되어야 하는데, 아예 같은 처리로 묶어서 해버린 탓인지 maxEXP가 200이 된다.

...
경험치 5배 이벤트 할 것도 아닌데 괜찮지 않을까? 하하
고쳐야지.... 고쳐야지..... 이게 바로 개발자의 삶......
당장 오늘이 제출 마감인데....사실 경험치량만 바뀌지 않는다면 아무 일도 없는 일이지만....
그래도 너무 찝찝하고 아쉬운 것 같다....휴....
내일까지 고칠 수 있을까..?

profile
패션컴공탈출기

0개의 댓글