-
오예 ~ 오예 ~
방금 어떻게 할지 고민이던 것을 해결했습니다~
기분이 너무 좋네요 ㅎㅎ.
어제 시작한 팀 과제를 팀장님께서 본인이 하신 개인과제를 베이스로 정리해서 주셨습니다.
오전에 특강이랑 팀 과제 발제가 있었고, 오후에 팀장님께서 베이스 정리하시느라 간단한 것들을 선택해서 구현했습니다.
새로 구현하는게 아니라 이미 구현된 걸 가지고 다시 고치는 것이다 보니깐 어제 어떻게 적어야할지 모르겠더라구요.
오늘 새로운 것을 정리하면서 어느정도 파악이 완료되서 어제 했던 것까지 추가해서 정리해보려고 합니다.
필수 요구사항
1. 게임 시작 화면 : 슬랙에 어떤 분이 영어를 특수문자로 바꿔주는 사이트를 올려주셨습니다. 덕분에 이쁘게 만들었습니다.
Console.ReadKey() : 입력 값에 상관없이 입력이 되면 다음 함수로 넘어감.
2. 상태 보기 : 개인 과제에서 있었던 부분입니다. 캐릭터 생성하면서 같이 만들었습니다.
3. 전투 시작 : 팀원분께서 제작해주셨습니다.
선택 요구사항
1. 캐릭터 생성 기능 : 이름을 받아서 생성합니다. 게임 시작 화면 이후에 이름을 받도록 합니다. 개인 과제에서 추가했던 부분이기도 해서 선택하게 되었습니다.
character.Name = SetCharacter() : 입력된 값을 return하여 Name에 입력해줍니다.
2. 직업 선택 기능 : 캐릭터 생성 기능과 비슷할 것 같아서 같이 진행하려 했지만 팀원분이 선택하셔서 제작하지 않았습니다.
3. 스킬 기능, 4. 치명타 기능, 5. 회피 기능 : 팀원분께서 제작해주셨습니다.
6. 레벨업 기능 : 던전 즉, 전투 기능이 완성되어야지만 가능한 기능이라서 기본을 먼저 잡아 준 후에 던전 생성을 팀원분께서 해주셔서 작동이 가능해졌습니다.
public Player() { levelexp = 0; levelup[0] = 10; levelup[1] = 25; } public void LevelUp(int exp) { int prev_level = level; levelexp += exp; if(levelexp >= levelup[0]) { level += 1; levelexp = 0; int sum = levelup[0] + levelup[1]; levelup[0] = levelup[1]; levelup[1] = sum; } } private void Result() { Console.WriteLine("Victory"); player.LevelUp(stage_exp); }
기본적으로 경험치 0에서부터 시작하여 1레벨 업에 필요한 경험치를 10으로 설정해주고 2레벨 업에 필요한 경험치를 25로 설정해주었습니다.
필요한 경험치를 배열[2]로 생성해서 레벨 업할 때마다 필요한 경험치 인덱스를 한칸 앞으로 옮기고 빈 자리는 두 개의 값을 더한 값으로 채워주었습니다. 그리고 가지고 있는 경험치를 0으로 초기화시켜줘서 레벨이 올라갈 수록 레벨 업을 하기 힘들게 만들어주었습니다.
던전을 클리어할 때 몬스터가 주는 경험치를 입력받도록 설정했습니다.
7. 보상 추가 : 팀원분께서 해주고 계십니다.
8. 콘솔 꾸미기 : EditText를 만들어두었습니다. 거의 다 완성될 때 쯤에 제가 할 예정입니다.
9. 몬스터 종류 추가해보기 : 생각나는대로 다같이 추가하고 있습니다. 틀은 팀장님이 만들어두셨던걸로 기억합니다.
10. 아이템 적용 : 이건... 개인 과제에서 했는데!!! 팀장님께서 만드신 개인과제가 베이스이기 때문에 쉬울줄 알았지만 어려웠던 ... 부분이었습니다. 이게 바로 팀플에서 서로 코드를 합치는 것이 어려운 이유이지 않을까 싶습니다.
팀장님 코드 베이스에는 상점은 없었고 인벤토리만 있었던 상황입니다. 따라서 아이템을 얻기위해서는 던전에서 드랍되거나 상점에서 구매해야했기 때문에 상점을 먼저 만들어주었습니다.
public Item BuyItem(int number, ItemList itemlist, int playergold) { Item item = itemlist.GetItem(number); while (true) { if (!item.GetSale()) { Console.WriteLine("이미 구매하신 아이템입니다."); } else { if (playergold < item.Price) { Console.WriteLine("보유하신 골드가 부족합니다."); } else { item.SetSale(); break; } } Console.WriteLine("다시 입력해 주세요."); Console.Write(">>"); string select = Console.ReadLine(); int Renumber; bool check = int.TryParse(select, out Renumber); if (check) { if (Renumber == 0) { item = null; break; } else { item = BuyItem(Renumber, itemlist, playergold); break; } } else { BuyItem(number, itemlist, playergold); } break; } return item; }
while(true)를 이용해서 무한 루프를 만들었습니다.
그래서 중간에 있는 break;를 사용해주는 것이 가장 중요했습니다.
생각하는 것은 쉽긴한데 무한 루프 문을 이용해서 입력가능한 숫자를 입력할 때까지 설정하는 것이 생각보다 어려웠습니다.
꼭 써야한다는 아니지만 한 번쯤 무한루프문을 써볼만한 것 같습니다.
중요한 건 상점이 아닙니다. 인벤토리입니다.
//인벤토리에 있는 아이템 장착 확인 private bool AddEquipedTem(ItemType type, Item item) { if (equipedTem.ContainsKey(type) && equipedTem[type] != item) //장착된게 있고, 현재 장착하고 있는 것과 다르면! { equipedTem[type].SetEquip(); //원래 끼고 있던 아이템 장착 해제 item.SetEquip(); //장착 return true; } else if (equipedTem.ContainsKey(type) && equipedTem[type] == item) //장착이 되어있고, 현재 장착한 것과 같으면! { item.SetEquip(); //장착 해제 return false; } else //장착된게 없으면! { item.SetEquip(); return true; } } //스탯 반영 public void SetPlayerSpec(ItemType type, Item item, Player player) { bool check = AddEquipedTem(type, item); int spec = 0; if (type == ItemType.WEAPON) { if (check) { if (equipedTem.ContainsKey(type)) { spec = equipedTem[type].GetSpec; equipedTem.Remove(type); //없앰 } equipedTem.Add(type, item); //선택한거 추가 player.PlusAttack = item.GetSpec; player.CheckAttack = true; } else { spec = equipedTem[type].GetSpec; equipedTem.Remove(type); //없앰 player.PlusAttack = 0; player.CheckAttack = false; } player.Attack -= spec; player.Attack += player.PlusAttack; } else { if (check) { if (equipedTem.ContainsKey(type)) { spec = equipedTem[type].GetSpec; equipedTem.Remove(type); //없앰 } equipedTem.Add(type, item); //선택한거 추가 player.PlusDefence = item.GetSpec; player.CheckDefence = true; } else { spec = equipedTem[type].GetSpec; equipedTem.Remove(type); //없앰 player.PlusDefence = 0; player.CheckDefence = false; } player.Defence -= spec; player.Defence += player.PlusDefence; } }
만들어두신 것은 AddEquipedTem으로 딕셔너리의 Key, Value를 이용해서 착용되어있는 아이템을 관리하신 것 같습니다.
Key는 아이템 타입으로 방어구, 무기가 있습니다. 따라서 다른 아이템이지만 같은 아이템 타입이라면 Key값이 동일해지기 때문에 같은 아이템 타입을 두 개 이상 착용하지 못하도록 만드셨습니다.
근데! 착용을 하고 있던 걸 해제하고, 새로 착용 추가하고는 좋은데! 이걸 스탯이랑 반영이 안되서.. 어떻게 해야하나 생각이 많았습니다.
아예 뜯어 고쳐서 원래 제가 했던 코드대로 바꿀까 싶었지만 아예 만드는 방식이 달랐어서.. 어쩔 수 없이 새로운 함수를 만들었습니다.
팀장님이 만드신 원래 함수는 bool로 바꿔서 착용하고 있는지 착용하고 있지 않은지!를 확인하는 함수라면, 제가 만든 함수는 착용하던걸 해제한건지! 처음 착용인건지! 같은 타입에 다른 아이템을 선택했는지! 를 확인하고 그에 맞는 아이템에 있는 스탯 값을 플레이어한테 적용시키는 함수입니다.
원래 개인 프로젝트에서 플레이어를 받아서 만들어서 그랬는지 여기서도 플레이어를 받아서 사용하게 되었습니다.
제 머리로는 플레이어를 안받고 하는 법이 번뜩하고 나오지 않네요.
11. 회복 아이템 : 처음 3개 가지고 있고 개당 30씩 회복 가능한 포션입니다.
이거 .... 직업 선택에 따라 체력이 달라서 고쳤는데 적용을 안하셨나봅니다. 내일 다시 고쳐야할 것 같네요.
12. 스테이지 추가 : 팀원분이 해주셨습니다.
13. 게임 저장하기 : 아직 안했습니다. 누가할지는 모르겠지만 저는 안할 것 같습니다.
14. 나만의 기능을 만들어보기 : 다른 선택 요구사항이 다 완성되면 추가하지 않을까 싶습니다.
어제는 간단한 것을 했다면 오늘은 아이디어가 떠오르지 않아서 너무 헤맸습니다..
내일은 포션 수정하고 선택 요구사항에서 선택해서 기능 만들지 않을까 싶습니다.