나 개발자 진짜 되냐?

C#으로 텍스트 RPG 만들기 _ [ 상 ] 본문

C# 을 맛보았어요!/프로젝트를 만들었어요!

C#으로 텍스트 RPG 만들기 _ [ 상 ]

Snow Rabbit 2024. 9. 26. 23:28

 

음..

크리스마스는 아니지만

함께라는 의미를 담은 이 움짤로 시작한다.

 

 

이제 팀프로젝트를 시작하기 전

 

기본 개념을 다잡기 위해

 

다시!

 

텍스트 RPG를 짜보려고 한다.

 

다시

다시

다시

 

중요한 건 다시

 

다시마..

 

여하튼 시작한다.


 

먼저 TEXT RPG를 짜기 위해

 

해야 할 건 

 

 

1. 무슨 화면을 만들어야 할까

 

< 메인화면 >

< 상태정보 >

 

< 상태정보, 장착여부 확인 >


< 가방 >

 

< 가방, 구매한 물건 확인 >

 

< 상점, 보유 품목 >

< 상점, 구매 가능 >

 


 *   1. 메인화면 // 환영합니다! 1,2,3 입력하세요.
 *   2. 상태정보 // 정보 확인할 수 있게 하기
 *   3. 가방 // 열었을 때 내 물건이 있는지
 *   4. 가방 // 장착을 했는지 안 했는지
 *   5. 상점 // 아이쇼핑, 물건이 있는지 없는지
 *   6. 상점 // 실제 쇼핑, 물건을 구매

 

 

2. 내가 쓸 기능은 뭘까

 

1. 메인화면으로 이동하게 하기

2. 상태 정보창에 캐릭터 정보 띄우기

2-1 아이템 장착 시 캐릭터 스탯 업그레이드

3. 가방에 상점에 산 물건이 진입했는가

3-1. 상점에서 산 물건이 장착이 되는가 [E] 표시

4. 상점에 물건 띄우기 

4-1. 있는 물건을 골드에 맞게 구매

 

 

3. 내가 쓸 데이터는 뭘까

 

1. 캐릭터 정보

( 레벨 / 이름 / 직업 / 공격력 / 방어력 / 체력 / 골드 )

2. 아이템

( 이름 / 특징 / 장비 벨류 / 장비 타입 / 가격 / 장착여부 )

장비 벨류와 장비 타입인 이유는

 

갑옷은 옷이니 방어력 증가

검은 무기니 공격력 증가

 

이렇게 장착부위에 따라 공방이 극명하게 나뉘기 때문에

 

공격력 / 방어력이 아니라

장비타입을 정하고

무기일 경우 장비벨류를 공격력 + n 이렇게

 

설정하기로 했다.

 

 


이 부분을 앞으로도 프로젝트할 때

꼭 생각하고 가자

 

자.

 

하나씩 해보자.

Console.WriteLine()으로 입력! 해준다.

 

 

먼저 메인에,

맨 처음에 뜰 문구를 적는다.

 

다음은

번호를 입력해줘야 하니

번호 가져오는 친구를 써야 한다.

 

Console.ReadLine()으로 가져오고

ReadLine으로 가져오게 될 경우,

 

문자열로 가져오기 때문에

만약에 숫자나, 뭐 다른 값으로 받기 위해서는

 

Parse라는 친구를 사용해야 한다.

 

그래서 우리는 그 밑줄에

 

string input = Console.readline();

int result = intParse(input);

 

을 해준다.

 

사실은 간단하게

 

int result = intParse(Console.Readline());

로 써줘도 된다.

 

 

 

자 여기서!

 

우리는 숫자만 받으려면 123 써도 된다.

근데 유저가

이것저것 뚱땅 뚱땅 누르다 보면

 

123 이 아닌 다른 숫자

또는

문자를 칠 수도 있다.

또는 문자열까지..

 

이 얼마나 충격적인 상황인가

아주 난감한 상황이 생긴다.

 

그래서,

 

우리는

🌟 TryParse() 🌟

함수를 사용하게 된다.

 

 

진짜 간단하게 말하면

 

아까와 위에서 말한

난감한 상황들 ( 예외 )를 처리해 주기 위한 친구이다.

 

이 친구의 특징은

 

1. 자료형 값을 넣는 게 아니다 보니 

이 친구는 반환이 true 아님 false다.

 

2. 이 친구는 변수에 값을 넣을 때 out이라는 친구를 쓴다.

 

