반응형
오늘은 클래스의 상속과 인스턴스 관리에 대한 연습을 해봤습니다. Babarian, Giant, Healer의 인스턴스들을 관리하는 UnitControl 클래스와 이에 대한 구현이 본 내용의 핵심입니다. 오늘까지 강의 수강 진행률이 거의 40%. 화이팅~!
class Army
{
protected int _HP;
protected int _MP;
protected int _Speed;
protected int _Attack;
public virtual void Run()
{
Console.Write("Speed : {0}, ", _Speed);
}
public virtual void Attack()
{
// 줄내림
Console.WriteLine();
//
Console.Write("Att : {0}, ");
}
}
class Babarian : Army
{
// 생성자, 기본값 설정
public Babarian()
{
_HP = 100;
_MP = 10;
_Speed = 3;
_Attack = 100;
Console.WriteLine("Babarian Created.");
}
public override void Run()
{
base.Run();
Console.WriteLine(" Babarian is running.");
}
public override void Attack()
{
base.Attack();
Console.WriteLine(" Babarian attacks using Sword");
}
}
class Giant : Army
{
public Giant()
{
_HP = 500;
_MP = 5;
_Speed = 1;
_Attack = 200;
Console.WriteLine("Giant Created.");
}
public override void Run()
{
base.Run();
Console.WriteLine(" Giant is running.");
}
public override void Attack()
{
base.Attack();
Console.WriteLine(" Giant punching!");
}
}
class Healer : Army
{
public Healer()
{
_HP = 50;
_MP = 100;
_Speed = 5;
_Attack = 20;
Console.WriteLine("Healer Created.");
}
public override void Run()
{
base.Run();
Console.WriteLine(" Healer is Flying.");
}
public override void Attack()
{
base.Attack();
Console.WriteLine(" Healer shoots fireball.");
}
}
class UnitControl
{
public enum UNIT
{
NONE,
BABARIAN,
GIANT,
HEALER
}
const int MAX = 10;
Army[] arrArmy;
int indexCount;
public UnitControl()
{
indexCount = 0;
arrArmy = new Army[MAX];
}
public string Menu()
{
Console.WriteLine(" ++ Unit management system ++");
Console.WriteLine(" (1)Create (2)Run (3)Attack (0)Quit");
// Menu에 대한 사용자 입력
return Console.ReadLine();
}
public void CreateUnitMenu()
{
Console.Clear();
Console.WriteLine(" ++ Unit Create ++");
Console.WriteLine(" (1)Babarian (2)Giant (3)Healer (0)Back");
// Unit Create 메뉴에 대한 사용자 입력
UNIT selectedUnit = UNIT.NONE;
string inputString = Console.ReadLine();
if(indexCount >= MAX)
{
Console.WriteLine(" ++ Unit Creation Failed ++ {0}/{1}", indexCount, MAX);
Console.WriteLine();
return;
}
if(inputString.Equals("1") || inputString.Equals("2") || inputString.Equals("3"))
{
selectedUnit = (UNIT)int.Parse(inputString);
}
switch (selectedUnit)
{
case UNIT.NONE: // BACK
indexCount--; // 뒤에서 ++ 수행하므로 먼저 반대로
break;
case UNIT.BABARIAN:
arrArmy[indexCount] = new Babarian();
break;
case UNIT.GIANT:
arrArmy[indexCount] = new Giant();
break;
case UNIT.HEALER:
arrArmy[indexCount] = new Healer();
break;
default:
break;
}
indexCount++;
}
public void UnitRunMenu()
{
Console.Clear();
Console.WriteLine(" >> Unit Run >>");
Console.WriteLine(" (1)Babarian (2)Giant (3)Healer (4)All (0)Back");
// UnitRunMenu에 대한 사용자 입력
UNIT selectedUnit = UNIT.NONE;
string inputString = Console.ReadLine();
if(inputString.Equals("1") || inputString.Equals("2")|| inputString.Equals("3"))
{
selectedUnit = (UNIT)int.Parse(inputString);
UnitRun(selectedUnit);
}
else if(inputString.Equals("4"))
{
UnitRun();
}
else
{
Console.Clear();
}
}
private void UnitRun()
{
for (int i = 0; i < indexCount; i++)
{
arrArmy[i].Run();
}
}
private void UnitRun(UNIT unit)
{
switch (unit)
{
case UNIT.NONE:
break;
case UNIT.BABARIAN:
for(int i = 0; i< indexCount; i++)
{
if (arrArmy[i] is Babarian)
arrArmy[i].Run();
}
break;
case UNIT.GIANT:
for (int i = 0; i < indexCount; i++)
{
if (arrArmy[i] is Giant)
arrArmy[i].Run();
}
break;
case UNIT.HEALER:
for (int i = 0; i < indexCount; i++)
{
if (arrArmy[i] is Healer)
arrArmy[i].Run();
}
break;
default:
break;
}
}
public void UnitAttackMenu()
{
Console.Clear();
Console.WriteLine(" !! Unit Attack !!");
Console.WriteLine(" (1)Babarian (2)Giant (3)Healer (4)All (0)Back");
// UnitRunMenu에 대한 사용자 입력
UNIT selectedUnit = UNIT.NONE;
string inputString = Console.ReadLine();
if (inputString.Equals("1") || inputString.Equals("2") || inputString.Equals("3"))
{
selectedUnit = (UNIT)int.Parse(inputString);
// 선택된 유닛 달리기
UnitRun(selectedUnit);
}
else if (inputString.Equals("4"))
{
// 전체 달리기
UnitRun();
}
else
{
Console.Clear();
}
}
private void UnitAttack()
{
for (int i = 0; i < indexCount; i++)
{
arrArmy[i].Attack();
}
}
private void UnitAttack(UNIT unit)
{
switch (unit)
{
case UNIT.NONE:
break;
case UNIT.BABARIAN:
for (int i = 0; i < indexCount; i++)
{
if (arrArmy[i] is Babarian)
arrArmy[i].Attack();
}
break;
case UNIT.GIANT:
for (int i = 0; i < indexCount; i++)
{
if (arrArmy[i] is Giant)
arrArmy[i].Attack();
}
break;
case UNIT.HEALER:
for (int i = 0; i < indexCount; i++)
{
if (arrArmy[i] is Healer)
arrArmy[i].Attack();
}
break;
default:
break;
}
}
}
class Program
{
static void Main(string[] args)
{
UnitControl control = new UnitControl();
string selectedMenu;
bool isLoop = true;
while(isLoop)
{
selectedMenu = control.Menu();
switch(selectedMenu)
{
case "1": // Creation
control.CreateUnitMenu();
break;
case "2": // Run
control.UnitRunMenu();
break;
case "3": // Attack
control.UnitAttackMenu();
break;
default:
isLoop = false;
break;
}
}
}
}
반응형
'프로그래밍 이야기 > GameDev' 카테고리의 다른 글
[C#] Delegate, Event (0) | 2020.11.26 |
---|---|
C#코딩 연습 - Indexer (0) | 2020.11.21 |
C# 코딩 연습 - 확장 메서드 (0) | 2020.11.15 |
C# 코딩 연습 - 배열기반 달리기 게임 (0) | 2020.11.11 |
C# 코딩 연습 - 랜덤한 두수의 합 다섯 문제 맞추기 (0) | 2020.11.07 |