Text_Dungeon - TryParse(), XML 저장하기

Amberjack·2024년 1월 4일
0

TIL

목록 보기
11/83
post-custom-banner

📖 TIL - 24.01.04

오늘은 어제에 이어서 내배캠 개인 과제로 나온 콘솔 앱으로 던전 게임 만들기를 완성했다.

일단 코드를 다 작성하고 내가 생각할 수 있는 경우의 수를 확인해보았지만, 솔직히 자신은 없다.

그래도 이번에 C# 문법에서 배운 클래스나 사용자 정의 예외 처리를 사용해서 코드를 작성할 수 있었다.

작성할 때는 코드가 지저분하고 이게 맞는 건가 싶었지만 어쨌든 동작하는 것을 보니 굉장히 뿌듯하고 기분이 좋다. 마치 한동안 붙들고 있던 스도쿠 문제를 푸는 듯한 느낌... XML 파일이 정상적으로 읽기, 쓰기가 되는 것을 보고 카메라가 켜져있는데도 나도 모르게 신나서 고개를 끄덕여버렸다...

그건 그거고, 앞으로는 제목을 TIL이라 하지말까 고민 중이다. 내가 나중에 뭔가를 다시 찾아볼 때 힘들 것 같기 때문이다.

✨ 오늘 해결한 문제

오늘 작성한 코드 중에 두 개가 기억에 남는다.

📌 TryParse()

플레이어한테서 0 ~ 7 사이의 행동 값을 받아야 하는 상황에서 문제가 2가지 발생했다.

  1. 플레이어가 0 ~ 7 범위를 벗어나는 숫자를 입력할 경우
    해당 경우는 getBehavior()를 호출한 곳에서 if문을 통해 범위가 벗어났을 경우 재입력을 받는 식으로 해결했다.

  2. behavior는 int 값이지만, 플레이어가 숫자 이외의 값을 입력할 경우.
    예를 들어, 플레이어가 a를 누르면 int로 변환을 할 수 없기 때문에 에러가 발생했다.
    이 문제를 해결하기 위해 찾아봤더니, TryParse()를 사용하면 된다고 한다.

// 플레이어의 행동 입력 받기
static int getBehavior()
{
    int behavior;
    bool isNumeric;

    // 잘못된 입력 시 에러 메세지 출력
    while (true)
    {
        Console.WriteLine("\n원하시는 행동을 입력해주세요.");
        Console.Write(">> ");

        try
        {
            isNumeric = int.TryParse(Console.ReadLine(), out behavior);     // 입력 받은 값이 정수형 int 값인지 확인해서 맞을 경우 Parse 시켜주기
            if (!isNumeric) { throw new CheckInputException("잘못된 입력입니다.\n"); }  // 아닐 경우 에러 메시지 출력

            // 플레이어가 유효 범위의 행동 값 입력 시 while문 종료하고 행동 값 반환
            if (behavior >= 0 && behavior <= equipments.Length)
            {
                break;
            }
            else
            {
                throw new CheckInputException("잘못된 입력입니다.\n");
            }
        }
        catch (CheckInputException ex)
        {
            Console.ForegroundColor = ConsoleColor.DarkRed;
            Console.WriteLine(ex.Message);
            Console.ResetColor();
        }
    }

    return behavior;
}

bool isNumeric은 TryParse()의 결과값을 저장한다.

TryParse(문자열, out 변수)는 문자열이 해당 데이터형으로 변환 가능한지 확인한 후, 가능할 경우 out 변수를 통해 변환 값과 true를 리턴한다.
변환이 불가능할 경우 false를 리턴한다.

따라서 위의 코드의 경우,
isNumeric = int.TryParse(Console.ReadLine(), out behavior);

  1. int.TryParse가 동작하여 입력 받은 값이 정수형으로 변환 가능할 경우, 변환한 값을 behavior로, isNumeric은 true로 반환한다.
  2. 만약 거짓일 경우, isNumeric에 false를 반환하고 Parse를 하지 않는다.

정상적으로 작동한다! 😊

📕 xml 파일 저장하기

xml 파일을 읽고 쓰기를 통해 콘솔 앱이 종료되어도 데이터를 저장할 수 있도록 구현했다.

다른 팀원분은 엑셀을 사용한다고 하시던데... 아무튼 일단 xml 파일을 사용했다.
24.01.05 추가) 다른 팀원분이 작성하신 방법을 보았는데, json 파일을 사용하셨다!!!!
json을 까먹고 있었다니... 바보 그 자체인듯하다... ㅠㅠㅠㅠㅠㅠㅠㅠㅠ 다음에는 json을 사용하도록 하자

일단 xml 파일의 장점은 쉬운 편인 것 같다. 다른 포맷의 경우 복잡한 만큼 안전하거나 강력하겠지만, 코딩 뱁새인 나는 쉬운 걸로 하더라도 구현해보자라는 생각으로 xml을 선택했다.

// 플레이어 xml 파일 저장하기
static public void SetPlayerXml()
{
    XmlDocument xdoc = new XmlDocument();
    xdoc.Load(".\\Player.xml");     // Text_Dungeon.exe 기준 xml의 상대 경로. exe파일과 같은 위치에 xml 파일이 있을 경우 읽을 수 있다.

    XmlNodeList nodes = xdoc.GetElementsByTagName("Player");

    foreach (XmlNode e in nodes)
    {
        e.SelectSingleNode("level").InnerText = player.level.ToString();
        e.SelectSingleNode("baseAtk").InnerText = player.baseAtk.ToString();
        e.SelectSingleNode("baseDef").InnerText = player.baseDef.ToString();
        e.SelectSingleNode("Atk").InnerText = player.Atk.ToString();
        e.SelectSingleNode("Def").InnerText = player.Def.ToString();
        e.SelectSingleNode("Hp").InnerText = player.Hp.ToString();
        e.SelectSingleNode("gold").InnerText = player.gold.ToString();
        e.SelectSingleNode("isWeaponEquipped").InnerText = player.isWeaponEquipped.ToString();
        e.SelectSingleNode("isArmorEquipped").InnerText = player.isArmorEquipped.ToString();
        e.SelectSingleNode("dungeonClearCounter").InnerText = player.dungeonClearCounter.ToString();
    }

    xdoc.Save(".\\Player.xml");     // 플레이어 xml 파일 저장
}

어제 xml 읽기와 똑같다!!!

단지 이번에는 xml의 노드에 변수값을 ToString()으로 변환해서 넣었을 뿐이다.

그리고 마지막에 xdoc.Save(파일 경로)를 통해 저장하면 끝이다!

그리고 파일의 주소를 상대주소로 지정해서 실행 파일이 있는 폴더에 xml 파일을 넣으면 동작하도록 작성했다.

😊 오늘의 회고

일단 코드가 엉망진창인 것은 아직 초짜니까 라는 생각으로 위안을 삼고 있다...
그래도 800줄이 넘는 코드를 작성해서 일단은 요구사항대로 동작하는 것을 보니 뿌듯하다.
성취감을 느끼니 내가 뭐라도 되는 것 같다. 히히
내일 과제 해설 영상을 보면서 울고 있을지도 모르겠지만... 그래도 오늘은 기분이 좋다! 😊😊😊😊😊😊😊😊😊😊😊😊😊😊😊😊😊😊😊😊😊😊😊😊😊😊😊😊😊😊

post-custom-banner

1개의 댓글

comment-user-thumbnail
2024년 1월 5일

미니프로젝트 결과물의 서면 피드백이 나왔습니다. oh모르겠조 노션에 피드백 내용을 올렸으니 확인 부탁드립니다. :)

답글 달기