TextRPG - 저장 구현
- 100 powerun
- 4월 15일
- 3분 분량
최종 수정일: 4월 16일
오늘은 비쥬얼 스튜디오를 이용해 저장과 불러오기를 구현해 보았습니다.
경고! - 해당 저장 방법은 보안이 매우 취약합니다!!!!
아래의 내용은 저장을 구현하기 위한 아주 간단한 조치입니다. 만약 게임을 만들고자 한다면 아래의 방법이 아닌 암호화/복호화 할 수 있는 방법이나, DB등을 사용하여 저장하는 것이 좋습니다!
저장-save

해당 코드는 TextRPG(TRPG는 Tabletop Role Playing Game의 줄임말이기에 사용하지 않습니다) 게임의 형태를 띄우고 있습니다. 시작 시 currData가 존재하지 않는다면 처음 이를 없다 생각하여 초기 화면의 상태가 됩니다.
PlayerData
playerData는 플레이어가 가지고 있어야할 기본적인 스탯에 관한 데이터들이 있습니다. 현재는 저장, 불러오기만을 만들기 위해 이름, 체력, 레벨, 경험치 이렇게만 존재합니다.

이곳은 핵심 기능들이 수행하는 곳으로 위에서 보이는 대로
새로 시작하기
게임 불러오기
저장하기
0. 게임 종료
이렇게 되어있습니다. 이 중에서 우선 StartNewGame에 대해 먼저 살펴보겠습니다.
StartNewGame

우선 처음 게임을 시작하면 이 화면을 먼저 보게 될 것 입니다. 우선 이 게임에는 최대 3개의 저장공간이 있습니다. 1~3의 재대로 된 값을 입력했다면 해당 칸에 저장할지 확인하는 메세지를 띄우게 됩니다. 확인은 Y또는 N으로 입력되고 대소문자 상관없이 받아내어 플레이어에게 확인을 받습니다.

확인을 받았다면 처음 플레이어 데이터의 초기 상태를 마치 캐릭터를 처음 생성한 것 처럼 만들어 줍니다. 이후 이름을 입력 받고, 해당 데이터를 저장하게 됩니다.
아래의 currentSlot을 저장한 슬롯 넘버를 받는데, 이는 해당 슬롯에 저장하고 있다가 다른 슬롯에 저장을 진행할 때 확인을 위해 사용됩니다.
☆SaveData

이곳이 데이터를 저장하는 핵심 코드 입니다. 우선 try-catch로 예외를 중간에 처리하게 만들어 줍니다. 우선 저장 경로를 파악해 줍니다. 만약 해당 파일이 존재하지 않는다면 새롭게 파일을 생성해 줍니다. 이후 파일의 경로의 파악이 끝났다면 데이터를 저장할 내용을 문자열로 만들어냅니다.
Path.Combine()
대충 문자열 끼리만 합하는 방법을 쓰면 모를까 왜 이렇게 하는걸까?
해당 함수는 os별로 다른 저장 위치를 나타내는 값이 다르기 때문에 사용하는 함수 입니다. 윈도우는 파일 경로를 \로 구별합니다(문자열로 적을 때에는 \\이렇게 두번 적어줘야 적용 됩니다.) 하지만 mac과 리눅스의 경우는 다른데, 이곳에서는 파일 경로를 /로 사용하기 때문에 만약 다른 os에서 열러고 할 경우 에러가 날 수 있습니다. Path.Combine은 이를 자동으로 해결해 주어 다른 os에서도 해당 함수의 기능이 잘 작동할 수 있게 도와줍니다.
File.WriteAllText(경로+파일 이름 문자열, 내용 문자열)
해당 함수를 이용하여 이제 핵심적인 동작을 하게 됩니다. 사용법은 위에 한글로 적은 그대로 사용이 가능합니다. 이 함수는 텍스트 파일을 만드는 함수로, 만약 이미 해당 이름을 가진 파일이 있다면 그대로 덮어 씌우는 기능을 수행합니다.

총 3개의 저장공간을 만들어 사용하고 있습니다. 이렇게 텍스트 파일 생성 및 저장이 완료 되었다면 SaveData와 StartNewGame의 동작은 끝나게 됩니다.

이 다음으로 또 다른 저장인 SaveToSlot에 대해 보겠습니다.
SaveToSlot

saveToSlot은 현재 플레이 중인 진행을 저장하는 함수 입니다. 때문에 StartNewGame과 비슷한 부분이 많습니다. 차이점이라면 초기 입력을 요구하지 않고 그저 지금 사용하고 있는 파일이 2번인데, 3번으로 저장하면 저장할 것을 물어보는 ConfirmSlotChanges와 저장을 하는 SaveData만 있습니다.
경고! - 해당 저장 방법은 보안이 매우 취약합니다!!!!
아래의 내용은 저장을 구현하기 위한 아주 간단한 조치입니다. 만약 게임을 만들고자 한다면 아래의 방법이 아닌 암호화/복호화 할 수 있는 방법이나, DB등을 사용하여 저장하는 것이 좋습니다!
불러오기 - Load

1번과 3번에서 저장을 진행했다면 이번엔 저장한 데이터를 불러오는 2번의 LoadGame에 대해 보겠습니다.
LoadGame

LoadGame은 게임을 불러오게 만들어주는 함수 입니다. 우선 처음 인터페이스를 띄운 후, 만약 파일 내에 세이브 파일이 존재한다면 저장된 데이터 있음, 없으면 저장된 데이터 없음을 출력하여 비어있는 파일과, 저장되어있는 파일을 보여줍니다. 그 후 플레이어의 입력을 기다리고 만약 4번을 눌렀다면 다시 초기 화면으로 돌아옵니다.

하지만 만약 파일을 골랐을 경우 우선 파일의 위치를 받아오고 해당 위치에 세이브 파일이 존재한다면 해당 데이터를 LoadData를 통해 불러오게 됩니다.
☆LoadData

우선 저장 폴더의 경로를 문자열로 만들고 만약 해당 경로를 탐색하여 보았을 때 저장 파일이 없다면 저징된 데이터가 없음을 알리고 만약 존재한다면 해당 파일의 글들을 전부 불러옵니다.

파일에 저장된 내용
이후 모든 내용을 보며 Split을 통해 ':'를 기준으로 나누어 줍니다. 그 후 key와 value로 둘을 쪼갠 뒤 switch-case를 통해 해당 값들을 불러옵니다. 모든 정보의 불러오기가 끝난다면 불러오기는 종료 되고, LoadGame또한 해당 세이브 슬롯 넘버를 불러오고 안내 매세지를 띄우며 불러오기는 종료가 됩니다.
경고! - 해당 저장 방법은 보안이 매우 취약합니다!!!!
아래의 내용은 저장을 구현하기 위한 아주 간단한 조치입니다. 만약 게임을 만들고자 한다면 아래의 방법이 아닌 암호화/복호화 할 수 있는 방법이나, DB등을 사용하여 저장하는 것이 좋습니다!
계속해서 나오는 이 문구의 존재 이유는 그 말대로 이러한 방법은 보안이 취약합니다. 즉, 지금 레벨이 1인 상태인데, 메모장을 열어 레벨을 임의로 조정해버리거나, 체력을 바꾸는 등, 치트성 플레이가 가능해지기 때문에 만약 진짜로 게임을 만들 때에는 이러한 방법이 아닌, 게임의 데이터를 지킬 수 있는 방법을 이용하는 것이 좋습니다.
Comments