여럿 검색을 해보았는데

그냥 짝꿍이라고 생각해야 할 거 같다.

 

 

int x;

int.TryParse("10", out x);

 

자료형을 써주는 것도 중요하다!

 

bool b;

bool.TryParse("true", out b );

 변수에 넣어준다.

 

자 그래서 우리는 아까 써놓은 intParse를

TryParse로 바꿔보자.

 

 

 

TryParse를 사용하려는 이유는

true 아님 false를 출력해 주는 친구라서

 

int를 받는 곳인데

문자열이 오면 안 돼!

false! 출력할 거야!

가 되고

 

간단하게 말하면 그냥 문자열 이면

false 출력해 줘서 안 받기 위함이다.

 

 

먼저 위에처럼

변수 하나 선언

 

bool값의 isNumber을 하나 만들어주고

왜?

Tryparse는 불값이니까!

 

방금 받은 숫자 int로 바꿔서 result에 넣을 건데

 

참이면 바뀐 거고, 즉! 숫자가 잘 들어왔다.

거짓이면 안 바뀐 거고, 음? 숫자가 아닌데? 얘 누구야?

 

그 참/거짓 값이 지금 isNumber에 들어갔다.

 

 

그리고 우리는! 숫자일 때 실행해야 하기 때문에

숫자는 아까 참이 나온 다했었죠?

 

그래서 if문에 넣으면 바로

조건문이 실행된다.

if(isNumber){

}

 

우리는 이 중괄호 안에다가

 

숫자일 경우

 

오케이 1,2,3 실행!

 

숫자가 아니면?

 

다시 처음에 우리 보여주기로 한

던전입니다 1.2.3 어디 갈래요?

 

이것을 또 보여줘야 하니까,

이것은 while문으로 반복을 돌려야 한다.

 

이렇게 쓰면 성공,

 

이해했다면 더 성공

 

이제 우리는 숫자를 입력받아

넣을 수 있게 되었다.

 

자 이제 값이

1,2,3 중

뭐인가에 따라

화면이 바뀌어야 하기 때문에

우리는 switch를 사용해야 한다.

 

case 1, 2, 3을 통하여

 

화면이 이동되어야 하니

번호에 맞게 나올 화면을 고대로 적어준다.

 

 

Console.Clear();이 뭐냐고요?!

 

화면을 사악 지워준다.

깔끔하게!

 

아니 근데.. 너무 뭔가 답답하고 많아 보여서 읽기 싫어진다.

 

정확히 말하면

메인은 우리가 주로 봐야 하기 때문에

가독성이 좋아야 해서

 

이 많은 글을 하나의 함수로 빼보자!

Console.WriteLine()을 모아둔 함수를 만들어보자!

이렇게 메서드 안에 넣어서

내가 짠 코드를 넣어주고

case에는 이제 간단하게 메서드만 적어주면 된다!

꼭 함수뒤에 ()를 잊지 말자!

 

캬 case가 깔끔해졌어요!

 

 

자 이제!

아까 못 넣었던

 

if (isNumber) { }의 중괄호를 채워보자

여기서는 " 입력값이 숫자일 경우 "  들어온다.

 

하지만 숫자도 다 같은 숫자가 아니다.

 

1,2,3 만 받아야 하고

4니 28이니 82니 안된다.

 

그렇기 때문에

또 if문을 걸어서

 

그 값이 1 이상 뭐 3 이하일경우

이 while문 탈출해서 switch가 실행되도록,

 

만약 그 이외 숫자다?

 

잘못된 입력입니다! 출력

1부터 3까진데 그 값을 비교하려면

입력값이랑 비교해야 하니까

result >= 1;

 

제말대로 했다면

여러분의 코드도 이렇게 될 것입니다.

 

자 우리는 이 친구를 최소 3번 써야 한다.

case1,2,3 세 개니깐

 

그러면!

 

이런 반복적인 코드도 줄일 수 있지 않을까?!

 

줄여보자!

 

코드이름은

음..

숫자를 체크 해서 넣어주는 거니까

 

static void CheckInput으로 해주고

 

그 안에 이 값을 넣어주면 된다.

 

 

요렇게!

 

❗❗

흠.. 우리는 여기서 문제가 하나 생긴다.

이 result값을 함수에서 빼주어야 하기 때문

 

엇 왜죠?

 

스위치에서 아주 뻘건 빛이 나네요.

 

