오후에는 개인 과제를 시작해야 할 것 같아서 오전에 시간이 되는 만큼만 4주차 과제(텍스트RPG)를 진행했다.
* 미완
기본적으로 제공되는 코드는 없었지만, 요구사항이 상세하게 정리되어 있어서 설명을 따라가면 어려움 없이 구조를 짤 수 있었다. 헷갈렸던 부분은 Monster 클래스와 그의 하위 클래스의 활용이었는데, 코드를 고쳐가며 만들다 보니 얼추 괜찮은 구조가 만들어진 것 같다.
[인터페이스 활용]
interface ICharacter
{
string Name { get; }
float Health { get; set; }
float Attack { get; set; }
bool IsDead { get; set; }
void TakeDagame(int damage);
}
게임을 진행하면서 복습이 되거나 명확해지는 개념이 많았다. '인터페이스에서는 실제로 구현을 하는 것이 아니라 제시만 하는 것이다'는 사실을 알고는 있었는데 막상 직접 쓰려고 하니 어떻게 썼더라...?에서 넘어가지지 않았다.
- 메서드의 경우에는 반환타입과 메서드의 시그니쳐(메서드 이름과 파라미터)만 포함시키면 된다.
- 인터페이스에서는 필드를 정의할 수 없다.
- 프로퍼티는 자동 프로퍼티 형식으로 간단하게 -> 클래스에서 세부 로직 정의 가능
- 인터페이스에 정의된 내용들은 모두 public으로 구체화 되어야 함
[전사 클래스]
class Warrior : ICharacter
{
string _name;
float _health;
float _attack;
bool _idDead;
public Warrior()
{
Console.Write("Enter Your Name: ");
string input = Console.ReadLine();
Name = input;
Health = 8000f;
Attack = 5000f;
IsDead = false;
}
public string Name
{
get { return _name; }
set { _name = value; }
}
public float Health
{
get { return _health; }
set { _health = value; }
}
public float Attack
{
get { return _attack; }
set { _attack = value; }
}
public bool IsDead
{
get { return _idDead; }
set { _idDead = value; }
}
public void TakeDagame(int damage)
{
if (Health > damage)
{
Health -= damage;
}
else
{
Health = 0;
}
}
}
- 처음에 잘못 생각해서 TakeDagame() 메서드를 static으로 정의하려 했다. 어떤 객체이든지.간에 로직이 바뀌지는 않는다고 생각했기 때문이다.
- static으로 선언할 경우 non-static 변수를 메서드 내에 포함시킬 수 없다. non-static 변수는 객체에 종속되는데 메서드는 객체와 별개로 작용되기 때문이다.
[몬스터 클래스]
class Monster : ICharacter
{
protected string _name;
protected float _health;
protected float _attack;
bool _idDead;
public Monster(string name, float health, float attack)
{
Name = name;
Health = health;
Attack = attack;
IsDead = false;
}
public string Name
{
get { return _name; }
set { _name = value; }
}
public float Health
{
get { return _health; }
set { _health = value; }
}
public float Attack
{
get { return _attack; }
set { _attack = value; }
}
public bool IsDead
{
get { return _idDead; }
set { _idDead = value; }
}
public void TakeDagame(int damage)
{
if (Health > damage)
{
Health -= damage;
}
else
{
Health = 0;
}
}
}
- 아 자동프로퍼티로 바꿔야지...
[몬스터 하위 클래스]
class Goblin : Monster
{
public Goblin() : base("Goblin", 20000f, 2000f)
{
}
}
class Dragon : Monster
{
public Dragon() : base("Dragon", 50000f, 4000f)
{
}
}
- 상속 관계
- 상위 클래스의 멤버 변수를 하위클래스에서 초기화 하려면 생성자에서 해야 한다. 생성자에서 값 자체를 변경할수도 있지만, base 이니셜라이저를 통하는 방법이 일반적이다. (하위클래스의 생성자 호출 시 상위클래스 생성자 호출)
- 게임 내에서 실제로 사용되는 객체는 Monster 객체이고, 하위클래스들은 상위클래스에 정보만 제공해주는 역할을 하게 된다.
(클래스 내에서 필드 또는 속성의 초기화는 생성자 또는 속성/필드 정의부에서 가능)
[아이템]
class StrengthPotion : IItem
{
string _name = "Strength Potion";
public string Name
{
get { return _name; }
}
public void Use(Warrior warrior)
{
warrior.Attack += 1000; // 3턴 지속되게 하는 법?
}
}
class Stage
{
public Warrior warrior;
public Monster monster;
public HealthPotion healthPotion = new HealthPotion();
public StrengthPotion strengthPotion = new StrengthPotion();
public Stage()
{
warrior = new Warrior();
Start();
}
void Start()
{
Random random = new Random();
int monsterType = random.Next(2);
if (monsterType == 0)
{
monster = new Goblin();
}
else
{
monster = new Dragon();
}
}
}
- 포션에 따른 능력치 향상 기간을 설정하고 싶은데 아직 게임 구현을 하지 않아 보류 중이다.
- Monster 타입의 monster 변수를 선언한 후, 랜덤한 값에 따라서 서로 다른 하위 클래스를 할당했다. 상위클래스를 상속받은 하위클래스는 상위클래스 타입의 변수에 할당될 수 있다.
[테스트]
class Program
{
private static void Main(string[] args)
{
Stage stage1 = new Stage();
Console.WriteLine("Warrior: {0}, HP: {1}, Attack Damage: {2}", stage1.warrior.Name, stage1.warrior.Health, stage1.warrior.Attack);
Console.WriteLine("Monster: {0}, HP: {1}, Attack Damage: {2}", stage1.monster.Name, stage1.monster.Health, stage1.monster.Attack);
}
}
- 원래는 턴제 게임을 구현해야 하지만, 일단은 클래스에 따른 객체가 잘 구현되는지 확인하기 위해 위와 같은 코드를 넣었다.
- 랜덤으로 호출되는 몬스터 종류에 따라 값이 다르게 나온다.
개인과제로 바쁘니까 오늘은 대충 써야지,,
'👾 내일배움캠프 > 🎮 TIL & WIL' 카테고리의 다른 글
내일배움캠프 12일차 TIL - 콘솔꾸미기 (0) | 2023.08.23 |
---|---|
내일배움캠프 11일차 TIL - string에서 숫자 찾기 / Timer (0) | 2023.08.22 |
내일배움캠프 (휴일) TIL - 블랙잭 C# (0) | 2023.08.20 |
내일배움캠프 2주차 WIL - C# 기초 공부 (1) | 2023.08.20 |
내일배움캠프 (휴일) TIL - C# 기초 문법 (4) (0) | 2023.08.19 |