Menu
CoddyTech

Enum dalam Class

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 44 dari 65.

enum dapat dideklarasikan di dalam class, di samping variabel-variabelnya. Opsi-opsi tersebut kemudian menjadi milik class itu:

# 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

Di dalam weapon.gd, enum-nya adalah Kind. Setiap file lain menulis nama class terlebih dahulu, Weapon.Kind.BOW, dalam nilai, anotasi tipe, dan pola 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

Opsi tetap berupa angka: Weapon.new(Weapon.Kind.BOW).kind mencetak 1. Enum itu sendiri berfungsi seperti dictionary yang memetakan nama ke angka:

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

Perulangan ini mencetak SWORD: 20, BOW: 15, dan STAFF: 30. GDScript tidak memeriksa apakah suatu angka termasuk salah satu opsi: Weapon.new(7) membuat senjata yang kind-nya bernilai 7. Berikan opsi yang dinamai agar kodemu tetap benar.

Enum yang menjelaskan satu class berada di dalam class tersebut, sehingga pembaca dapat melihat asal Kind dalam Weapon.Kind.BOW.

challenge icon

Tantangan

Mudah

Urutkan potion dengan enum yang berada di class Potion.

  • Di potion.gd, deklarasikan enum Kind { HEAL, MANA, POISON } dan beri kind tipe Kind.
  • Potion.from_text(text, strength) adalah fungsi static yang mengubah "MANA" menjadi Kind.MANA dan mengembalikan potion baru.
  • describe() mengembalikan HEAL potion: +20 HP, MANA potion: +15 MP atau POISON potion: -5 HP, menggunakan nama kind dan strength.
  • Di belt.gd, summary() mengembalikan satu baris untuk setiap kind, sesuai urutan enum: HEAL: 2 (35 total), dengan jumlah potion dari kind tersebut dan, di dalam tanda kurung, jumlah strength-nya. Kind yang tidak memiliki potion tetap mendapat satu baris.

Kode yang disediakan membaca jumlah potion berikutnya (HEAL 20), menambahkan setiap potion ke belt, mencetak deskripsinya, lalu mencetak ringkasan. Untuk HEAL 20, POISON 5, HEAL 15, kode ini mencetak:

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)

Tulis kodemu di potion.gd dan belt.gd. main.gd berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

extends Node

func _ready():
	# Kode input/output yang disediakan: biarkan apa adanya
	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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler GDScript online