던전 배틀(Text 게임)
제가 듣는 스파르타 내일배움캠프의 이번 주 팀 프로젝트 주제입니다.
캐릭터를 만들어서 던전을 이용? 해서 몬스터도 잡고 레벨업도 하는 텍스트로 된 게임인데요.
필수 요구사항은 간단하게
스파르타 던전에 오신 여러분 환영합니다.
이제 전투를 시작할 수 있습니다.
- 상태 보기
- 전투 시작
원하시는 행동을 입력해주세요.
>>
이런 느낌으로 화면을 구성하고 전투 화면을 띄우도록 하는 거였습니다.
필수는 생각보다 구현하기 어렵지 않았습니다. 하지만 플레이어가 무슨 주먹만 들고
그 위험한 던전을 가는 미친사람은 아닐 거에요.
그래서 프로젝트의 선택 요구사항에는 정말 여러가지 기능들이 있었습니다.
스킬 기능 (난이도 - ★★★★☆)
기본 전투 화면
Battle!!
Lv.2 미니언 HP 15
Lv.5 대포미니언 HP 25
LV.3 공허충 HP 10[내정보]
Lv.1 Chad (전사)
HP 100/100
MP 50/50
- 공격
- 스킬
원하시는 행동을 입력해주세요.
>>
스킬 눌렀을 때
Battle!!
Lv.2 미니언 HP 15
Lv.5 대포미니언 HP 25
LV.3 공허충 HP 10[내정보]
Lv.1 Chad (전사)
HP 100/100
MP 50/50
- 알파 스트라이크 - MP 10
공격력 * 2 로 하나의 적을 공격합니다.- 더블 스트라이크 - MP 15
공격력 * 1.5 로 2명의 적을 랜덤으로 공격합니다.
0. 취소원하시는 행동을 입력해주세요.
>>
이렇게 표시를 해줘야 되더라구요 캐릭터 마다 직업도 있고 해서
그냥 직업마다 클래스로 만들어서 기본 스탯이랑 스킬들을 만들어주자! 라고 생각했습니다.
하지만 이게 만드는게 쉽지 않더라구요.
public List Skills { get; set; } = new List();
그래서 캐릭터 클래스에 스킬 칸 챡 만들어주고 여기에 직업 정할 때 할당해주면 되겠구나 했습니다.
근데 이게 웬걸 저장을 할 때 json 파일로 저장을 하는데 순환 참조가 일어나더라구요.
순환 참조
제가 json으로 저장을 구현해보는 것도 모르고 이게 어떻게 저장되는지도 모르다보니,
그냥 오류가 나는 저장 부분을
[JsonIgnore]
저걸로 저장을 안시키는 파일로 만들어버리고 다시 다른 함수에서 초기화를 시켜서
기능은 잘 동작했지만 찝찝함이 사라지지 않았습니다.
너무 궁금해서 튜터님에게 자문을 구해보니 이건 순환참조가 일어날 수 밖에 없이 짜져있다
라고 하셨습니다.
그게 무엇이냐
일단 저 캐릭터 클래스가 가지는 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에 대해서도 좀 알게 되었고 다음에는 순환 참조나 이런 오류가 발생하지 않도록
데이터 사용 방법을 좀 잘 짜보도록 하겠습니다.
기억 할 것
객체 (Object): 중괄호 {}로 표현되며, 이름과 값의 쌍으로 이루어져 있음
{
"이름": "값",
"나이": 25,
"성별": "남성"
}
배열 (Array): 대괄호 []로 표현되며, 여러 값을 순서대로 나열
[
"사과",
"바나나",
"오렌지"
]
3.값 (Value): 문자열, 숫자, 불리언, 객체, 배열, null 등의 값이 사용 될 수 있음
{
"이름": "홍길동",
"나이": 17,
"좋아하는_색상": "초록색",
"가족들": ["어머니", "동생"],
"결혼여부": false,
"자산": null
}
진행 사항
09:00 ~ 10:00 : 알고리즘 코드카타
10:00 ~ 10:30 : 팀 회의
10:30 ~ 14:00 :
12시-1시: 점심식사
14:00 ~ 18:00
6시-7시: 저녁식사
19:00 ~ 20:00 : 집중 코딩 시간 부족한 부분 해결해보기
20:00 ~ 21:00: TIL 작성, 마무리 회고 진행
21:00 : 내일은 위한 휴식!