Menu
CoddyTech

게임 캐릭터 개발

Coddy GDScript 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 65개 중 64번째.

challenge icon

챌린지

중급

롤플레잉 게임의 캐릭터를 구현하세요. 추상 클래스 Character, 이를 확장하는 세 클래스, 그리고 캐릭터가 배우는 능력을 만드세요.

character.gd의 Character는 @abstract 클래스입니다.

  • 속성: character_name(생성자에서 설정), level 1, max_health와 health 100.0, max_mana와 mana 50, strength, intelligence, agility 10, defense 5, 그리고 Array[Ability]인 abilities. 체력 값은 float이고, 나머지 능력치는 int입니다.
  • 시그널 defeated(character_name: String).
  • 추상 메서드 class_title() -> String과 attack_power() -> float.
  • level_up() -> String: 레벨 +1, 최대 체력 +10, 최대 마나 +5, 힘, 지능, 민첩성, 방어력 +1; 체력과 마나는 최댓값까지 회복됩니다. NAME reached level N!을 반환합니다.
  • attack(target): NAME attacks TARGET을 출력한 다음 target.take_damage(attack_power())를 반환합니다.
  • take_damage(amount) -> float: 피해량은 amount - defense * 0.5이며, 최소 1.0입니다. 체력은 그만큼 감소하며 0.0 아래로 내려가지 않습니다. 소수점 첫째 자리까지 표시하여 NAME takes D damage (HP H)를 출력하고, 이 공격으로 체력이 0이 되면 defeated를 발생시키며, 피해량을 반환합니다.
  • is_alive(): 체력이 0보다 큰지 확인합니다. learn_ability(ability)는 abilities에 능력을 추가합니다.
  • use_ability(index, target) -> float: 인덱스가 abilities의 범위를 벗어나면 NAME has no ability INDEX를 출력하고 0.0을 반환합니다. 그렇지 않으면 능력의 use()가 반환하는 값을 반환합니다.
  • _to_string(): NAME the TITLE (level L): HP H/MAX, mana M/MAX, STR S, INT I, AGI A, DEF D 형식이며, 체력은 소수점 첫째 자리까지 표시합니다.

각 하위 클래스는 부모 생성자를 호출한 다음 자체 시작 능력치를 설정합니다(나머지는 기본값을 유지합니다). class_title()은 클래스 이름을 반환하며, level_up()은 super()를 사용해 재정의합니다.

  • Warrior: 체력 150.0, 마나 30, 힘 15, 지능 5, 방어력 8; 공격력은 strength * 1.2; 레벨 업 시 힘도 +2, 최대 체력도 +10 증가합니다(체력 회복).
  • Mage: 체력 80.0, 마나 150, 힘 5, 지능 20, 방어력 3; 공격력은 intelligence * 0.4; 일반 공격 후 마나를 5 회복합니다(최댓값을 넘지 않음). 레벨 업 시 지능도 +2, 최대 마나도 +15 증가합니다(마나 회복).
  • Rogue: 체력 100.0, 마나 60, 힘 12, 지능 8, 민첩성 18, 방어력 4; 공격력은 strength * 0.5 + agility * 0.7; 레벨 업 시 민첩성도 +2 증가합니다.

ability.gd의 Ability: 생성자는 ability_name, mana_cost(int), damage(float)를 받습니다. use(user, target) -> float는 사용자의 마나가 비용보다 적으면 USER does not have enough mana for ABILITY를 출력하고 0.0을 반환합니다. 그렇지 않으면 마나를 소모하고 USER casts ABILITY on TARGET을 출력한 다음 target.take_damage(damage + user.intelligence * 0.5)를 반환합니다.

제공된 코드는 모든 캐릭터의 defeated 시그널에 연결하여 NAME is defeated!를 출력합니다. 다음 입력에서:

hero warrior|Aragorn
hero rogue|Orc
attack Aragorn|Orc
attack Orc|Aragorn
level Aragorn
status Aragorn

출력은 다음과 같습니다.

Aragorn attacks Orc
Orc takes 16.0 damage (HP 84.0)
Orc attacks Aragorn
Aragorn takes 14.6 damage (HP 135.4)
Aragorn reached level 2!
Aragorn the Warrior (level 2): HP 170.0/170.0, mana 35/35, STR 18, INT 6, AGI 11, DEF 9

코드는 character.gd, warrior.gd, mage.gd, rogue.gd, ability.gd에 작성하세요. main.gd에는 제공된 입력/출력 코드가 있으며 수정할 수 없습니다.

직접 해보기

extends Node

func _ready():
	# 제공된 입출력 코드: 그대로 유지하세요

	var heroes := {}

	var line := OS.read_string_from_stdin()
	while line != "":
		var parts := line.split(" ", true, 1)
		var f: PackedStringArray = parts[1].split("|") if parts.size() > 1 else PackedStringArray()
		match parts[0]:
			"hero":
				var hero: Character
				match f[0]:
					"warrior":
						hero = Warrior.new(f[1])
					"mage":
						hero = Mage.new(f[1])
					"rogue":
						hero = Rogue.new(f[1])
				hero.defeated.connect(func(who): print(who, " is defeated!"))
				heroes[f[1]] = hero
			"learn":
				heroes[f[0]].learn_ability(Ability.new(f[1], int(f[2]), float(f[3])))
			"attack":
				heroes[f[0]].attack(heroes[f[1]])
			"cast":
				heroes[f[0]].use_ability(int(f[1]), heroes[f[2]])
			"level":
				print(heroes[f[0]].level_up())
			"status":
				print(heroes[f[0]])

		line = OS.read_string_from_stdin()

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 GDScript 컴파일러