[내일배움캠프 6일차] TextRPG 제작기 1
1. 오늘의 할 일
04/14 에 날아온 개인과제, TextRPG….
만들어야 한다!
그리고, 솔직히 기대된다. RPG 좋아. TextRPG는 낭만이야. RPG 좋아하는 사람한테 이런 거 시켜주시면
힘내서 합니다.
(이 TRPG 아님)
그럼, TextRPG 에 무엇이 필요할까?
2. 필수 요소 분석
1. 게임 시작 화면 (Main)
-. 게임 시작 시 간단한 소개말
-. 이름 등록 (Console.ReadLine)
-. 마을에서 할 수 있는 행동 알림
-. 원하는 행동의 숫자를 타이핑하면 실행됨 (Switch문)
2. 상태보기(Status)
-. 캐릭터 정보 표시 (lv,name,job,atk,def,hp,gold)
-. 이후 장착한 아이템에 따라 수치가 변경되어야 함 (문자열 조합 혹은 Write 사용)
3. 인벤토리(Inventory)
-. 아이템 목록 관리 (Write와 WriteLine을 적절히 사용)
-. 장착 시 [E] 표시 (bool값 이용)
4. 장착관리(Equip-Inventory와 연동)
-. 장착관리 시작 시 앞에 숫자표시 (Switch문)
-. 해당되는 번호를 누르면 [E]가 탈부착됨 (bool값 equip != equip)
-. 일치하지 않을 경우 '잘못된 입력' 출력 (Switch-default)
-. 중복장착 허용 - 이후 추가 기능에서 제거 (일단 equip 기능만 구현)
-. 장착 시 상태창에 정보가 반영되어야함 (각 함수 별 연동)
5. 상점(Store)
-. 보유중인 골드, 아이템 정보, 가격 표시 (\t , Write 활용)
-. 가장 오른쪽에는 가격 표시 (int 값)
-. 구매 완료 시 구매완료 표시(bool soldOut)
6. 아이템 구매(Purchase-Store와 연동)
-. 구매 시 장착관리와 동일하게 숫자로 체크하기 (Switch문)
-. soldOut =true 라면 '이미 구매한 아이템'출력 (soldOut 을 불리언으로 지정)
-. 구매 가능 시 가격과 소지골드 비교 (Price>gold = 구매불가)
-. 해당 없을 시 '잘못된 입력'출력 (Switch-default)
그럼 이걸 기반으로 임시로 구성해보자!
//변수가 없는 ConsoleWrite 생략
internal class Program
{
// 플레이어 스탯 초기화
private static int lv = 1;
private static int atk = 10;
private static int def = 5;
private static int hp = 100;
private static int exp = 0;
private static int gold = 1500;
// 플레이어 이름 초기화
private static string name;
//메인-시작장면
static void Main(string[] args)
{
string name = Console.ReadLine();
Console.WriteLine(name + "님, 게임을 시작합니다.");
Start();
}
//게임 시작
static void Start()
{
Console.WriteLine($"스파르타 마을에 어서오세요,{name}님!");
//입력: 넣을 예정
string select = Console.ReadLine();
switch (select)
{
case "1":
Staus();
break;
case "2":
Inventory();
break;
case "3":
Store();
break;
case "4":
Console.WriteLine("게임을 종료합니다.");
Environment.Exit(0);
break;
default:
Console.WriteLine("잘못된 입력입니다.");
Start();
break;
}
}
//스탯창
static void Staus()
{
Console.WriteLine($"{name}님의 상태창입니다.");
Console.WriteLine("==Status==");
Console.WriteLine($"Level: {lv}");
Console.WriteLine($"Name: {name}");
Console.WriteLine($"Attack: {atk}");
Console.WriteLine($"Defense: {def}");
Console.WriteLine($"HP: {hp}");
Console.WriteLine($"EXP: {exp}");
Console.WriteLine($"GOLD: {gold}");
//입력: 만들기
string Statselect = Console.ReadLine();
switch (Statselect)
{
case "1":
Inventory();
break;
case "0":
Start();
break;
default:
Console.WriteLine("잘못된 입력입니다.");
Staus();
break;
}
}
//인벤토리
static void Inventory()
{
string Iselect = Console.ReadLine();
switch (Iselect)
{
case "1":
Equip();
break;
case "0":
Start();
break;
default:
Console.WriteLine("잘못된 입력입니다.");
Inventory();
break;
}
}
//장비창(장착관리)
static void Equip()
{
string Eselect = Console.ReadLine();
switch (Eselect)
{
case "0":
Inventory();
break;
default:
Console.WriteLine("잘못된 입력입니다.");
Equip();
break;
}
}
//상점
static void Store()
{
string Sselect = Console.ReadLine();
switch (Sselect)
{
case "1":
Buy(); //구매창
break;
case "2":
Sell(); //판매창
break;
case "0":
Start();
break;
default:
Console.WriteLine("잘못된 입력입니다.");
Store();
break;
}
}
//구매 탭
static void Buy()
{
Console.WriteLine($"{name}님, 어서오세요.");
Console.WriteLine($"{name}님의 골드: {gold}G");
string Bselect = Console.ReadLine();
switch (Bselect)
{
case "0":
Store();
break;
case "1":
if (gold >= 1000)
{
gold -= 1000;
def += 5;
}
else
{
Console.WriteLine("골드가 부족합니다.");
}
Store();
break;
case "2":
if (gold >= 1800)
{
gold -= 1800;
def += 9;
}
else
{
}
Store();
break;
case "3":
if (gold >= 3500)
{
gold -= 3500;
def += 15;
}
else
{
}
Store();
break;
case "4":
if (gold >= 600)
{
gold -= 600;
atk += 2;
}
else
{
}
Store();
break;
case "5":
if (gold >= 1500)
{
gold -= 1500;
atk += 5;
}
else
{
}
Store();
break;
case "6":
if (gold >= 2000)
{
gold -= 2000;
atk += 7;
}
else
{
}
Store();
break;
default:
Console.WriteLine("잘못된 입력입니다.");
Buy();
break;
}
}
//판매창
static void Sell()
{
Console.WriteLine("0. 나가기");
string Sellselect = Console.ReadLine();
switch (Sellselect)
{
case "0":
Store();
break;
default:
Console.WriteLine("잘못된 입력입니다.");
Sell();
break;
}
}
}
일단 가장 큰 분류를 기점으로 적당히 넣어보고 테스트를 돌려봤다.
(string 값으로 그냥 쳐져 있는 것들은, 이후 데이터를 변경할 예정이다. string값뿐이라면 아무것도 만들 수 없다...)
아직 bool값도, 뭣도 없이 단순 선택지 정도만 구현했는데….
잠깐. 선택지밖에 안넣었는데 문제가 생겼다.
{name}이 들어가지 않는다.
그러니까, Main에서 입력된 {name}값이 다른 함수의 {name}에 들어가지 않은 것이다!
어라, 이상한데, 그래도 같은 {name}이라는 이름을 공유할 수 있고 들고올 수 있다면 그럴 리 없는데.
구조적으로 뭔가 이상이 생긴 게 틀림없다…
가만히 보니 이미 클래스 단위에서 string으로 선언된 것이, Main에서 string에서 한 번 더 선언 되었다.
이거 때문일까?
private static string name;
static void Main()
{
//중략
name = Console.ReadLine(); //이름 변수 안에 입력값이 들어가도록 함-string 제거
Console.WriteLine(name + "님, 게임을 시작합니다.");
Start();
}
static void Start()
{
Console.WriteLine($"스파르타 마을에 어서오세요,{name}님!");
}
무사히 이름이 들어갔다!
처음엔 내가...뭘 잘못했지?
이러고 있었는데, 다행히 별 일 아니어서 안심했다.
3. 다음에 진행할 것
가장 기본적인 기틀을 잡았으니, 다음에 할 것도 정해야한다.
1. 같은 구문 반복은 하나의 함수로 처리하기(ex. 잘못된 입력입니다. 골드가 부족합니다 등)
2. 장비 데이터 넣기
우선 이렇게 두 개로 잡아보도록 하자. 내일도 힘내자 ( ' ')9