C#/복습
클래스 연습
Game Client Lee Hwanguk
2023. 1. 14. 03:57
#1 벌쳐와 마인. 벌쳐 인스턴스와 마인 인스턴스를 만들고 마인이설치되면 수가 줄어든다
#mine이 null이 아니라면 설치 후 null로 바꿔준다
#vulture에 있는 mine은 메서드가 실행될때마다 null로 바뀐다, 모두 null이면 else문 실행
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Practice02
{
class App //#클래스연습1 Vulture 와 SpiderMine
{
//맴버변수
public App()
{
Vulture vulture=new Vulture("벌쳐 1호기"); //벌처는 마인을 심을수있다(메서드 InstallMine)
SpiderMine mine0 = new SpiderMine();
SpiderMine mine1 = new SpiderMine();
SpiderMine mine2 = new SpiderMine();
vulture.mine0 = mine0;
vulture.mine1 = mine1;
vulture.mine2 = mine2;
vulture.InstallMine(); //2/3
vulture.InstallMine(); //1/3
vulture.InstallMine(); //0/3
vulture.InstallMine(); //-1/3 -> x
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Practice02
{
internal class Vulture
{
public SpiderMine mine0;
public SpiderMine mine1;
public SpiderMine mine2;
public int mineCount; //null check
public int mineMaxCount = 3;
public Vulture(string name)
{
mineCount = mineMaxCount; //벌쳐는 마인을 최대 갯수를 가지고 태어난다
Console.WriteLine("{0}이(가) 생성되었습니다.",name);
Console.WriteLine("마인을 {0}/{0} 가지고있습니다",mineMaxCount);
}
public void InstallMine()
{
if (mine0 != null)
{
mine0 = null;
this.mineCount--;
Console.WriteLine("마인을 설치했다. {0}/{1}", mineCount, mineMaxCount);
}
else if (mine1 != null)
{
mine1 = null;
this.mineCount--;
Console.WriteLine("마인을 설치했다. {0}/{1}", mineCount, mineMaxCount);
}
else if (mine2 != null)
{
mine2= null;
this.mineCount--;
Console.WriteLine("마인을 설치했다. {0}/{1}", mineCount, mineMaxCount);
}
else { Console.WriteLine("마인이 없습니다."); }
}
}
}
#2 마린 두마리의 전투
#메서드 안에 메서드(this. 과 target, 을 잘봐야한다)
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Practice02
{
class App //#클래스연습2 매개변수가 있는 클래스(마린 두마리의 전투)
{
//맴버변수
public App()
{
Marine marine0=new Marine("이환국",50,6); //마린0 생성(name: "이환국" hp:50 damage:6)
Marine marine1=new Marine("김동준",55,5); //마린1 생성(name: "김동준" hp:55 damage:5)
marine0.Attack(marine1);
marine1.Attack(marine0);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Practice02
{
internal class Marine
{
public string name;
public int hp;
public int damage;
public int maxHp;
public Marine(string name,int hp,int damage)
{
this.maxHp = hp;
this.name = name;
this.hp = hp;
this.damage = damage;
Console.WriteLine("name:{0} hp:{1}/{2} damage:{3}",name,hp,maxHp,damage);
}
public void Attack(Marine target)
{
Console.WriteLine("{0}이 {1}에게 {2}의 공격을 했다",this.name,target.name,this.damage);
target.Hit(this.damage);
}
void Hit(int damage)
{
this.hp = hp - damage;
Console.WriteLine("{0}의 체력 {1}/{2}",this.name,this.hp,maxHp);
Console.WriteLine();
}
}
}
#Medic을 추가해서 Heal 메서드를 사용해보자 (Heal 을하면 medicMp가 감소한다)
#예외사항 처리 , healTarget의 hp가 maxHp보다 많으면 치료불가
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Practice02
{
class App //#클래스연습2_1 매개변수가 있는 클래스(마린 두마리의 전투) , 메딕이 치료한다
{
//맴버변수
public App()
{
Marine marine0=new Marine("이환국",50,6); //마린0 생성(name: "이환국" hp:50 damage:6)
Marine marine1=new Marine("김동준",55,5); //마린1 생성(name: "김동준" hp:55 damage:5)
marine0.Attack(marine1);
marine1.Attack(marine0);
Medic medic0 = new Medic("메딕",4.21f,50);
medic0.Heal(marine1); //김동준 치료
medic0.Heal(marine0); //이환국 치료
medic0.Heal(marine0);
medic0.Heal(marine0); //치료 불가
medic0.Heal(marine0); //치료 불가
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Practice02
{
internal class Medic
{
public string name;
public float medicHeal;
public int medicMp;
public int medicMaxMp=150;
public Medic(string name, float medicHeal, int medicMp)
{
this.name = name;
this.medicHeal = medicHeal;
this.medicMp = medicMp;
Console.WriteLine("{0}이 생성되었습니다. {1}/{2}",this.name,this.medicMp,this.medicMaxMp);
}
//예외사항 처리 , 1. 마린의 체력이 꽉차면 치료불가
public void Heal(Marine healTarget)
{
healTarget.hp=healTarget.hp+(int)this.medicHeal; //int와 float은 산술연산이 안된다 float을 (int) 명시적 변환필요
if(healTarget.maxHp>= healTarget.hp)
{
Console.WriteLine("{0}을 치료했습니다.{1}/{2}", healTarget.name, healTarget.hp, healTarget.maxHp);
Console.WriteLine();
MedicMp();
}
else
{
Console.WriteLine("더이상 치료할수 없다.");
}
}
public void MedicMp()
{
this.medicMp = medicMp - 5; //메딕이 치료할때마다 5의 mp가 소모된다
Console.WriteLine("{0}은 치료를하고 에너지가 {1}/{2}남았다",this.name,this.medicMp,this.medicMaxMp);
}
}
}
#처음 맴버변수, 지역변수 에 무엇을 넣을지가 중요하다
#어떤 변수를 변하게 하고 어떤 변수를 변하지않게할지
#3 시즈탱크의 공성모드,탱크모드(열거형식에 seigetankMode)를 넣고 활용해보자
# 공성모드(seigemode)일때 공격력 70, 이동 불가
#탱크모드(tank)일때 공격력 30,이동 가능
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Practice02
{
internal class SeigeTank
{
enum ModeType
{
SEIGEMODE,
TANKMODE
}
ModeType mode;
public int damage = 30;
public SeigeTank()
{
this.mode = ModeType.TANKMODE; //TANKMODE로 태어난다
Console.WriteLine("시즈탱크 생성 Mode:{0}.damage:{1}",this.mode ,this.damage);
}
public void ChangeMode() //TANKMODE ->SEIGEMODE로 바꿔본다 (damage변경)
{
if (this.mode == ModeType.TANKMODE)
{
this.mode = ModeType.SEIGEMODE;
this.damage = 70;
}
else
{
this.mode = ModeType.TANKMODE;
this.damage = 30;
}
Console.WriteLine("Mode:{0} damage{1}", mode, damage);
}
public void Move()
{
if (this.mode == ModeType.TANKMODE)
{
Console.WriteLine("이동합니다");
}
else
{
Console.WriteLine("이동 불가");
}
}
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Practice02
{
class App //#클래스연습3 seigeTank의 공성모드(seigeMode), 탱크모드(tankMode) enum 사용
{
public App()
{
SeigeTank seigeTank=new SeigeTank();
seigeTank.ChangeMode(); //TANK ->SEIGEMODE
seigeTank.Move(); //이동불가
seigeTank.ChangeMode(); //SEIGEMODE->TANK
seigeTank.Move(); //이동가능
}
}
}