C# 콘솔창으로 게임 만들기(Day 3)

2023. 10. 20. 15:57Game Develop/C# Console Text RPG

 

각 챕터 별로 10 스테이지씩 진행을 할 것이다. 스테이지 1, 6, 10(보스 전)에 스토리가 등장하고 나머지 스테이지는 1챕터의 몬스터들이 랜덤으로 등장하도록 설정해줄 것이다.

이번에는 스토리와 몬스터 등장 문구가 각 스테이지별로 출력되게 할 것이다.

 

챕터별 스토리와 몬스터 및 보스 등장 문구를 콘솔 화면에 출력하기 위해 사전에 시나리오를 작성해놓고 각 폴더에 알맞게 저장해 주었다.

이제 각 스테이지별로 해당하는 스토리가 출력되도록 파일 입출력을 통해 코드를 작성해보도록 하겠다.

 

스테이지가 10 개고 계속 증가하는 형태기 때문에 for 문으로 작성해 주었다. 또 i 스테이지마다 정해진 시퀀스가 출력이 돼야함으로 챕터의 이름과 스테이지 번호가 출력되도록 작성을 해주었고, 전체적인 스테이지의 흐름은 switch 문으로 작성하는 것이 효율적이라 생각하여 이렇게 작성하였다.

case 0, 5, 9는 스토리가 출력될 스테이지다.

 

 

 

차례로 ShowPrologue, ShowEpisode, ShowEpilogue 순으로 출력이 되게끔 작성해 줄 것이다.

 

 
위의 파일이 저장된 폴더의 라이브러리 주소 : ..\\..\\Scenario\\Chapter\\

 

 

세 메서드 전부 파일명만 다르기 때문에 Prologue만 대표로 설명하자면, 만약 Chapter가 Chapter1이라면 경로상의 Chapter1_Prologue를 FileMode.Open으로 하도록 작성해주었다. 이는 경로에 해당 파일이 있으면 이 파일을 읽어와 출력하도록하고, 없으면 오류가 나오게해주는 명령어다. while 문은 스트림이 마지막이 아닐때까지 현재 위치부터 나머지 스트림 끝까지의 모든 문자열을 출력하게끔 해준다.

 

이제 잘 출력되는지 확인해 보자!!

 
 

의도했던대로 아주 잘 출력이 되는 것을 확인할 수 있었다.

이제 몬스터와 보스 등장시의 텍스트 출력을 해보자.

 

몬스터는 랜덤으로 생성이 되게하여 스테이지 마다 순서대로 등장하게끔 해줄 것이다. 그래서 일단 몬스터를 랜덤으로 생성하도록 코드를 작성해보자

 

무작위 숫자를 입력 받기 위해선 Random 클래스를 사용해야함으로 Game 클래스 멤버 변수로 random 객체를 생성해 주었다.

 

 

Chapter1 메서드에 어떤 몬스터가 등장할 지를 저장할 int형 변수 ranMob에 Mob enum의 FARMER 부터 WOLF 까지 중의 하나를 저장시켜준다.(maxValue 값은 범위에서 제외되기 때문에 +1을 해주었다)

 

 

위는 몬스터와 마주쳐 전투가 끝나고 전투 이후의 사항까지 관리할 메서드이다. 매개변수에 대한 설명은 앞으로 코드를 작성해가면서 이유를 설명하도록 하겠다.

 

 

Monster 객체를 담을 monster를 선언해주고 챕터 1의 등장할 몬스터가 아닌 몬스터가 등장하는 것을 방지하기 위해 조건문으로 WOLF 보다 커지면 다시 FARMER가 등장하도록 설정해주었다. 그리고 나서 enum의 값에 따라 Farmer, Hunter, Wolf 객체를 생성하도록 하고, ranMob의 몬스터와 전투가 끝나고 나면 다음 스테이지에 같은 몬스터가 등장하지 않도록 ranMob++을 해주어 순차적으로 나타나도록 하였다.

 

어차피 스토리나 보스전을 제외하면 전부 일반 몬스터와의 전투기 때문에 default값에 FaceMonster 메서드를 써주었다.

 

이제 잘 나오는지 확인해보자

의도한 스테이지에 몬스터가 생성된 것을 확인할 수 있고, 언뜻 보기엔 잘 생성된 듯 보이지만 치명적인 오류가 있다. 바로 WOLF만 생성된다는 것이다. 껐다가 다시 실행 하면 FARMER나 HUNTER도 생성될 수도 있겠지만, 문제는 모든 스테이지에 한 종류의 몬스터만 생성된다는 것이다. 메서드의 특징 때문에 이런 문제가 발생한다.

메서드는 값 형식이다. 따라서 매개변수를 받으면 그 데이터 자체를 가지고 변환하는 것이 아니라 매개변수의 값을 복사하여 메서드 내의 명령문을 실행한 뒤 값을 출력하고, 메서드가 종료된 직후 메모리를 반환하기 때문에 실제 데이터는 변화하지 않아서 이런 문제가 발생하는 것이다. 따라서 위의 문제를 해결하기 위해선 매개변수를 값 형식이 아니라 참조 형식으로 바꾸어서, 데이터 자체를 변경하게끔 해줘야한다.

 

방법은 간단하다 그저 매개변수 자료형 앞에 ref만 넣어주면된다. 그리고 이 메서드를 사용할 때 ref를 사용한 매개변수 자리에 똑같이 ref를 써서 변수를 넣어주면 된다.

 

 

ref로 바꾸어서 실행을 시켜주면

아까와 달리 의도한대로 잘 나오는 것을 확인할 수 있다.

 

몬스터의 등장 텍스트는 Monster 클래스에 ShowAppear 메서드를 virtual로 만들어서 자식 클래서에서 각각 override하여 Mob이나 Boss가 생성됐을 때 출력되도록 해줄 것이다.

 

 
virtual로 선언
override로 재정의 하여 수정해주고, 전과 같이 Farmer 생성하면서 출력

나머지 Hunter와 Wolf도 경로만 바꿔주어 같은 형식으로 만들어준다.

 

다시 콘솔을 실행해보면

 
 

적어두었던 텍스트들이 제대로 출력되는 것을 볼 수 있었다.

 

마지막으로 Boss 출력까지 작성해줄텐데 일반 몬스터와 차이가 있으니 따로 분류를 해줄것이다. 일단 Chapter1에 나올 보스의 클래스를 만들어야하는데 Priest로 만들것이다. 지금은 일반 몬스터와 똑같이 작성해주면 된다.

Priest 클래스를 만들어 주고 Game 클래스로 넘어와서 보스는 일반몹과 달리 랜덤으로 생성되지 않기 때문에 메서드를 하나 더 작성해주었다.

 

 
 

 

Chapter 1에서 스토리와 각 몬스터들의 등장 텍스트까지 파일 입출력을 통해 콘솔창에 출력되게 하는 것까지 해보았다.

다음은 전투시스템을 작성해보겠다.