스토리지

과제 5 본문

Unity/수업과제

과제 5

ljw4104 2021. 3. 14. 20:48

Study04.zip
0.10MB

저그 : 스포닝풀 설치 - 히드라리스크 덴 설치 - 럴커 애스펙트 업데이트 - 럴커 5마리 뽑음

테란 : 배럭 설치 - 아카데미 설치 - 스팀팩 업데이트 - 마린 20마리 뽑음

상속 개요 1
상속 개요 2

 

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);
        }
    }
}

다 만들고 나서 깨달은 것은 건물 건설비용을 각자의 건물 클래스에 넣으면 최초로 건물을 지을 때는 알 수가 없다.
다른 곳에다가 저장할 필요가 있음. 유닛도 마찬가지

이름또한 지정안해줬다.

 

'Unity > 수업과제' 카테고리의 다른 글

과제 7  (0) 2021.03.17
과제 6  (0) 2021.03.16
과제 4  (0) 2021.03.12
과제3  (0) 2021.03.10
과제 2  (0) 2021.03.09
Comments