240110 - 팀과제 2일차

유시아·2024년 1월 10일
0

팀과제

목록 보기
2/6

오늘은 하루종일...팀원분의 코드를 뜯어보았다...
이걸 알아야 일단 내가 코드를 만질 수 있을 것 같아서..
↓↓민수님이 쓰셨던 player.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Metadata;
using System.Text;
using System.Threading.Tasks;
using TextRPG;

namespace TextRPG
{
    internal class Player : IListener
    {
        private ObjectState state;
        private int level = 1;
        private int itemATK;
        private int itemDEF;
        public int ATK { get { return state.ATK; } }
        public int DEF { get { return state.DEF; } }
        public int Gold
        {
            get { return state.Gold; }
            private set
            {
                state.Gold = Math.Clamp(value, 0, 999999999);
            }
        }
        public int Health
        {
            get { return state.Health; }
            private set
            {
                state.Health = Math.Clamp(value, 0, 100);
            }
        }

        public Player()
        {
            EventManager.Instance.AddListener(EventType.eGameInit, this);
            EventManager.Instance.AddListener(EventType.eGameEnd, this);
            EventManager.Instance.AddListener(EventType.eHealthChage, this);
            EventManager.Instance.AddListener(EventType.eGoldChage, this);
            EventManager.Instance.AddListener(EventType.eItemChage, this);
            EventManager.Instance.AddListener(EventType.eExpChage, this);
        }

        public void Init(string name, string _class, int? _gold = null, int? _health = null, int? _exp = null)
        {
            if (_health > 100)
                _health = 100;

            state.Name = name;
            state.Class = _class;
            state.Gold = _gold ?? 1500;
            state.Health = _health ?? 100;
            state.EXP = _exp ?? 100;

            switch (_class)
            {
                case "전사":
                    {
                        state.InitATK = 1;
                        state.InitDEF = 2;
                        break;
                    }
                case "마법사":
                    {
                        state.InitATK = 3;
                        state.InitDEF = 0;
                        break;
                    }
                case "궁수":
                    {
                        state.InitATK = 2;
                        state.InitDEF = 1;
                        break;
                    }
                case "도적":
                    {
                        state.InitATK = 3;
                        state.InitDEF = 0;
                        break;
                    }
            }
            LevelCheck();
            state.ATK = ATK > 1 ? ATK + (int)state.InitATK : (int)state.InitATK;
            state.DEF = DEF > 1 ? DEF + (int)state.InitDEF : (int)state.InitDEF;
        }

        public void LevelCheck()
        {
            int result = state.Level - level;
            if (level != state.Level)
            {
                state.InitATK += 0.5f * result;
                state.InitDEF += 1 * result;
                level = state.Level;
            }
            else
                level = state.Level;

        }

        public void ShowStat()
        {
            Console.Write($"Lv : {state.Level}");
            Console.WriteLine($"\tEXP : {state.EXP % 100}");
            Console.WriteLine($"{state.Name}  ( {state.Class} )");
            Console.WriteLine($"공격력 : {ATK}");
            Console.WriteLine($"방어력 : {DEF}");
            Console.WriteLine($"체력 : {Health}");
            Console.WriteLine($"Gold : {Gold}G");
        }

        void IListener.OnEvent(EventType type, object data)
        {
            switch (type)
            {
                case EventType.eHealthChage:
                    {
                        Health += (int)data;
                        break;
                    }
                case EventType.eGameInit:
                    {
                        ObjectState? stateLode = (ObjectState?)Utilities.LoadFile(LoadType.Player);
                        if (stateLode != null)
                            Init(stateLode.Value.Name, stateLode.Value.Class, stateLode.Value.Gold, stateLode.Value.Health, stateLode.Value.EXP);

                        break;
                    }
                case EventType.eGameEnd:
                    {
                        ObjectState playerState = new ObjectState
                        {
                            Name = state.Name,
                            Class = state.Class,
                            Gold = Gold,
                            Health = Health,
                            EXP = state.EXP,

                        };
                        Utilities.SaveFile(SaveType.Player, playerState);
                        break;
                    }
                case EventType.eGoldChage:
                    {
                        Gold += (int)data;
                        break;
                    }
                case EventType.eItemChage:
                    {
                        List<Item> items = [];
                        items = (List<Item>)data;
                        if (items != null)
                        {
                            itemATK = 0;
                            itemDEF = 0;
                            foreach (Item item in items)
                            {
                                itemATK += item.Power;
                                itemDEF += item.Armor;
                            }
                        }
                        state.ATK = (int)state.InitATK + itemATK;
                        state.DEF = state.InitDEF + itemDEF;

                        break;
                    }
                case EventType.eExpChage:
                    {
                        LevelCheck();
                        state.EXP += (int)data;
                        LevelCheck();
                        EventManager.Instance.PostEvent(EventType.eItemChage);

                        break;
                    }
                default:
                    {
                        Console.WriteLine("Player OnEvent Type Error!");
                        break;
                    }
            }
        }
    }
}

짧은 지식으로 열심히 찾아보면서 이해해보려 했다.
이...화딱지 나는 빨간줄들...
얘네들은 이제 이벤트리스너인데, 우리 팀 특성이 Manager.cs파일을 따로 갖고 있다.
대충 이제... 매니저파일에 식을 둬서 계산하거나 한 후 본 파일에 그 값을 불러오는 식으로, 코드가 복잡해지는 것을 방지한다라고 했었나... 민수님 진짜 똑똑한 것 같다
내가 맡은 부분이 플레이어에 대한 정보를 담으니까 당연히 플레이어 기본 스탯을 기재해놓고
플레이어에 대한 변동사항(전투 후 체력이 줄어들거나, 게임 정보를 저장하거나 등)에 대한 것들 또한 기재한다.
근데 이제 어떤 의도로 쓰신건지는 이해했으나,,,, 내가,,,너무 감자라서,,, 어떻게 돌아가는지를 아직도 파악하지 못함....
이벤트 매니저에서 정해놓은 것들을 토대로 불러온다- 까지는 이해했는데 이제 이걸 어떻게 뜯어고쳐야 오류가 없고 다른 팀원들도 쓸 수 있을까... 내일은 진짜 열심히 해야겠다. 진심으로.

나는 역시
말하는 감자다

profile
패션컴공탈출기

0개의 댓글