C#) Text RPG 2
Core
- 게임이 구동 되는 주축 클래스이다.
private bool isRun = true;
public bool IsRunning
{
get { return isRun; }
set { isRun = value; }
}
IsRunning을 통해 내부에서 게임을 종료 할 수단 제공.
public void init()
{
character = Character.GetInst();
itemInit();
}
- 각종 Item들을 초기화한다.
// 계속 반복되는 메서드
public void Update()
{
// Scene 진입
currentScene.Enter();
// 다음 Scene 지정
Scene nextScene = currentScene.Exit();
currentScene = nextScene;
}
- 간단한 게임 구조이다
currentScene.Enter()를 통해 Scene에 진입currentScene.Exit()을 통해 다음 Scene 반환Update()메서드 재 실행으로 계속 반복
StartScene

Singleton
세부 Scene들은 Singleton으로 구현해 서로 땡겨다 쓸수 있도록 작성 했다.
internal class StartScene : Scene
{
// Singleton
private StartScene() { }
private static StartScene? instance;
public static StartScene GetInst()
{
if (instance == null)
instance = new StartScene();
return instance;
}
// 싱글톤 객체 사용
Character character = Character.GetInst();
}
- Character 객체도 같은 방식으로 구성해서 위와 같은 방법으로 가져다 사용한다.
- 생성자를
private으로 만들어, 외부에서 생성 할 수 없도록 구현. instance필드에는 자기 자신 객체를 가르킨다.
Enter()
public override void Enter()
{
Clear();
nextScene = this;
Console.WriteLine("RPG 마을에 오신 여러분 환영합니다.");
Console.WriteLine("이곳에서 던전으로 들어가기전 활동을 할 수 있습니다.\n");
Console.WriteLine("1. 상태보기");
Console.WriteLine("2. 인벤토리");
Console.WriteLine("3. 상점");
Console.WriteLine("4. 던전 들어가기");
Console.WriteLine("5. 휴식");
Console.WriteLine("\n\n0. 게임 종료");
Console.WriteLine("\n원하시는 행동을 입력해주세요.\n");
string result = Console.ReadLine();
switch (result)
{
case "0":
Clear();
// 게임 종료
Core.GetInst().IsRunning = false;
break;
case "1":
// StatusScene
nextScene = StatusScene.GetInst();
break;
case "2":
// InventoryScene
nextScene = InventoryScene.GetInst();
break;
case "3":
// ShopScene
nextScene = ShopScene.GetInst();
break;
case "4":
// DungeonScene
nextScene = DungeonScene.GetInst();
break;
case "5":
// RestScene
nextScene = RestScene.GetInst();
break;
case "debug":
// DebugMode
DebugMode();
break;
default:
// 지금 Scene 재반환 및 화면 정리
Console.WriteLine("올바른 값을 입력하세요.");
Thread.Sleep(1000);
break;
}
}
- 이번 게임은 반응형 게임으로 제작해, 위가 기본 틀이다.
- 각 Scene에 접근하기 위해
Enter()메서드를 활용한다. switch-case를 활용해 각각의 다른 Scene으로 이동한다.
Exit()
public override Scene Exit()
{
return nextScene;
}
nextScene필드는 상위 객체인Scene객체로부터 상속 받은 필드이다.- 다음 Scene을 지정해 반환해 준다.
StatusScene

switch (result)
{
case "0":
// StartScene
nextScene = StartScene.GetInst();
break;
case "1":
// 이름 변경
Clear();
Console.WriteLine("변경할 이름을 입력하세요.");
character.Name = Console.ReadLine();
Console.WriteLine($"이름이 '{character.Name}'로 변경되었습니다.");
Thread.Sleep(1000);
break;
default:
// 지금 Scene 재반환 및 화면 정리
Console.WriteLine("올바른 값을 입력하세요.");
Thread.Sleep(1000);
break;
}
- 해당 Scene에서 이름을 변경 할 수 있도록 제작.
Thread.Sleep()으로 화면이 초기화 되는 것에 딜레이 제공.
InventoryScene

