Menu
CoddyTech

Enum nelle classi

Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 44 di 65.

Un enum può essere dichiarato all'interno di una classe, accanto alle sue variabili. Le opzioni appartengono quindi a quella 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

Dentro di weapon.gd l'enum è Kind. Ogni altro file scrive prima il nome della classe, Weapon.Kind.BOW, nei valori, nelle annotazioni di tipo e nei pattern 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

Le opzioni sono ancora numeri: Weapon.new(Weapon.Kind.BOW).kind stampa 1. L'enumerazione stessa funziona come un dizionario che associa nomi a numeri:

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

Il ciclo stampa SWORD: 20, BOW: 15 e STAFF: 30. GDScript non verifica che un numero sia una delle opzioni: Weapon.new(7) crea un'arma il cui kind è 7. Passa le opzioni con nome e il codice rimane corretto.

Un'enumerazione che descrive una classe appartiene a quella classe, così chi legge vede da dove viene Kind in Weapon.Kind.BOW.

challenge icon

Sfida

Facile

Ordina le pozioni con un'enumerazione definita nella classe Potion.

  • In potion.gd, dichiara enum Kind { HEAL, MANA, POISON } e assegna a kind il tipo Kind.
  • Potion.from_text(text, strength) è una funzione statica che trasforma "MANA" in Kind.MANA e restituisce una nuova pozione.
  • describe() restituisce HEAL potion: +20 HP, MANA potion: +15 MP oppure POISON potion: -5 HP, usando il nome del tipo e la forza.
  • In belt.gd, summary() restituisce una riga per ogni tipo, nell'ordine dell'enumerazione: HEAL: 2 (35 total), con il numero di pozioni di quel tipo e, tra parentesi, la somma delle loro forze. Anche i tipi senza pozioni hanno una riga.

Il codice fornito legge quante pozioni seguono (HEAL 20), le aggiunge una alla volta alla cintura, stampa la descrizione e poi il riepilogo. Per HEAL 20, POISON 5, HEAL 15 stampa:

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)

Il tuo codice va inserito in potion.gd e belt.gd. main.gd contiene il codice fornito per l'input/output e non può essere modificato.

Provalo tu

extends Node

func _ready():
	# Codice di input/output fornito: lascialo così com'è
	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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore GDScript online