Menu
CoddyTech

Enums dans les classes

Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 44 sur 65.

Une énumération peut être déclarée à l’intérieur d’une classe, à côté de ses variables. Les options appartiennent alors à cette classe :

# weapon.gd
class_name Weapon
extends RefCounted

enum Kind { SWORD, BOW, STAFF }

var kind: Kind

func _init(weapon_kind: Kind) -> void:
	kind = weapon_kind

func is_ranged() -> bool:
	return kind == Kind.BOW or kind == Kind.STAFF

Dans weapon.gd, l’énumération est Kind. Tous les autres fichiers écrivent d’abord le nom de la classe, Weapon.Kind.BOW, dans les valeurs, les annotations de type et les motifs de match :

# blacksmith.gd
class_name Blacksmith
extends RefCounted

static func repair_cost(kind: Weapon.Kind) -> int:
	match kind:
		Weapon.Kind.SWORD:
			return 20
		Weapon.Kind.BOW:
			return 15
	return 30

Les options sont toujours des nombres : Weapon.new(Weapon.Kind.BOW).kind affiche 1. L’énumération elle-même fonctionne comme un dictionnaire associant des noms à des nombres :

print(Weapon.Kind.keys())       # ["SWORD", "BOW", "STAFF"]
print(Weapon.Kind.find_key(1))  # BOW
print(Weapon.Kind["STAFF"])     # 2
print(Weapon.Kind.size())       # 3
for kind in Weapon.Kind.values():
	print(Weapon.Kind.find_key(kind), ": ", Blacksmith.repair_cost(kind))

La boucle affiche SWORD: 20, BOW: 15 et STAFF: 30. GDScript ne vérifie pas qu’un nombre fait partie des options : Weapon.new(7) crée une arme dont kind vaut 7. Passe les options nommées et le code restera correct.

Une énumération qui décrit une classe doit se trouver à l’intérieur de cette classe, afin que le lecteur voie d’où vient Kind dans Weapon.Kind.BOW.

challenge icon

Défi

Facile

Trie les potions avec une énumération qui se trouve dans la classe Potion.

  • Dans potion.gd, déclare enum Kind { HEAL, MANA, POISON } et donne à kind le type Kind.
  • Potion.from_text(text, strength) est une fonction statique qui transforme "MANA" en Kind.MANA et renvoie une nouvelle potion.
  • describe() renvoie HEAL potion: +20 HP, MANA potion: +15 MP ou POISON potion: -5 HP, en utilisant le nom du type et sa puissance.
  • Dans belt.gd, summary() renvoie une ligne par type, dans l’ordre de l’énumération : HEAL: 2 (35 total), avec le nombre de potions de ce type et, entre parenthèses, la somme de leur puissance. Les types sans potion ont aussi une ligne.

Le code fourni lit le nombre de potions qui suivent (HEAL 20), ajoute chacune à la ceinture, affiche sa description puis le récapitulatif. Pour HEAL 20, POISON 5, HEAL 15, il affiche :

Added HEAL potion: +20 HP
Added POISON potion: -5 HP
Added HEAL potion: +15 HP
HEAL: 2 (35 total)
MANA: 0 (0 total)
POISON: 1 (5 total)

Ton code va dans potion.gd et belt.gd. main.gd contient le code fourni pour les entrées et sorties et ne peut pas être modifié.

Essayez vous-même

extends Node

func _ready():
	# Code d'entrée/sortie fourni : conservez-le tel quel
	var belt := Belt.new()
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		var potion := Potion.from_text(parts[0], int(parts[1]))
		belt.add(potion)
		print("Added ", potion.describe())
	for line in belt.summary():
		print(line)
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur GDScript en ligne