본문 바로가기
  • 식초 한잔 할래..?
공부/게임 공부

간단한 [TextRPG] 만들기

by 돼지피그푸곰 2025. 10. 21.

게임 시행 영상_1.mp4
9.71MB

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void Run()
{
    //게임 데이터 생성 및 시작 화면 설정
    GameData data = new GameData();
    currentScene = new NewCharacterScene();
 
    //Iscene을 상속한 클래스만 실행 Or 종료
    while (currentScene != null)
    {
        if (currentScene is Iscene scene)
        {
            
            currentScene = scene.Run(data);
        }
        else
        {
            break;
        }
    }
}
cs

 

 

팀프로젝트로 간단한 TextRPG를 만들었습니다. 제가 담당한 부분은 구조 설게, UI관리, 리팩토링, git관리, 그 외 코드 수정 및 저장 기능 등을 맡았습니다.

 

현재 저희 팀 구조입니다.

 

협업을 중심으로 돌아가기 때문에 최대한 나눠서 작업해 보는 방식을 사용했는데, 평소에는 혼자 하다 보니 이런 방식을 익숙해 지는 것에 많은 시간을 할애한 것 같습니다.

 

 

 

이 GamaManager 코드를 통해 각 장면, Scene을 전환하고, 규칙도 Iscene이라는 이름의 Interface를 만들어서 상속시켰습니다.

 

각 Scene 클래스들은 GameData클래스에서 정보들을 가져오고, UIManager나 LogManager 등으로 완성된 코드 순으로 약간 통일감 있게 톤을 맞춰주었습니다.

 

사실 하면서 원래 계획했던 것은 이미지, 영상, 음악, 이모티콘 등을 넣어서 UI를 화려하게 꾸밀 계획이었습니다.

 

다만 다른 코드들을 만지는 분들이 입문자 분들이라 모든 기능이 발표 자료 준비하기 전날에 구현이 되어서, 다른 코드를 안건드리는 선에서 미리 만들어든 UIManager만 적용시킨 상태로 놓고, 그 외에는 각 코드의 기능에 대해 이해를 시키는 과정을 거쳤습니다.

 

저도 설명하면서 오히려 제가 이해되는 느낌이 컸습니다. 

 

하면서 새롭다 싶은 부분은 창 크기 변동시 자동 정렬되는 기능과, 저장 기능이었습니다. 콘솔창을 마우스로 막 바꿔도, 항상 중앙정렬 되게끔 만들었습니다. 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public static string ConsoleArray(Action drawAction)
{
    int lastwidth = Console.WindowWidth;
    string input = "";
    bool firstDraw = true;
    //커서 숨기기
    if (Console.CursorVisible)
    {
        Console.CursorVisible = false;
    }
 
    while(true)
    {
        //콘솔 너비가 바뀌면 콘설 Clear, 새롭게 그리기
        if (Console.WindowWidth != lastwidth || firstDraw)
        {
            Console.Clear();
            drawAction.Invoke();
            lastwidth = Console.WindowWidth;
            firstDraw = false;
        }
        //키 입력 감지, 화면을 감지해서 커서 위치 조정. 사용자가 엔터 칠 때 까지 입력 받기.
        if (Console.KeyAvailable)
        {
            int promptPos = Math.Max((Console.WindowWidth / 2- 20);
            Console.SetCursorPosition(promptPos, Console.CursorTop);
            Console.Write(">");
            input = Console.ReadLine() ?? "";
            break;
        }
        Thread.Sleep(100);
    }
    return input;
cs

 

 

그리고 저장할 때는 java인 Json형식으로 만들고, 다시 읽고, 복원 하는 등의 기능들을 배웠고 활용했습니다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
public void SaveGame(GameData data)
{
    try
    {
        string json = JsonSerializer.Serialize(data, new JsonSerializerOptions { WriteIndented = true });
        File.WriteAllText(Save, json);
        LogManager.Add("저장 성공");
    }
    catch (Exception ex)
    {
        LogManager.Add($"저장 실패: {ex.Message}");
    }
cs

 

그 외에 팀원들의 코드 중 고칠 부분을 고치면서 전부 다 읽어보고 이해해 보려고 노력했던 것 같습니다. 그렇게 완성된게 맨 위에 있는 영상이고.

 

git관련해서는 한 번 터지고 수습하는 과정에서 좀 더 생각하면서 만지게 되었기 때문에, 많은 공부가 된 팀프로젝트 였습니다.

 

너무 사무적인 말투인 것 같습니다.