Notice
Recent Posts
Recent Comments
Link
스토리지
과제 5 본문
저그 : 스포닝풀 설치 - 히드라리스크 덴 설치 - 럴커 애스펙트 업데이트 - 럴커 5마리 뽑음
테란 : 배럭 설치 - 아카데미 설치 - 스팀팩 업데이트 - 마린 20마리 뽑음
using System;
namespace Study04
{
public class App
{
public App()
{
Console.WriteLine("프로그램 시작" + "\n");
/*
* 상황
* 저그로 시작, 목표는 럴커 5마리 뽑기
* 상대는 마린 20마리, 10마리 남을 때 스팀팩 사용
*
*/
/*
* 저그 시나리오
* 저그 시작 - 미네랄 채취 - 스포닝풀 건설(미네랄-200, 드론 1마리) -
* 히드라리스크 덴 건설(미네랄-100 가스-50 드론 1마리)
히드라 5마리(미네랄-75, 가스-25, 인구수-1) -
히드라 럴커로 변태 (미네랄-125, 가스-125, 인구수-2)
9드론(미네랄-50 * 9)
인구수 포화 시, 라바가 존재할 때 오버로드 생성(미네랄-100, 인구수+8)
*/
Zerg player1 = new Zerg();
//1차목표 : Spawning Pool 건설
Console.WriteLine("Spawning Pool 건설시작.");
while (!player1.IsSpawningPool)
{
//SpawningPool 건설시도
player1.SpawningPool = player1.CreateSpawningPool();
//건설 성공시
if (player1.IsSpawningPool)
{
break;
}
//건설 실패 시
player1.CreateDrone();
player1.GatheringResource(0);
}
Console.WriteLine("미네랄 : {0}, 가스 : {1}", player1.Mineral, player1.Gas + "\n");
//2차 목표 : Hydralisk Den 건설
Console.WriteLine("Hydralisk Den 건설시작.");
while (!player1.IsHydraliskden)
{
//Hydralisk Den 건설시도
player1.HydraliskDen = player1.CreateHydraliskDen();
//건설 성공시
if (player1.IsHydraliskden)
{
break;
}
//건설 실패 시
player1.CreateDrone();
if (!player1.IsExtractor)
{
player1.GatheringResource(0);
player1.GatheringResource(1);
}
else
{
if (player1.Mineral > player1.Gas)
{
player1.GatheringResource(1);
}
else
{
player1.GatheringResource(0);
}
}
}
Console.WriteLine("미네랄 : {0}, 가스 : {1}", player1.Mineral, player1.Gas);
Console.WriteLine();
//3차 목표 : Lurker Aspect 업그레이드 하기
Console.WriteLine("Lurker Aspect 업그레이드 시도.");
while (!player1.IsLurkerAspect)
{
player1.UpgradeLurkerAspect();
player1.GatheringResource(0);
player1.GatheringResource(1);
}
Console.WriteLine("Lurker Aspect 업그레이드 완료");
Console.WriteLine();
//4차 목표 : Hydralisk 5마리 생성
Console.WriteLine("히드라 5마리 생성시도.");
Hydralisk[] hydraliskArmy = new Hydralisk[5];
int i = 0;
while (player1.NumOfHydralisk < 5)
{
Hydralisk hydra = player1.CreateHydralisk();
if (hydra != null)
{
hydraliskArmy[i++] = hydra;
}
}
Console.WriteLine();
//5차 목표 : 생성된 Hydralisk 5마리를 Lurker로 진화
Console.WriteLine("Hydralisk 5마리를 Lurker로 진화 시도.");
Lurker[] lurkerArmy = new Lurker[5];
for (int x = 0; x < 5; x++)
{
while (!hydraliskArmy[x].isAvailableEvolve(player1))
{
Console.WriteLine("Lurker 변이 실패, 다시 시도중...");
}
Console.WriteLine("변이 완료");
lurkerArmy[x] = new Lurker();
hydraliskArmy[x] = null;
player1.NumOfLurker++;
}
Console.WriteLine();
//6차 목표 : 테란 참전 후 배럭 건설
Terran player2 = new Terran();
do
{
player2.CreateBarracks();
} while (player2.IsBarracks1);
Console.WriteLine();
//7차 목표 : 마린 20마리 생성
Marine[] marineArmy = new Marine[20];
for(int x = 0; x < 20; x++)
{
Marine tmpMarine = null;
while(tmpMarine == null)
{
tmpMarine = player2.CreateMarine();
}
marineArmy[x] = tmpMarine;
}
Console.WriteLine();
//8차 목표 : Academy 건설
while (!player2.IsAcademy1)
{
player2.CreateAcademy();
}
Console.WriteLine();
//9차 목표 : StimPack 업데이트
while (!player2.isStimPack())
{
Console.WriteLine("StimPack 업데이트 실패, 재시도중");
}
Console.WriteLine();
//10차 목표 : 럴커와 마린이 서로 공격함. 럴커 먼저 공격. 한쪽이 없어질때 까지
int m = 0; //몇번째 마린인지 가리키는 변수
int l = 0; //몇번째 럴커인지 가리키는 변수
bool turn = true; //true:럴커 턴 , false:마린 턴
while (true)
{
if (player1.NumOfLurker <= 0)
{
Console.WriteLine("플레이어1 패배");
break;
}
else if (player2.MarineNum <= 0)
{
Console.WriteLine("테란 패배");
break;
}
Lurker tmpLurker = lurkerArmy[l];
Marine tmpMarine = marineArmy[m];
if (turn)
{
tmpLurker.Attack(tmpMarine);
if (tmpMarine.GetHp() <= 0)
{
player2.MarineNum--;
marineArmy[m] = null;
m++;
}
}
else
{
if (player2.MarineNum <= 10 && player2.IsStimPacked1)
{
tmpMarine.AttackStimPack(tmpLurker);
}
else
{
tmpMarine.Attack(tmpLurker);
}
if (tmpLurker.GetHp() <= 0)
{
player1.NumOfLurker--;
lurkerArmy[l] = null;
l++;
}
}
turn = !turn;
Console.WriteLine();
}
}
}
}
using System;
namespace Study04
{
public class Academy
{
bool isStimPack;
public Academy()
{
Console.WriteLine("Academy 건설함.");
}
public bool SetStimPack(Terran terran)
{
if(terran.Mineral >= 100 && terran.Gas >= 100)
{
isStimPack = true;
terran.Mineral -= 100;
terran.Gas -= 100;
Console.WriteLine("Stimpack 업데이트 완료.");
return isStimPack;
}
return isStimPack;
}
}
}
using System;
namespace Study04
{
public class Barracks : Building
{
public Barracks()
{
Console.WriteLine("Barracks 건설함");
this.requireMineral = 150;
this.requireGas = 0;
}
public static Marine CreateMarine()
{
return new Marine();
}
}
}
using System;
namespace Study04
{
public class Building
{
protected int hp;
protected int requireMineral;
protected int requireGas;
public Building()
{
}
}
}
using System;
namespace Study04
{
public class Extractor : Building
{
private int capacity = 5000;
public Extractor()
{
Console.WriteLine("Extrator 건설됨");
this.hp = 750;
}
public int Gas()
{
int oneTimeGas = 8;
capacity -= oneTimeGas;
return oneTimeGas;
}
static public Extractor BuildExtractor(Zerg zerg)
{
if(zerg.Mineral - 50 > 0)
{
zerg.Mineral -= 50;
return new Extractor();
}
else
{
return null;
}
}
}
}
using System;
namespace Study04
{
public class Hydralisk : Unit
{
public Hydralisk()
{
Console.WriteLine("Hydralisk 생성됨.");
this.SetHp(80);
this.SetDamage(10);
}
public bool IsAvailableEvolve(Zerg zerg)
{
bool isAvailableEvolve = false;
if (zerg.IsLurkerAspect)
{
if(zerg.Mineral >= 125 && zerg.Gas >= 125)
{
if(zerg.NumOfnowPeople < zerg.NumOfmaxPeople)
{
Console.WriteLine("Lurker로 변이성공.");
isAvailableEvolve = true;
}
else
{
Console.WriteLine("인구수 부족.");
zerg.CreateOverlord();
}
}
else
{
Console.WriteLine("자원 부족.");
zerg.GatheringResource(0);
zerg.GatheringResource(1);
}
}
return isAvailableEvolve;
}
}
}
using System;
namespace Study04
{
public class HydraliskDen : Building
{
public HydraliskDen()
{
this.hp = 850;
Console.WriteLine("Hydralisk Den 건설됨.");
}
public bool UpgradeLurkerAspect(Zerg zerg)
{
Console.WriteLine("Luerker Aspect 업그레이드 시도합니다.");
if (zerg.Mineral >= 200 && zerg.Gas >= 200)
{
return true;
}
else
{
return false;
}
}
}
}
using System;
namespace Study04
{
public class Lurker : Unit
{
private bool isBurrow;
public Lurker()
{
Console.WriteLine("Lurker 생성됨.");
this.SetHp(125);
this.SetDamage(20);
this.SetRequireMineral(125);
this.SetRequireGas(125);
}
public void SetIsBurrow(bool isBurrow)
{
this.isBurrow = isBurrow;
}
public bool GetIsBurrow()
{
return this.isBurrow;
}
public void Attack(Unit unit)
{
Console.WriteLine("럴커가 공격함.");
unit.SetHp(unit.GetHp() - this.GetDamage());
Console.WriteLine("{0}, 상대의 남은 체력 : {1}",unit.ToString(), unit.GetHp());
}
}
}
using System;
namespace Study04
{
public class Marine : Unit
{
public Marine()
{
Console.WriteLine("마린 생성됨.");
this.SetHp(40);
this.SetDamage(6);
this.SetRequireMineral(50);
this.SetRequireGas(0);
}
public void Attack(Unit unit)
{
Console.WriteLine("마린이 공격함.");
unit.SetHp(unit.GetHp() - this.GetDamage());
Console.WriteLine("{0}, 상대의 남은 체력 : {1}", unit.ToString(), unit.GetHp());
}
public void AttackStimPack(Unit unit)
{
Console.WriteLine("마린이 공격함. (스팀팩 사용)");
unit.SetHp(unit.GetHp() - (int)(this.GetDamage() * 1.75));
Console.WriteLine("{0}, 상대의 남은 체력 : {1}", unit.ToString(), unit.GetHp());
}
}
}
using System;
namespace Study04
{
public class Refinery : Building
{
private int capacity = 5000;
public Refinery()
{
Console.WriteLine("Refinery 건설됨.");
this.requireMineral = 100;
this.requireGas = 0;
}
public int Gas()
{
int oneTimeGas = 8;
capacity -= oneTimeGas;
return oneTimeGas;
}
static public Refinery BuildRefinery(Terran terran)
{
if (terran.Mineral - 100 > 0)
{
terran.Mineral -= 100;
return new Refinery();
}
else
{
return null;
}
}
}
}
using System;
namespace Study04
{
public class SpawningPool : Building
{
public SpawningPool()
{
Console.WriteLine("Spawning Pool 건설됨.");
this.hp = 750;
}
}
}
using System;
namespace Study04
{
public class SupplyDepot : Building
{
public SupplyDepot(Terran terran)
{
Console.WriteLine("Suuply Depot 건설됨.");
terran.NumOfmaxPeople += 8;
}
}
}
using System;
namespace Study04
{
public class Terran : Tribe
{
enum eResource
{
mineral,
gas
}
private Marine marine;
private Barracks barracks;
private Refinery refinery;
private Academy academy;
private int marineNum;
private int scvNum;
private bool IsRefinery;
private bool IsBarracks;
private bool IsAcademy;
private bool IsStimPacked;
public bool IsRefinery1 { get => IsRefinery; set => IsRefinery = value; }
public bool IsBarracks1 { get => IsBarracks; set => IsBarracks = value; }
public int ScvNum { get => scvNum; set => scvNum = value; }
public int MarineNum { get => marineNum; set => marineNum = value; }
public bool IsAcademy1 { get => IsAcademy; set => IsAcademy = value; }
public bool IsStimPacked1 { get => IsStimPacked; set => IsStimPacked = value; }
public Terran()
{
Console.WriteLine("테란 참전");
ScvNum = 4;
this.NumOfnowPeople = 4;
}
public void CreateBarracks()
{
if (this.Mineral >= 150)
{
barracks = new Barracks();
IsBarracks = true;
}
else
{
Console.WriteLine("자원이 부족합니다.");
GatheringResource(0);
}
}
public void CreateAcademy()
{
if (this.Mineral >= 150)
{
academy = new Academy();
IsAcademy = true;
}
else
{
Console.WriteLine("자원이 부족합니다.");
GatheringResource(0);
}
}
public bool isStimPack()
{
if (academy.SetStimPack(this))
{
IsStimPacked = true;
return true;
}
else
{
Console.WriteLine("자원이 부족합니다.");
GatheringResource(0);
GatheringResource(1);
return false;
}
}
public Marine CreateMarine()
{
if (this.Mineral >= 50 && this.NumOfnowPeople < this.NumOfmaxPeople)
{
this.Mineral -= 50;
this.NumOfnowPeople++;
this.marineNum++;
return Barracks.CreateMarine();
}
else if (this.NumOfnowPeople >= this.NumOfmaxPeople)
{
Console.WriteLine("인구수 초과.");
if (this.Mineral >= 100)
{
this.Mineral -= 100;
new SupplyDepot(this);
return null;
}
else
{
Console.WriteLine("자원 부족.");
GatheringResource(0);
return null;
}
}
else
{
Console.WriteLine("자원 부족.");
GatheringResource(0);
return null;
}
}
public void GatheringResource(int resource) //0:미네랄 1:가스
{
if ((eResource)resource == eResource.mineral)
{
this.Mineral += 8 * ScvNum;
}
else
{
if (!IsRefinery)
{
refinery = Refinery.BuildRefinery(this);
if (refinery == null)
{
Console.WriteLine("미네랄이 부족합니다.");
}
else
IsRefinery = true;
}
else
{
this.Gas += refinery.Gas() * ScvNum;
}
}
}
public Academy GetAcademy()
{
return this.academy;
}
}
}
using System;
namespace Study04
{
public class Tribe
{
private int mineral = 100;
private int gas = 20;
private int numOfnowPeople;
private int numOfmaxPeople = 10;
public int Mineral { get => mineral; set => mineral = value; }
public int Gas { get => gas; set => gas = value; }
public int NumOfnowPeople { get => numOfnowPeople; set => numOfnowPeople = value; }
public int NumOfmaxPeople { get => numOfmaxPeople; set => numOfmaxPeople = value; }
public Tribe()
{
}
}
}
using System;
namespace Study04
{
public class Unit
{
private int hp;
private int damage;
private int requireMineral;
private int requireGas;
public Unit()
{
}
public void SetHp(int hp)
{
this.hp = hp;
}
public int GetHp()
{
return this.hp;
}
public void SetDamage(int damage)
{
this.damage = damage;
}
public int GetDamage()
{
return this.damage;
}
public void SetRequireMineral(int mineral)
{
this.requireMineral = mineral;
}
public void SetRequireGas(int gas)
{
this.requireGas = gas;
}
public int GetRequireMineral()
{
return this.requireMineral;
}
public int GetRequireGas()
{
return this.requireGas;
}
}
}
using System;
namespace Study04
{
public class Zerg : Tribe
{
/*
* 해처리 클래스라고 봐도 무방
* 저그의 모든 것을 관리하는 클래스
*/
private int numOfDrone;
private int numOfOverlord;
private int numOfHydralisk;
private int numOfLurker;
private bool isExtractor;
private bool isSpawningPool;
private bool isHydraliskden;
private bool isLurkerAspect;
private SpawningPool spawningPool;
private HydraliskDen hydraliskDen;
private Extractor extractor;
public int NumOfDrone { get => numOfDrone; set => numOfDrone = value; }
public int NumOfOverlord { get => numOfOverlord; set => numOfOverlord = value; }
public bool IsSpawningPool { get => isSpawningPool; set => isSpawningPool = value; }
public SpawningPool SpawningPool { get => spawningPool; set => spawningPool = value; }
public HydraliskDen HydraliskDen { get => hydraliskDen; set => hydraliskDen = value; }
public bool IsHydraliskden { get => isHydraliskden; set => isHydraliskden = value; }
public bool IsLurkerAspect { get => isLurkerAspect; set => isLurkerAspect = value; }
public bool IsExtractor { get => isExtractor; set => isExtractor = value; }
public int NumOfHydralisk { get => numOfHydralisk; set => numOfHydralisk = value; }
public int NumOfLurker { get => numOfLurker; set => numOfLurker = value; }
enum eResource
{
mineral,
gas
}
public Zerg()
{
Console.WriteLine("저그로 시작합니다." + "\n");
Initialize();
}
private void Initialize()
{
NumOfmaxPeople = 10;
NumOfnowPeople = 4;
NumOfDrone = 4;
}
public void CreateOverlord()
{
if(Mineral > 100)
{
NumOfOverlord++;
NumOfmaxPeople += 8;
}
else
{
while(Mineral < 100)
{
GatheringResource(0);
}
}
}
public void CreateDrone()
{
if (this.Mineral > 50 && NumOfnowPeople < NumOfmaxPeople)
{
numOfDrone++;
NumOfnowPeople++;
Mineral -= 50;
}
else if (NumOfnowPeople >= NumOfmaxPeople)
{
CreateOverlord();
}
}
public Hydralisk CreateHydralisk()
{
Hydralisk hydralisk = null;
if (this.isHydraliskden) //필요한 건물이 세워졌는가?
{
if(this.Mineral >= 75 && this.Gas >= 25) //자원은 충분한가?
{
if(NumOfnowPeople < NumOfmaxPeople) //인구수는 만족하는가?
{
hydralisk = new Hydralisk();
this.Mineral -= 75;
this.Gas -= 25;
this.NumOfnowPeople++;
numOfHydralisk++;
}
else //인구수 부족할 떄
{
Console.WriteLine("인구수가 부족합니다.");
CreateOverlord();
}
}
else //자원 부족할 때
{
Console.WriteLine("자원이 부족합니다.");
if(this.Mineral < 75)
{
GatheringResource(0);
}
else
{
GatheringResource(1);
}
}
}
else
{
Console.WriteLine("Hydralisk Den이 건설되지 않았습니다.");
}
return hydralisk;
}
public void GatheringResource(int resource) //0:미네랄 1:가스
{
if ((eResource)resource == eResource.mineral)
{
this.Mineral += 8 * NumOfDrone;
}
else
{
if (!IsExtractor)
{
extractor = Extractor.BuildExtractor(this);
if (extractor == null)
{
Console.WriteLine("미네랄이 부족합니다.");
}
else
IsExtractor = true;
}
else
{
this.Gas += extractor.Gas() * NumOfDrone;
}
}
}
public SpawningPool CreateSpawningPool()
{
if (Mineral >= 200 && NumOfDrone >= 1)
{
Mineral -= 200;
numOfDrone -= 1;
IsSpawningPool = true;
return new SpawningPool();
}
return null;
}
public HydraliskDen CreateHydraliskDen()
{
if (IsSpawningPool && Mineral >= 100 && Gas >= 50 && NumOfDrone >= 1)
{
Mineral -= 100;
Gas -= 50;
numOfDrone -= 1;
isHydraliskden = true;
return new HydraliskDen();
}
return null;
}
public void UpgradeLurkerAspect()
{
isLurkerAspect = hydraliskDen.UpgradeLurkerAspect(this);
}
}
}
다 만들고 나서 깨달은 것은 건물 건설비용을 각자의 건물 클래스에 넣으면 최초로 건물을 지을 때는 알 수가 없다.
다른 곳에다가 저장할 필요가 있음. 유닛도 마찬가지
이름또한 지정안해줬다.
Comments