[C#]TIL (28) | 2023.08.31 | 던전 배틀 (Text 게임)

kjg5370·2023년 8월 31일
0

TIL

목록 보기
28/91
post-thumbnail

들어가기 앞서

드디어 길고 긴 팀 프로젝트가 끝나 갑니다.
내일이면 드디어 다른 사람이 얼마나 미친 작품들을 만들었는지 구경할 수 있겠네요.
제가 속한 팀은 따로 기능 구현 파트를 나누지 않고 일단 필수기능은 다 만들어보고
추가적으로 만들 수 있는 것들 만들어보자! 해서 일주일동안 제가 할 수 있을것 같은
기능들을 만들어 보았습니다.

코드를 짜다 보니 기능을 구현하려고 여러 군데의 함수에 조금씩 손대다보니 제가 추가한게 무엇인지
지금 어느 부분이 잘못되고 또 중복되고 있는지 찾는 게 정말 어지러웠습니다.
그래도 오류없이 기능이 돌아가는 걸 보니 뿌듯하더라구요.
물론 잘 짠건 같지는 않지만 좀 더 노력하면 언젠가는 효율적인 코드를 짤 날이 오지 않을까요?!

오늘 배운 것

  • 던전 배틀(Text 게임)
    제가 듣는 스파르타 내일배움캠프의 이번 주 팀 프로젝트 주제입니다.
    캐릭터를 만들어서 던전을 이용? 해서 몬스터도 잡고 레벨업도 하는 텍스트로 된 게임인데요.

    필수 요구사항은 간단하게

    스파르타 던전에 오신 여러분 환영합니다.
    이제 전투를 시작할 수 있습니다.

    1. 상태 보기
    2. 전투 시작

    원하시는 행동을 입력해주세요.
    >>

    이런 느낌으로 화면을 구성하고 전투 화면을 띄우도록 하는 거였습니다.
    필수는 생각보다 구현하기 어렵지 않았습니다. 하지만 플레이어가 무슨 주먹만 들고
    그 위험한 던전을 가는 미친사람은 아닐 거에요.

    그래서 프로젝트의 선택 요구사항에는 정말 여러가지 기능들이 있었습니다.

  1. 스킬 기능 (난이도 - ★★★★☆)

    • 기본 전투 화면

      Battle!!

      Lv.2 미니언 HP 15
      Lv.5 대포미니언 HP 25
      LV.3 공허충 HP 10

      [내정보]
      Lv.1 Chad (전사)
      HP 100/100
      MP 50/50

      1. 공격
      2. 스킬

      원하시는 행동을 입력해주세요.
      >>

    • 스킬 눌렀을 때

      Battle!!

      Lv.2 미니언 HP 15
      Lv.5 대포미니언 HP 25
      LV.3 공허충 HP 10

      [내정보]
      Lv.1 Chad (전사)
      HP 100/100
      MP 50/50

      1. 알파 스트라이크 - MP 10
        공격력 * 2 로 하나의 적을 공격합니다.
      2. 더블 스트라이크 - MP 15
        공격력 * 1.5 로 2명의 적을 랜덤으로 공격합니다.
        0. 취소

      원하시는 행동을 입력해주세요.
      >>

    이렇게 표시를 해줘야 되더라구요 캐릭터 마다 직업도 있고 해서
    그냥 직업마다 클래스로 만들어서 기본 스탯이랑 스킬들을 만들어주자! 라고 생각했습니다.
    하지만 이게 만드는게 쉽지 않더라구요.

    public List Skills { get; set; } = new List();

    그래서 캐릭터 클래스에 스킬 칸 챡 만들어주고 여기에 직업 정할 때 할당해주면 되겠구나 했습니다.
    근데 이게 웬걸 저장을 할 때 json 파일로 저장을 하는데 순환 참조가 일어나더라구요.

  • 순환 참조
    제가 json으로 저장을 구현해보는 것도 모르고 이게 어떻게 저장되는지도 모르다보니,
    그냥 오류가 나는 저장 부분을

    [JsonIgnore]

    저걸로 저장을 안시키는 파일로 만들어버리고 다시 다른 함수에서 초기화를 시켜서
    기능은 잘 동작했지만 찝찝함이 사라지지 않았습니다.

    너무 궁금해서 튜터님에게 자문을 구해보니 이건 순환참조가 일어날 수 밖에 없이 짜져있다
    라고 하셨습니다.

    그게 무엇이냐
    일단 저 캐릭터 클래스가 가지는 Skill 클래스를 알아봐야 됩니다.

    • Skill 클래스
      public class Skill
            {
                public string Name { get; set; }
                public int MPCost { get; set; }
                public string Description { get; set; }
                public bool isMunti { get; set; }
                public Action<Character,Monster> SingleAction { get; set; }
                public Action<Character, List<Monster>> MultipleAction { get; set; }
            }

    스킬은 이런식으로 SingleAction, 과 MultipleAction 에서 Character 클래스를 가져오도록 해놨는데 이러다보니

캐릭터가 저장이 될 때 캐릭터 안에 있는 스킬이 캐릭터를 부르고 그 캐릭터 안에 있는 스킬이 또 캐릭터를 가져오는 반복이
일어난 겁니다. 아마 궁금해 하지 않았다면 모르는 채로 넘어 갈 뻔 했네요 튜터님 감사합니다 ^^b

그래서 튜터님이 추천해주신 방법은
캐릭터에 관한 데이터를 저장할 때 캐릭터 마다 고유의 번호를 설정.
그리고 스킬을 사용할 때 그 캐릭터의 번호를 불러서 정보를 사용하는 겁니다.

그렇게 데이터를 사용할 때 직접적인 본체나 그런것들(?) 을 (무거울 수 도 있으니)
직접 넣는게 아니라 거기의 한 부분 (구분할 수 있는) 그걸 가져와서 사용하는 게
많이 사용하는 방법이다라고 알려주셨습니다.

json에 대해서도 좀 알게 되었고 다음에는 순환 참조나 이런 오류가 발생하지 않도록
데이터 사용 방법을 좀 잘 짜보도록 하겠습니다.

기억 할 것 & 진행 사항

기억 할 것

  • JSON
    데이터를 효과적으로 표현하고 교환하기 위한 경량의 데이터 형식.
    주로 서버와 클라이언트 간 데이터 교환 및 저장에 사용됨.
    사람과 기계 모두 이해하기 쉽도록 설계되었으며, 텍스트 형식을 기반으로 함.
  1. 객체 (Object): 중괄호 {}로 표현되며, 이름과 값의 쌍으로 이루어져 있음

    {
    "이름": "값",
    "나이": 25,
    "성별": "남성"
    }

  2. 배열 (Array): 대괄호 []로 표현되며, 여러 값을 순서대로 나열

    [
    "사과",
    "바나나",
    "오렌지"
    ]

    3.값 (Value): 문자열, 숫자, 불리언, 객체, 배열, null 등의 값이 사용 될 수 있음

    {
    "이름": "홍길동",
    "나이": 17,
    "좋아하는_색상": "초록색",
    "가족들": ["어머니", "동생"],
    "결혼여부": false,
    "자산": null
    }

진행 사항

  • 팀 프로젝트 마무리
  • 현재 진행 사항 팀원들과 공유
  • 부족했던 부분 보완

내일 할 일

  • 하루 계획
    • 오전
      • 09:00 ~ 10:00 : 알고리즘 코드카타
      • 10:00 ~ 10:30 : 팀 회의
      • 10:30 ~ 14:00 :
        • 오늘 계획 (Task)
          • 팀 프로젝트 제출 (9월 1일 오후 12시까지)
      • 12시-1시: 점심식사
    • 집중 코딩
      • 14:00 ~ 18:00
    • 저녁
      • 6시-7시: 저녁식사
      • 19:00 ~ 20:00 : 집중 코딩 시간 부족한 부분 해결해보기
      • 20:00 ~ 21:00: TIL 작성, 마무리 회고 진행
      • 21:00 : 내일은 위한 휴식!
profile
학생입니다

0개의 댓글