using System.ComponentModel;
using System.Numerics;
using System.Threading;
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;
}
enum MonsterType
{
None = 0,
Slime = 1, // 슬라임
Orc = 2, // 오크
Skeleton = 3 // 스켈레톤
}
struct Monster
{
public int hp;
public int attack;
public MonsterType type;
}
static void CreateRandomMonster(out Monster monster)
{
Random rand = new Random();
int randMonster = rand.Next(1, 4); // 1 ~ 3 중 랜덤 정수
switch (randMonster)
{
case (int)MonsterType.Slime:
Console.WriteLine("슬라임이 스폰 되었습니다!");
monster.hp = 20;
monster.attack = 2;
monster.type = MonsterType.Slime;
break;
case (int)MonsterType.Orc:
Console.WriteLine("오크가 스폰 되었습니다!");
monster.hp = 40;
monster.attack = 4;
monster.type = MonsterType.Orc;
break;
case (int)MonsterType.Skeleton:
Console.WriteLine("스켈레톤이 스폰 되었습니다!");
monster.hp = 30;
monster.attack = 3;
monster.type = MonsterType.Skeleton;
break;
default:
monster.hp = 0;
monster.attack = 0;
monster.type = MonsterType.None;
break;
}
}
static void Fight(ref Player player, ref Monster monster)
{
while (true)
{
// 플레이어 공격
monster.hp -= player.attack;
if (monster.hp <= 0)
{
Console.WriteLine("승리했습니다!");
Console.WriteLine($"남은 체력: {player.hp}");
break;
}
// 몬스터 반격
player.hp -= monster.attack;
if (player.hp <= 0)
{
Console.WriteLine("패배했습니다!");
break;
}
}
}
static void EnterField(ref Player player)
{
Console.WriteLine("필드에 접속했습니다!");
Monster monster;
CreateRandomMonster(out monster);
Console.WriteLine("[1] 전투 모드로 돌입");
Console.WriteLine("[2] 일정 확률로 마을로 도망");
string input = Console.ReadLine();
if (input == "1")
{
Fight(ref player, ref monster);
}
else if (input == "2")
{
Random rand = new Random();
int randValue = rand.Next(0, 101);
if (randValue <= 33)
{
Console.WriteLine("도망치는데 성공했습니다!");
}
else
{
Fight(ref player, ref monster);
}
}
}
static void EnterGame(ref Player player)
{
while (true)
{
Console.WriteLine("마을에 접속했습니다.");
Console.WriteLine("[1] 필드로 나가기");
Console.WriteLine("[2] 로비로 돌아가기");
string input = Console.ReadLine();
switch (input)
{
case "1":
EnterField(ref player);
break;
case "2":
return;
}
}
}
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 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;
}
}
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;
// }
//}
while (true)
{
ClassType choice = ChooseClass();
if (choice == ClassType.None)
continue;
Player player;
CreatePlayer(choice, out player);
Console.WriteLine($"당신의 직업: {player.type}");
Console.WriteLine($"체력(HP): {player.hp}, 공격력(Attack): {player.attack}");
EnterGame(ref player);
}
}
}
}
Fight 메서드 - 전투 시스템 static void Fight(ref Player player, ref Monster monster)
{
while (true)
{
// 플레이어 공격
monster.hp -= player.attack;
if (monster.hp <= 0)
{
Console.WriteLine("승리했습니다!");
Console.WriteLine($"남은 체력: {player.hp}");
break;
}
// 몬스터 반격
player.hp -= monster.attack;
if (player.hp <= 0)
{
Console.WriteLine("패배했습니다!");
break;
}
}
}
✅ 전투 흐름
1. 플레이어가 몬스터를 공격 → 몬스터 체력이 0 이하이면 승리.
2. 몬스터가 반격 → 플레이어 체력이 0 이하이면 패배.
✅ ref를 사용한 이유
player와 monster 데이터를 직접 수정. Random rand = new Random();
int randValue = rand.Next(0, 101);
if (randValue <= 33)
{
Console.WriteLine("도망치는데 성공했습니다!");
}
else
{
Fight(ref player, ref monster);
}
✅ 33% 확률로 도망 성공
✅ 실패 시 강제 전투