오늘은 휴식 기능과 레벨업 기능을 구현했고, 자잘한 수정을 했다.
여관 클래스를 만들고 플레이어의 체력을 조건부로 회복해주는 기능을 구현했다.
public void ShowInn()
{
Console.Clear();
Console.WriteLine(
" :*@#: @%##@* \r\n" +
" -##- -##=@= ## \r\n" +
" .=%*: .*@*. ## \r\n" +
" :*%+. .=%*%# \r\n" +
" -#%- -#%- \r\n" +
" =%*: :*%=. \r\n" +
" .+%+. .+%*. \r\n" +
"*@@#############################@@*\r\n" +
" .@- -@: \r\n" +
" .@- -+==+= :@: \r\n" +
" .@- ##::+@ -@: \r\n" +
" .@- #* =@ @%####@:-@: \r\n" +
" .@- #* =@ @+ .@-:@: \r\n" +
" .@- *%###% @= :@--@: \r\n" +
" .@- @= :@-:@: \r\n" +
" .@- @+ :@-:@: \r\n" +
" .@=:::::::::::@*:::-@==@: \r\n");
Console.WriteLine("================ 여관에서 휴식하기 ================");
Console.WriteLine($"500 Gold를 내면 여관에서 체력을 회복할 수 있습니다. \n(보유 골드 : {player.Gold})");
Console.WriteLine("==================================================");
}
public void ShowInnMenu()
{
Console.WriteLine("\n1. 휴식하기");
Console.WriteLine("0. 나가기");
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">> ");
}
public void SelectMenu(string playerInput, ref Scenes scene)
{
switch (playerInput)
{
case "0": // 마을로 나가기
scene = Scenes.Town;
break;
case "1": // 휴식 시도
Rest(player, ref scene);
break;
}
}
Rest
함수를 호출한다.public void Rest(Player player, ref Scenes scene)
{
//현재 체력이 100이면
if(player.Hp >= 100)
{
Console.WriteLine("\n체력이 이미 100입니다.");
Console.Write("아무 키나 입력하세요...");
Console.ReadLine();
}
//골드가 500이상이면 휴식 성공
else if (player.Gold >= 500)
{
player.Hp = 100;
player.Gold -= 500;
ShowRest();
}
//골드 500미만이면 장면 Town으로 전환
else
{
scene = Scenes.Town;
ShowKicked();
}
}
체력이 100이면 휴식을 취하지 않고 돌아간다.
체력이 100 미만이고 500골드 이상 소지하고있으면 플레이어의 Hp에 100을 할당하고 500골드를 감소시킨다.
500골드 미만이면 장면을 Town으로 전환해버려서 내쫓는다.
던전을 클리어 한 횟수에 따라서 레벨업 하는 기능을 구현했다.
public class Player
{
public void LevelUp()
{
//레벨 만큼 클리어하면
//레벨 + 1, 공격력 +0.5, 방어력 +1
if(Level <= ClearCount)
{
ClearCount = 0;
++Level;
Attack += 0.5f;
++Defence;
ShowLevelUp();
}
}
}
원래는 플레이어를 싱글톤으로 만들고 운영했었다.
public class Player
{
private static Player instance;
public static Player Instance
{
get
{
if (instance == null)
instance = new Player();
return instance;
}
}
}
이렇게 싱글톤 패턴을 적용해놓은 후에 다른 클래스에서 정적 멤버를 호출하는 방식을 사용했는데,
그냥 의존성 주입으로 전달해줘도 될 것 같다는 생각이 들어서 변경해주었다.
class Game
{
private Scenes scene = Scenes.Town;
private Player player;
private Store store;
private Inventory inventory;
private Dungeon dungeon;
private Inn inn;
public Game()
{
player = new Player();
store = new Store(player);
inventory = new Inventory(player);
dungeon = new Dungeon(player);
inn = new Inn(player);
player.Inventory = inventory;
}
}
이렇게 Player 객체를 만들고 다른 클래스들의 생성자로 넘겨주었다.
스택 오버플로우 문제도 이렇게 하면 생각할 것도 없었는데,,,
게임을 끝내는 기능이 없었다.
그래서 추가해주었다.
Environment.Exit(0);
이 메서드를 호출해서 프로그램이 끝나도록 만들었다.
간단.
오늘은 팀 내부에서 자체적으로 각자 여태까지 한 결과물을 설명해보는 시간을 가졌고, 서로의 코딩 스타일이나 아이디어를 볼 수 있는 아주 좋은 시간이 됐다.
피곤해서 안고치고 넘어갈 뻔한 부분도 팀장님이 알려주셔서 고칠 수 있었다. (ㅎㅎ)
그리고 생각보다 코딩 스타일들이 다 달라서 다음 주의 팀 프로젝트 일정이 조금은 걱정이 되지만, 조율해나가는 경험은 성장에 도움이 될 것이라고 생각한다.
개인적으로는 남의 코드를 읽는 것이 세상에서 제일 어려운 것 중에 하나이다.
오늘 팀원분들이 써놓은 코드는 당연히 바로 이해하지 못했지만 같이 쓰인 주석을 보며 더듬더듬 이해할 수 있었다.
협업을 위해서는 이해하기 좋은 주석의 작성이 정말로 중요하다는 것을 다시금 느꼈다.
주말에는 시간이 비면 List나 접근제한자를 알아보고 간단히 글을 쓸 예정이다.
TextRPG 개인 프로젝트 깃허브 : https://github.com/ChocoMucho/TextRPG-Personal-Project