Menu
CoddyTech

Enum במחלקות

חלק מהיחידה תכנות מונחה עצמים במסלול ה-GDScript של Coddy. שיעור 44 מתוך 65.

אפשר להכריז על enum בתוך מחלקה, לצד המשתנים שלה. האפשרויות שייכות אז למחלקה הזאת:

# 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

בתוך weapon.gd נמצא ה-enum בשם Kind. בכל קובץ אחר כותבים קודם את שם המחלקה, Weapon.Kind.BOW, בערכים, בהערות טיפוס ובתבניות 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

האפשרויות הן עדיין מספרים: Weapon.new(Weapon.Kind.BOW).kind מדפיס 1. ה-enum עצמו פועל כמו מילון שממפה שמות למספרים:

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

הלולאה מדפיסה SWORD: 20, BOW: 15 ו-STAFF: 30. GDScript לא בודק שמספר הוא אחת מהאפשרויות: Weapon.new(7) יוצר נשק שה-kind שלו הוא 7. העבר את האפשרויות בשם, והקוד יישאר תקין.

טיפוס enum שמתאר מחלקה מסוימת שייך בתוך אותה מחלקה, כך שהקורא יראה מאין מגיע Kind בתוך Weapon.Kind.BOW.

challenge icon

אתגר

קל

מיינ/י שיקויים באמצעות enum שמוגדר במחלקה Potion.

  • ב־potion.gd, יש להצהיר על enum Kind { HEAL, MANA, POISON } ולהגדיר את הטיפוס של kind בתור Kind.
  • Potion.from_text(text, strength) היא פונקציה סטטית שהופכת את "MANA" ל־Kind.MANA ומחזירה שיקוי חדש.
  • describe() מחזירה HEAL potion: +20 HP, MANA potion: +15 MP או POISON potion: -5 HP, תוך שימוש בשם הסוג ובעוצמה.
  • ב־belt.gd, הפונקציה summary() מחזירה שורה אחת לכל סוג, לפי הסדר של ה־enum: HEAL: 2 (35 total), עם מספר השיקויים מאותו סוג, ובסוגריים — סכום העוצמות שלהם. גם לסוגים שאין להם שיקויים תופיע שורה.

הקוד שסופק קורא כמה שיקויים מופיעים בהמשך (HEAL 20), מוסיף כל אחד לחגורה, מדפיס את התיאור שלו ואז את הסיכום. עבור HEAL 20, POISON 5, HEAL 15 יודפס:

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)

יש לכתוב את הקוד שלך ב־potion.gd וב־belt.gd. הקובץ main.gd מכיל את קוד הקלט/פלט שסופק, ואי אפשר לערוך אותו.

נסו בעצמכם

extends Node

func _ready():
	# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
	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 iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר GDScript אונליין