复制字典
本课属于 Coddy GDScript 学习旅程的“逻辑与流程”单元。第 22 课,共 78 课。
将字典赋值给另一个变量并不会复制字典。这两个变量指向同一个字典,因此通过其中一个变量所做的更改,也会反映在另一个变量中:
var template := {"type": "slime", "hp": 30}
var enemy := template
enemy["hp"] = 10
print(template["hp"]) # 10duplicate() 会创建一个包含相同键值对的新字典。修改副本不会影响原字典:
var original := {"type": "slime", "hp": 30}
var copy := original.duplicate()
copy["hp"] = 99
print(original["hp"]) # 30duplicate() 会创建浅拷贝:副本有自己的键值对,但如果某个值是数组或字典,它仍会由两者共享:
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) 会连同行一起复制二维数组。
挑战
简单根据模板生成一波敌人。给定字典 template。程序会读取两个整数,每行一个:要生成的敌人数(n)和 hp 加成。
对于从 1 到 n 的每个敌人编号 i:
- 复制一份
template,使副本与原模板完全独立。 - 添加键
"id",值为i。 - 将
bonus * i加到"stats"中的"hp"。 - 如果这是最后一个敌人,就将
"crown"添加到它的"loot"中。 - 打印这个敌人。
最后,打印 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 个敌人
# 输出 template
pass
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: GDScript 在线编译器