Menu
CoddyTech

העתקת מילונים

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-GDScript של Coddy. שיעור 22 מתוך 78.

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

var template := {"type": "slime", "hp": 30}
var enemy := template
enemy["hp"] = 10
print(template["hp"]) # 10

duplicate() יוצרת מילון חדש עם אותם זוגות. שינוי העותק אינו משפיע על המקור:

var original := {"type": "slime", "hp": 30}
var copy := original.duplicate()
copy["hp"] = 99
print(original["hp"]) # 30

duplicate() יוצרת העתקה שטחית: להעתקה יש זוגות משלה, אבל ערך שהוא מערך או מילון עדיין משותף לשניהם:

var hero := {"stats": {"hp": 100}, "items": ["sword"]}
var clone := hero.duplicate()
clone["stats"]["hp"] = 1
clone["items"].append("shield")
print(hero)
{ "stats": { "hp": 1 }, "items": ["sword", "shield"] }

העבירו true כדי ליצור עותק עמוק: duplicate(true) מעתיקה גם כל מערך ומילון שבתוכה, כך שאין ביניהם שום דבר משותף:

var twin := hero.duplicate(true)
twin["stats"]["hp"] = 50
print(hero["stats"]["hp"]) # 1

עותק שטחי מספיק כשכל הערכים הם מספר, מחרוזת או ערך בוליאני. ברגע שערך הוא מערך או מילון, השתמשו ב־duplicate(true). מערכים פועלים באותו אופן: grid.duplicate(true) מעתיק מערך דו־ממדי יחד עם השורות שלו.

challenge icon

אתגר

קל

יוצרים גל אויבים מתבנית. המילון template נתון. התוכנית קוראת שני מספרים שלמים, אחד בכל שורה: כמה אויבים ליצור (n) ובונוס hp.

עבור כל מספר אויב i מ־1 עד n:

  1. יוצרים עותק של template שאינו חולק איתו דבר.
  2. מוסיפים את המפתח "id" עם הערך i.
  3. מוסיפים bonus * i לערך "hp" שבתוך "stats".
  4. אם זה האויב האחרון, מוסיפים לסוף "crown" בתוך "loot" שלו.
  5. מדפיסים את האויב.

לבסוף, מדפיסים את Template: ואחריו את התבנית, שחייבת להישאר ללא שינוי. עבור הקלטים 2 ו־10, הפלט הוא:

{ "type": "slime", "stats": { "hp": 40, "speed": 2 }, "loot": ["gel"], "id": 1 }
{ "type": "slime", "stats": { "hp": 50, "speed": 2 }, "loot": ["gel", "crown"], "id": 2 }
Template: { "type": "slime", "stats": { "hp": 30, "speed": 2 }, "loot": ["gel"] }

נסו בעצמכם

extends Node

func _ready():
	var template := {"type": "slime", "stats": {"hp": 30, "speed": 2}, "loot": ["gel"]}
	var n := int(OS.read_string_from_stdin())
	var bonus := int(OS.read_string_from_stdin())

	# צור והדפס את n האויבים

	# הדפס את התבנית
	pass
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

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