printItem()
private void printItem()
{
Core core = Core.GetInst();
// item 출력
int count = 0;
for (int i = 0; i < core.items.Count; i++)
{
// 장비 장착 옵션
string equip = " ";
// 공격력 or 방어력
string AorD = "";
if (core.items[i].Own)
{
// 방어 장비
if (core.items[i].Defense > 0)
{
AorD = $"방어력 +{core.items[i].Defense}";
}
// 공격 장비
else if (core.items[i].Attack > 0)
{
AorD = $"공격력 +{core.items[i].Attack}";
}
// 장비 장착 유무
if (core.items[i].Equip)
{
count++;
equip = "[E]";
Console.WriteLine($" -{equip}{core.items[i].Name} | {AorD} | {core.items[i].Description}");
}
}
}
}
- 장비 장착 유무를 통해 아이템을 출력한다.
EquipmentScene

SetItemToggle
private void SetItemToggle(int idx)
{
Item item = core.items[idx];
// 아이템 장착 토글
bool equip = item.Equip ? false : true;
Item prevItem;
// 아이템 타입별 한종류만 장착
if (item.ItemTYPE == ITEMTYPE.Weapon)
{
// 무기일 때
prevItem = character.Weapon;
if (prevItem != null)
{
// 이전 장비 해제
MountItem(prevItem, false);
character.Weapon = null;
}
}
else if (item.ItemTYPE == ITEMTYPE.Armor)
{
// 갑옷일 때
prevItem = character.Armor;
if (prevItem != null)
{
// 이전 장비 해제
MountItem(prevItem, false);
character.Armor = null;
}
}
MountItem(item, equip);
}
- 아이템을
idx로 받아, 장착 또는 해제 하는 메서드이다. ITEMTYPE.Weapon을 통해 무기, 방어구를 구분한다.character.Weapon또는character.Armor를 통해 중복 착용을 막는다.
MountItem
public void MountItem(Item item, bool equip)
{
// 아이템 성능 적용
if (equip)
{
character.Attack += item.Attack;
character.Defense += item.Defense;
}
else
{
character.Attack -= item.Attack;
character.Defense -= item.Defense;
}
item.Equip = equip;
if (item.ItemTYPE == ITEMTYPE.Weapon)
character.Weapon = item;
if (item.ItemTYPE == ITEMTYPE.Armor)
character.Armor = item;
}
- 장착 또는 해제의 경우에 아이템의 성능을
characer에 적용 시키는 메서드다. - 장착 때는
+, 해제 때는- character.Weapon, 와character.Armor에 착용 중인 무기와 방어구를 지정한다.
Item
- 아이템 관리를 위해 만든 객체
- 아이템들의 여러 요소들을 가진다.
internal class Item : Object
{
public string Name
{
get { return name; }
set { name = value; }
}
public int Defense { get; set; }
public int Attack { get; set; }
public string? Description { get; set; }
public int Gold { get; set; }
public bool Equip { get; set; }
public bool Own { get; set; }
public ITEMTYPE ItemTYPE { get; set; }
}
ITEMTYPE
- 개인 프로젝트를 하며, 이제껏 사용해 보지 못한 기능들을 사용해보기 위해, 사용해본 enum이다.
- 무기, 방패 등 아이템 타입을 지정 할 enum 값들을 저장한다.
enum ITEMTYPE
{
None,
Weapon,
Armor,
}
C#과 친해지기 위해 평소에 써보지 못했던 enum이나 singleton 등 여러 요소를 일부러 섞어 사용해봤다.
그럼에도 불구 하고 인터페이스는 아직도 개념 이해가 부족해 요번에는 사용하지 못했다.
다음 기회가 있겠지 뭐.
댓글남기기