이유는 뭘까?

 

바로 result를 함수에 넣어버렸기 때문

함수에 넣어주면 캡슐화가 되어서

불러도 대답 안 한다..

 

그러면 어째야 하나?

 

 

그럼 함수에서 다시 main으로 빼면 안 되나?

 

NONO

 

그 함수에서도 씁니다.

 

다시 봅시다.

 

이 함수에서 result값은 입력받아온 값을 숫자로 바꾼 값이다.

우리는 이 값 이 있어야

스위치문 케이스에 들어가서

다음 화면으로 이동이 될 것이다.

 

함수에 있는 변수를

함수 밖 다른 곳에서 보여주려면!

 

 

return

이라는 친구를 사용해야 한다.

 

❗❗

자 그러면 문제가 또 발생

 

1. return을 어디에 써야 할까

2. return을 쓰려면 함수 선언에 void 써도 되나?

이다.

 

2번부터 말하면

안된다!

 

void가 있는 함수

나, 이 함수 끝날 때 아무것도 안 낼 거야!

라는 뜻이다

 

void는

반환하기 귀찮아하는 친구

반환을 해주지 않는다.

 

그러면 우리는 void 대신 int라고 써줘야 한다.

왜냐면? 우리는 숫자를 줄 거니깐 ㅎ

 

 

int를 써줬어

이제

우리는 무조건 return을 해줘야 하는데

어디가 좋을까?

 

이 친구는 반환해 주는 동시에 탈출하는 능력자 친구이기 때문에

break에 써주면 된다.

 

 

return으로 우리는 뭘 줘야 할까?

내보내줘야 할 애!

 

바로 result!

 

그래서 

이렇게 써주면 된다.

 

이제 이 함수를 필요한 위치에 넣어보자

 

❗❗❗삐용삐용❗❗❗

 

근데 우리는 또 문제 발생!

 

아까 CheckInput에 if문으로

1 이상 3 이하로 잡아놨는데..

 

스탯 UI에서는..

0뿐이다.

 

즉 안에 비교가 조금씩 다르다는 것..!

 

이것을 어떻게 해결할 수 있을까?

 

각 UI마다 받아야 하는 번호가 다르다..

누구는 1,2,3

누구는 1,0

 

그러면 그 번호를 함수가 알게 되면

처리해주지 않을까?!

 

함수에 있는 값을 내보내는 건 return이었다

 

함수로 값을 가져오는 것도 가능할까?

 

가능가능!

 

이것이 파라미터

매개변수이다.

 

함수 소괄호 쓸 변수와 개수를 적어주면

 

우리는 변수를 함수에 가져올 거예요!

계산식 좀 써주쇼!라고 해석 할 수 있다.

 

바꿔 주어야 할 값은

어떤 애는 1 이상 3 이하

어떤 애는 0 이상 1 이하

뭐 스탯창 같은 경우 0 밖에 없으니 0 이상 0 이하로

n이상 n이하가 계속 바뀌고 있다.

 

그래서 변수를 두 개, 필요로 할 것이고

 

함수에 미리 적어주어서

변수 두 개 넣을 거니까 준비혀

라고 말해주는 것을 해주어야 한다!

 

그래서 이렇게 아까 만든 CheckInput을 써주고

소괄호 안에!

변수 두 개!

최솟값 최댓값 받고

 

그 친구는 1이랑 3을 대체할 친구들이니

숫자 있던 곳에 저 변수들을 넣어주면 된다.

 

오 이렇게 썼더니

 

전에 함수 선언해 주었던 곳에서 빨간 줄이다.

정상입니다!

 

변수 두 개 받을 준비를 하고 있는 함수이기 때문에

변수 두 개를 뭘 줄지

무조건 알려주어야 한다.

 

그래서 1부터 3까지면 1,3

0부터 1까지면 0,1

0부터 0까지면 0,0

을 넣어주면 된다!


 

자.. 이렇게 먼저

큰 틀을 짜보았다.

 

지금까지 우리는 

 

메인화면구현

내 정보화면구현

상점화면구현

내 가방화면 구현

 

4가지를 그려 넣고

 

나가기 함수까지 만들어보았다.

 

함수화를 해줘야 하는 건

한 번의 수정으로

다양한 곳에서 활용할 수 있어서

꼭 필요하다!

 

앞으로 자주자주 활용해 보도록 하자!!!!!!!!!!!!

파이팅..!!!!!!!!!