-
오늘부터 알고리즘 코드카타 시작했습니다. 1시간동안 진행되는데 한문제만 푸는 줄 알고 간단한 첫번째 문제 풀고 깃허브랑 연결하는 걸 했습니다.
하고 나서 잘 연결됐는지 확인하기 위해서 다른 문제를 풀었는데 연결이 안되더라구요. 알고보니깐 크롬이 아니면 연결이 안되는 문제가 있었습니다. 크롬으로 하니깐 잘 되었습니다.
그리고 꼭 한문제만 푸는게 아니라 1시간동안 가능한 많은 문제를 푸는 거였습니다. 내일은 더 많은 문제를 풀어보도록 하겠습니다.
팀 프로젝트는 저희 팀이 진도가 빨라서 선택 요구사항 부분을 거의 다 만들었습니다. 그래서 추가적으로 만들고 싶은 기능을 만들거나 지금까지 만든 코드를 정리하기로 했습니다.
완성된게 많고, 요구사항 갯수가 많아서 오늘 한 요구사항에 대해서만 작성해보겠습니다.
선택 요구사항
- 아이템 적용 : 어제 열심히 만들어서 완성했는데 엎어졌습니다. 하하.
public int ExAttack() { int exAttack = 0; foreach (Item item in inventoryList.FindAll(isequip => isequip.IsEquip == true && isequip.GetSpecType == SpecType.ATTACK)) { exAttack += item.GetSpec; } return exAttack; }
list.FindAll : list에서 조건에 맞는 모든 값을 찾는다.
inventoryList에 있는 Item 중에서 장착을 했고(IsEquip = true), Item 타입이 Attack인 Item isequip을 찾아서 item에 저장하여, item.GetSpec을 더해주는 함수입니다.
isequip가 어떤 건지 처음에는 몰랐음.
제가 아이템 능력치을 적용시키기 위해서 이미 만들어져있는 Inventory.cs를 봤을 때 있던 함수입니다.
주석도 친절하게 장착한 아이템 능력치 가져오기로 되어있어서 사용하면 간편하겠다 생각했었습니다.
근데 사용하니깐 아이템을 착용하지 않았는데 착용된 상태가 계속 출력이 되더라구요.
그래서 착용 해제했을 때 착용한 아이템의 능력치를 빼야겠다 라고 생각을 해서 어제처럼 만들었습니다.
근데! 팀장님이 이건 이렇게 사용하는 거에요. 하고 바꾸신겁니다!
역시 만든 사람이 건들여야 빠르고 간단하게 되는 것 같습니다.
//Inventory.cs public void SetPlayerSpec(Player player, Item item) { player.PlusAttack = ExAttack(); } //Player.cs public int Total_Attack { get { return Attack + PlusAttack; } } //GameManager.cs Console.Write($"공격력 : {character.Total_Attack}"); Console.WriteLine((character.PlusAttack > 0) ? $" (+{character.PlusAttack})" : "");
원래 있던 함수를 이용해서 적용하는 방법입니다.
장착된 아이템 능력치를 Plus 변수에 저장해줍니다.
기존의 캐릭터 능력치는 변화를 주지 않고 새로운 변수를 만들어서 사용해줍니다.
그러면 장착된 아이템이 없을 경우 Plus = 0이 되므로 기존의 캐릭터 능력치만 출력되게 됩니다.
어제 엄청 길게 적었던 함수가 이렇게 간단하게 바뀌는거였습니다.
사용해보려고 했는데 잘못 사용한게 됐습니다.
- 포션 종류 추가 : 기존 HP 포션과 캐릭터가 스킬을 사용하게 되면서 MP가 생겨서 MP 포션도 만들어보았습니다.
public enum PortionType { HP, MP }
열거형 Enum : 서로 관련된 상수들의 집합을 정의할 때 사용. 각 상수는 정수 값으로 지정됨.
enum에 대해서는 잘 모르지만 포션 종류를 나누는 것에 사용되면 좋을 것이라 생각해서 사용하게 되었습니다.
문제는 PortionType을 Portion.cs에 만들었는데 GameManager.cs에서 사용하고 싶을 때마다 'Portion.PortionType.HP' 처럼 길게 사용하게 되어서 짧게 사용할 수 없나하고 팀원분들이 사용하신 걸 봤는데 'PortionType.HP'로 사용할 수 있더라구요! 그래서 팀원분께서 만드신 것과 제가 만든 것을 비교해보았는데,
public enum PortionType { HP, MP } internal class Portion
지정된 클래스 안에 enum을 넣게 되면 클래스명까지 포함해야 사용할 수 있고 클래스 바깥에 적게 되면 클래스명이 필요없다는 것을 확인했습니다.
포션 종류도 정했고 해서 HP와 MP를 구분지어서 함수를 만들려고 했습니다.
근데 제가 포션 생성자에 PortionType을 받도록 설정을 해두었습니다. 그래서 HP와 MP를 구분지어서 함수를 만들 때 겹치는 부분을 합쳐서 함수를 만들 수 있을 것 같다는 생각으로 중복을 줄여보려고 했습니다.
public Portion(PortionType type) { portiontype = type; portioncount = 0; } public void UsePortion(Player player) { int pre_hp = 0; int pre_mp = 0; if (Count <= 0) { Console.WriteLine("포션이 부족합니다."); Console.WriteLine("처음 화면으로 돌아갑니다."); Thread.Sleep(2000); return; } else if (Type == PortionType.HP); else if (Type == PortionType.MP); Console.WriteLine("회복을 완료했습니다."); Console.Write((pre_hp != 0) ? $"{pre_hp} -> {player.Health}\n" : ""); Console.Write((pre_mp != 0) ? $"{pre_mp} -> {player.Mp}\n" : ""); }
두 개의 타입에 맞춰서 바뀌는 부분은 어쩔 수 없이 if문을 이용해서 타입별로 맞춰주었지만 타입에 상관없이 출력되야하는 부분은 한개로 합해서 만들어주었습니다.
만약 이걸 생각하지 못햇다면 UseHpPortion, UseMpPortion 두 개의 함수를 만들어서 사용해줬을 것 같습니다.
Portion hpportion = new Portion(PortionType.HP); Portion mpportion = new Portion(PortionType.MP); private void ViewPortion() { Console.WriteLine("1. 체력 회복하기"); Console.WriteLine("2. 마나 회복하기"); switch (act) { case 1: hpportion.UsePortion(character); break; case 2: mpportion.UsePortion(character); break; } }
Portion을 생성했을 때 Type을 지정해줬기 때문에 함수를 사용해줬을 때 생성될 때 설정한 Type에 맞게 함수가 실행되게 됩니다.
- 던전 보상 추가 : 포션이 만들어지면서 던전 보상으로 포션이 확률적으로 드랍되게 팀원분께서 만들어주셨습니다.
여기서 문제는 드랍된 포션이 GameManager로 들어가지 않아서 포션 개수가 갱신이 되지 않는 것이었습니다.
private void Rewards() { HPportion.SetPortion(rewardHpPotion); MPportion.SetPortion(rewardMpPotion); Console.WriteLine("[획득 아이템]"); if(rewardHpPotion >= 1) { Console.WriteLine($"체력 회복 포션 - {rewardHpPotion}"); } if(rewardMpPotion >= 1) { Console.WriteLine($"마나 회복 포션 - {rewardMpPotion}"); } } //포션 보상 적용 public void PlusPortion(Portion portion) { if(portion.Type == PortionType.HP) { portion.SetPortion(HPportion.Count); HPportion.Count = 0; } else if (portion.Type == PortionType.MP) { portion.SetPortion(MPportion.Count); MPportion.Count = 0; } }
MP 포션을 만들어주었기 때문에 보상에 MP 포션을 추가해주었고 그에 맞춰서 Console.WriteLine도 작성했습니다.
GameManager에 있는 Portion과 Dungeon에 있는 Portion이 연결되는 것이 핵심이기 때문에 따로 작성해줬습니다.
SetPortion()은 매개변수 값을 포션 개수에 더해주는 것이기 때문에 보상을 지급한 후에 Count = 0 으로 초기화 시켜주었습니다.
팀 프로젝트는 항상 각자 코드를 만들어서 합치는 과정이 힘듭니다.
근데 이번에는 이미 만들어진 것을 이용해서 만들어야하는 것이기 때문에 더욱 힘든 것 같습니다.
'만들어져있는 것을 확인하고 해석하고 어떻게 사용할 수 있을지 생각하고'
그러면서 제가 하는 스타일로 코드를 만드는 것이 아니라 만들어져있는 것에 맞춰서 코드를 수정하거나 사용해야하는 과정이 너무 어렵네요..
차라리 새로 만드는 것이 아무래도 좀 더 쉽다고 생각됩니다.
내일은 또 어떤 기능을 만들어야할지 고민을 해봐야할 것 같습니다.