오늘은 4주차 과제 뿌시는 날 ~.~
스크롤 압박? 공포? 뭐 암튼? 주의?
static void Main(string[] args)
{
Console.Title = "Welcome to Text RPG!";
Console.Write("Player 닉네임을 입력해주세요 : ");
playerName = Console.ReadLine();
player = new Player(playerName, PLAYER_HP, PLAYER_SHIELD, PLAYER_POWER, 500, 0, new List<Item>());
UpdatePlayerInfo();
bool isGameOver = false;
while (!isGameOver)
{
Console.Clear();
UpdatePlayerInfo();
switch (playState)
{
case 0:
SelectPlayState();
break;
case 1:
Hunting();
break;
case 2:
OpenItemInventory();
break;
case 3:
OpenStore();
break;
case 4:
EndGame();
isGameOver = true;
break;
}
}
}
static void UpdatePlayerInfo()
{
Console.WriteLine();
Console.WriteLine("닉네임 {0}\t체력 {1}\t보호구 체력 {2}\t공격력 {3}\t$ {4}\t경험치 {5}",
player.Name,
player.HP,
player.Shield,
player.Power,
player.Money,
player.Exp);
}
static void SelectPlayState()
{
Console.WriteLine();
Console.WriteLine("1: 사냥하기\t2: 아이템 인벤토리 열기\t 3: 상점 열기\t4: 게임 종료");
Console.Write("플레이를 선택하세요 : ");
playState = getPlayerSelect(1, 4);
}
static int getPlayerSelect(int start, int end)
{
int select = 0;
bool isNum = false;
while (true)
{
isNum = int.TryParse(Console.ReadLine(), out select);
if (!isNum || (select < start || select > end))
{
Console.WriteLine("잘못된 선택입니다. 다시 고르세요");
}
else break;
}
return select;
}
static void Hunting()
{
while (playState == 1)
{
if (monsterList.Count == 0)
{
UpdateMonsterList();
}
else
{
Console.WriteLine();
Console.WriteLine("사냥을 시작합니다!");
foreach (Monster monster in monsterList)
{
Console.WriteLine();
Console.WriteLine("앗! 야생의 {0}이(가) 나타났다!", monster.Name);
while (monster.HP > 0 && player.HP > 0)
{
Thread.Sleep(700);
Console.WriteLine();
player.Attack(monster.Name);
monster.HP -= player.Power;
int monsterAttack = new Random().Next(0, 5);
if (monsterAttack == 1)
{
Console.WriteLine();
monster.Attack();
if (player.Shield > 0)
{
if (player.Shield - (int)(monster.Power * PLAYER_SHIELD_REDUCE) >= 0)
{
player.Shield -= (int)(monster.Power * PLAYER_SHIELD_REDUCE);
} else
{
int restDamage = monster.Power - (player.Shield * 2);
player.Shield = 0;
player.HP -= restDamage;
}
} else
{
player.HP -= monster.Power;
}
UpdatePlayerInfo();
Thread.Sleep(500);
}
}
Thread.Sleep(700);
if (monster.HP <= 0)
{
Console.WriteLine();
Console.WriteLine("{0}을(를) 처치했습니다!", monster.Name);
Console.WriteLine("경험치 {0}을(를) 얻었습니다!", monster.Exp);
player.Exp += monster.Exp;
player.Money += monster.Reward;
huntedMonsterCnt++;
}
else if (player.HP <= 0)
{
Console.WriteLine();
Console.WriteLine("{0}이(가) 사망했습니다!", player.Name);
playState = 4;
Thread.Sleep(800);
return;
}
}
Console.WriteLine();
Console.WriteLine("1: 계속 진행\t0: 사냥 종료");
int select = getPlayerSelect(0, 1);
if (select == 0)
{
playState = 0;
} else
{
monsterList = new List<Monster>();
Console.Clear();
UpdatePlayerInfo();
}
}
}
}
static void UpdateMonsterList()
{
Console.WriteLine();
Console.WriteLine("새로운 몬스터를 생성합니다!");
for (int i = 0; i < 5; i++)
{
int monsterType = new Random().Next(0, 3);
switch (monsterType)
{
case 0:
monsterList.Add(new Slime(SLIME_NAME, SLIME_HP, SLIME_POWER, SLIME_REWARD, SLIME_EXP));
break;
case 1:
monsterList.Add(new Boar(BOAR_NAME, BOAR_HP, BOAR_POWER, BOAR_REWARD, BOAR_EXP));
break;
case 2:
monsterList.Add(new Toadstool(TOADSTOOL_NAME, TOADSTOOL_HP, TOADSTOOL_POWER, TOADSTOOL_REWARD, TOADSTOOL_EXP));
break;
}
}
}
static void OpenItemInventory()
{
while (playState == 2)
{
if (player.GetItemCount() == 0)
{
Console.WriteLine();
Console.WriteLine("보유하고 있는 아이템이 없습니다!");
Console.WriteLine("인벤토리를 닫습니다");
Thread.Sleep(2000);
playState = 0;
break;
}
Console.WriteLine();
Console.WriteLine("{0}의 아이템 인벤토리", player.Name);
player.OpenItemInventory();
Console.WriteLine();
Console.WriteLine("1: 아이템 사용\t0: 인벤토리 닫기");
Console.Write("선택: ");
int select = getPlayerSelect(0, 1);
if (select == 0)
{
playState = 0;
}
else
{
Console.WriteLine();
Console.Write("아이템 번호 선택: ");
int itemIdx = getPlayerSelect(1, player.GetItemCount()) - 1;
player.UseItem(itemIdx);
Thread.Sleep(1000);
Console.Clear();
UpdatePlayerInfo();
}
}
}
static void OpenStore()
{
while (playState == 3)
{
if (storeItemList.Count == 0)
{
UpdateStore();
}
else
{
Console.WriteLine();
Console.WriteLine("상점 아이템 목록");
int idx = 1;
foreach(Item item in storeItemList)
{
Console.WriteLine("{0}. 종류 {1}\t효능 +{2}\t가격 {3}", idx, item.Name, item.Value, item.Price);
idx++;
}
Console.WriteLine();
Console.WriteLine("1: 아이템 구매\t2: 상점 업데이트\t0: 상점 나가기");
Console.Write("선택: ");
int select = getPlayerSelect(0, 2);
switch (select)
{
case 0:
playState = 0;
break;
case 1:
BuyItem();
Thread.Sleep(1000);
Console.Clear();
UpdatePlayerInfo();
break;
case 2:
storeItemList = new List<Item>();
break;
}
}
}
}
static void UpdateStore()
{
Console.Clear();
UpdatePlayerInfo();
Console.WriteLine();
Console.WriteLine("상점을 업데이트합니다!");
for (int i = 0; i < 5; i++)
{
int potionType = new Random().Next(0, 3);
switch (potionType)
{
case 0:
int[] randomHPValues = randomValueAndPrice(HP_MIN_VALUE, HP_MAX_VALUE, HP_MIN_PRICE, HP_MAX_PRICE);
storeItemList.Add(new HealthPotion(HP_NAME, HP_TYPE, randomHPValues[0], randomHPValues[1]));
break;
case 1:
int[] randomMPValues = randomValueAndPrice(MP_MIN_VALUE, MP_MAX_VALUE, MP_MIN_PRICE, MP_MAX_PRICE);
storeItemList.Add(new ManaPotion(MP_NAME, MP_TYPE, randomMPValues[0], randomMPValues[1]));
break;
case 2:
int[] randomSPValues = randomValueAndPrice(SP_MIN_VALUE, SP_MAX_VALUE, SP_MIN_PRICE, SP_MAX_PRICE);
storeItemList.Add(new ShieldPotion(SP_NAME, SP_TYPE, randomSPValues[0], randomSPValues[1]));
break;
}
}
}
static int[] randomValueAndPrice(int minValue, int maxValue, int minPrice, int maxPrice)
{
int value = new Random().Next(minValue, maxValue);
int price = new Random().Next(minPrice, maxPrice);
return new int[] { value, price };
}
static void BuyItem()
{
Console.WriteLine();
Console.Write("구매할 아이템 번호를 입력하세요: ");
int itemIdx = getPlayerSelect(1, storeItemList.Count) - 1;
Item selectedItem = storeItemList[itemIdx];
if (player.Money < selectedItem.Price)
{
Console.WriteLine("돈이 부족해 구매할 수 없습니다! 몬스터를 사냥해서 돈을 모으세요!");
} else
{
Console.WriteLine("{0}을(를) 구매했습니다.", selectedItem.Name);
player.BuyItem(selectedItem);
storeItemList.Remove(selectedItem);
}
}
static void EndGame()
{
Console.WriteLine();
Console.WriteLine("게임을 종료합니다!");
Console.WriteLine("사냥한 몬스터 수 {0}", huntedMonsterCnt);
Console.WriteLine("{0}의 경험치 {1}", player.Name, player.Exp);
}
요기서 확인
GitHub Text RPG Game
머.. RPG를 해본 적이 없어서 이렇게 하는게 맞는진 모르겠지만 아무튼 뭐 구현했다~!
추가로 구현해볼 것들은 일단 내일 개인 과제가 나와서 그거 먼저 끝내고 시간 남으면 시도해볼 듯!
그리고 외면하고 있던 3주차 과제 블랙잭 게임에서 스플릿도 함...구현해봐야지....ㅔ..........
오늘은 하루종일 4주차 과제만 하다가 끝났다!!!
아침에 어제 들은 4주차 강의 정리본 깃허브 README에 추가해놓고 그 뒤로 쭉 설계하고 구현하고..
어제 튜터님한테 질문했던 내용 정리하다가 질문할거 또 생각나서 갔다왔당
아무래도 운영체제는 적당히만 알면 될 듯 .. 힝
전공 중에 젤 열심히 한게 운영체제인데 .... ! 크흡
그리고 3주차 스네이크 게임 단일 스레드로 구현하신 분이 계시길래 질문하러 또 총총 갔다왔다
갑자기 불쑥 방문했는데 친절하게 알려주셔서 감사했음! 와! 좋은 분!
처음에 멀티 스레드로 하셨다가 딜레이 때문에 단일 스레드로 바꾸셨다고 했는데, 되게 참신한 방법이어서 놀랐음
코드 설명 듣고 파이팅 외치고 다시 돌아와서 TIL 작성했당
암튼 오늘은 여기까지
끗 ~
인줄 알았는데 아니 진짜 황당하네 .
강의 자료 노션에 요구사항 있다고 말 안 하셨잖아요...............
졸지에 그냥 맨땅에 구현한 사람 됨
머임?
내가..블랙잭 규칙 이해한다고...얼마나 힘들었는데......
허탈