Menu
CoddyTech

Typy wyliczeniowe w klasach

Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 44 z 65.

Enum można zadeklarować wewnątrz klasy, obok jej zmiennych. Opcje należą wtedy do tej klasy:

# 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

W pliku weapon.gd enum to Kind. W każdym innym pliku najpierw zapisuje się nazwę klasy, Weapon.Kind.BOW, w wartościach, adnotacjach typów i wzorcach 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

Opcje nadal są liczbami: Weapon.new(Weapon.Kind.BOW).kind wypisuje 1. Samo wyliczenie działa jak słownik mapujący nazwy na liczby:

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

Pętla wyświetla SWORD: 20, BOW: 15 i STAFF: 30. GDScript nie sprawdza, czy liczba jest jedną z dostępnych opcji: Weapon.new(7) tworzy broń, której kind ma wartość 7. Przekazuj nazwane opcje, a kod pozostanie poprawny.

Typ wyliczeniowy opisujący daną klasę należy umieścić wewnątrz tej klasy, aby czytelnik widział, skąd pochodzi Kind w Weapon.Kind.BOW.

challenge icon

Wyzwanie

Łatwy

Sortuj mikstury za pomocą wyliczenia znajdującego się w klasie Potion.

  • W pliku potion.gd zadeklaruj enum Kind { HEAL, MANA, POISON } i nadaj zmiennej kind typ Kind.
  • Potion.from_text(text, strength) to funkcja statyczna, która zamienia "MANA" na Kind.MANA i zwraca nową miksturę.
  • describe() zwraca HEAL potion: +20 HP, MANA potion: +15 MP lub POISON potion: -5 HP, używając nazwy rodzaju i jego mocy.
  • W pliku belt.gd funkcja summary() zwraca po jednym wierszu dla każdego rodzaju, w kolejności wyliczenia: HEAL: 2 (35 total), podając liczbę mikstur danego rodzaju oraz w nawiasie sumę ich mocy. Rodzaje, dla których nie ma mikstur, również mają swój wiersz.

Dostarczony kod odczytuje liczbę kolejnych mikstur (HEAL 20), dodaje każdą z nich do pasa, wypisuje jej opis, a następnie podsumowanie. Dla HEAL 20, POISON 5, HEAL 15 wypisuje:

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)

Twój kod umieść w plikach potion.gd i belt.gd. Plik main.gd zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

extends Node

func _ready():
	# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
	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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator GDScript online