using System.ComponentModel;
using System.Numerics;
namespace CSharp
{
internal class Program
{
// 작은것을 만들어 보는 연습
// TextRPG
enum ClassType
{
None = 0,
Knight = 1,
Archer = 2,
Mage = 3
}
struct Player
{
public int hp;
public int attack;
public ClassType type;
}
static ClassType ChooseClass()
{
ClassType choice = ClassType.None;
Console.WriteLine("직업을 선택하세요");
Console.WriteLine("[1] 기사");
Console.WriteLine("[2] 궁수");
Console.WriteLine("[3] 법사");
string input = Console.ReadLine();
// 수업
switch (input)
{
case "1": choice = ClassType.Knight; break;
case "2": choice = ClassType.Archer; break;
case "3": choice = ClassType.Mage; break;
}
return choice;
//switch (input)
//{
// case "1": return ClassType.Knight;
// case "2": return ClassType.Archer;
// case "3": return ClassType.Mage;
// default:
// Console.WriteLine("잘못된 입력입니다. 다시 입력하세요.");
// break;
//}
}
static void Main(string[] args)
{
//// 함수로 묶어서 사용하고 싶다
//ClassType choice = ClassType.None;
//while (choice != ClassType.None) // 유효한 입력이 들어올 때까지 반복
//{
// Console.WriteLine("직업을 선택하세요");
// Console.WriteLine("[1] 기사");
// Console.WriteLine("[2] 궁수");
// Console.WriteLine("[3] 법사");
// // enum으로 가지고 있을것
// string input = Console.ReadLine();
// //if(input == "1" || input == "2" || input == "3")
// //{
// //}
// switch(input)
// {
// case "1": choice = ClassType.Knight; break;
// case "2": choice = ClassType.Archer; break;
// case "3": choice = ClassType.Mage; break;
// default:
// Console.WriteLine("잘못된 입력입니다. 다시 입력하세요.");
// break;
// }
// //if(choice != ClassType.None)
// //{
// // break;
// //}
//}
//static void CreatePlayer(ClassType choice, out int hp, out int attack)
//{
// switch(choice)
// {
// case ClassType.Knight:
// hp = 100;
// attack = 100;
// break;
// case ClassType.Archer:
// hp = 75;
// attack = 12;
// break;
// case ClassType.Mage:
// hp = 50;
// attack = 15;
// break;
// default:
// hp = 0;
// attack = 0;
// break;
// }
//}
static void CreatePlayer(ClassType choice, out Player player)
{
player.type = choice; // 선택한 직업 저장
// 직업별 능력치 설정
switch (choice)
{
case ClassType.Knight:
player.hp = 100;
player.attack = 10;
break;
case ClassType.Archer:
player.hp = 75;
player.attack = 12;
break;
case ClassType.Mage:
player.hp = 50;
player.attack = 15;
break;
default:
player.hp = 0;
player.attack = 0;
break;
}
}
while (true)
{
ClassType choice = ChooseClass();
if (choice != ClassType.None)
{
break;
//int hp;
//int attack;
//// 캐릭터 생성
//// 기사(100/10) 궁수 (75/12) 법사(50/15)
//CreatePlayer(choice, out hp, out attack);
Player player;
CreatePlayer(choice, out player);
Console.WriteLine($"당신의 직업: {player.type}");
Console.WriteLine($"체력(HP): {player.hp}, 공격력(Attack): {player.attack}");
}
}
}
}
}
## **3️⃣ 코드 분석 (상세 설명)**
### **📌 1) 직업(Enum) 정의**
```csharp
enum ClassType
{
None = 0,
Knight = 1,
Archer = 2,
Mage = 3
}
enum)을 사용하여 직업을 숫자로 관리 None = 0 → 기본값 (선택되지 않음) Knight = 1 → 기사 Archer = 2 → 궁수 Mage = 3 → 마법사 📌 enum을 사용하면?
if (choice == ClassType.Knight) 같은 비교가 직관적 struct Player
{
public int hp;
public int attack;
public ClassType type;
}
struct를 사용하여 플레이어 정보를 하나의 데이터 구조로 관리 struct는 값 타입(value type) 이므로 스택(stack)에 저장됨 → 메모리 효율적 📌 ✅ 구조체(Struct) 특징
static ClassType ChooseClass()
{
while (true)
{
Console.WriteLine("직업을 선택하세요");
Console.WriteLine("[1] 기사");
Console.WriteLine("[2] 궁수");
Console.WriteLine("[3] 법사");
string input = Console.ReadLine();
switch (input)
{
case "1": return ClassType.Knight;
case "2": return ClassType.Archer;
case "3": return ClassType.Mage;
default:
Console.WriteLine("잘못된 입력입니다. 다시 입력하세요.");
break;
}
}
}
📌 ✅ 개선된 점
while (true) 반복"잘못된 입력입니다." 메시지를 출력 후 다시 입력 요청switch 문에서 직접 return하여 깔끔한 코드 유지 static void CreatePlayer(ClassType choice, out Player player)
{
player.type = choice;
switch (choice)
{
case ClassType.Knight:
player.hp = 100;
player.attack = 10;
break;
case ClassType.Archer:
player.hp = 75;
player.attack = 12;
break;
case ClassType.Mage:
player.hp = 50;
player.attack = 15;
break;
default:
player.hp = 0;
player.attack = 0;
break;
}
}
📌 ✅ out 키워드 활용
out을 사용하면 함수 내부에서 값을 반드시 설정해야 하므로 안정성 증가player 구조체가 완전히 초기화됨📌 ✅ 직업별 능력치 설정
static void Main(string[] args)
{
while (true)
{
ClassType choice = ChooseClass(); // 직업 선택
if (choice != ClassType.None)
{
Player player;
CreatePlayer(choice, out player); // 플레이어 생성
Console.WriteLine($"당신의 직업: {player.type}");
Console.WriteLine($"체력(HP): {player.hp}, 공격력(Attack): {player.attack}");
}
}
}
📌 ✅ while (true) 활용
ClassType.None이 아닐 경우 플레이어 정보 출력📌 ✅ Console.WriteLine을 활용한 직업 정보 출력