Menu
CoddyTech

Sao chép từ điển

Thuộc phần Logic và luồng chương trình trong hành trình GDScript của Coddy. Bài học 22 trên 78.

Gán một từ điển cho một biến khác không tạo ra bản sao. Cả hai biến đều tham chiếu đến cùng một từ điển, vì vậy thay đổi qua biến này cũng hiển thị qua biến kia:

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

duplicate() tạo một từ điển mới có cùng các cặp khóa và giá trị. Thay đổi bản sao không làm ảnh hưởng đến bản gốc:

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

duplicate() tạo một bản sao nông: bản sao có các cặp khóa và giá trị riêng, nhưng giá trị là mảng hoặc từ điển vẫn được chia sẻ giữa hai bản:

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"] }

Truyền true để tạo bản sao sâu: duplicate(true) cũng sao chép mọi mảng và từ điển bên trong, nên hai bản không chia sẻ dữ liệu nào:

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

Bản sao nông là đủ khi mọi giá trị đều là số, chuỗi hoặc giá trị boolean. Khi một giá trị là mảng hoặc từ điển, hãy dùng duplicate(true). Mảng cũng hoạt động tương tự: grid.duplicate(true) sao chép mảng 2D cùng với các hàng của nó.

challenge icon

Thử thách

Dễ

Tạo một đợt kẻ địch từ một mẫu. Từ điển template đã có sẵn. Chương trình đọc hai số nguyên, mỗi số trên một dòng: số lượng kẻ địch cần tạo (n) và điểm thưởng hp.

Với mỗi kẻ địch có số thứ tự i từ 1 đến n:

  1. Tạo một bản sao của template không dùng chung dữ liệu với mẫu.
  2. Thêm khóa "id" với giá trị i.
  3. Cộng bonus * i vào "hp" bên trong "stats".
  4. Nếu đây là kẻ địch cuối cùng, thêm "crown" vào "loot" của nó.
  5. In kẻ địch ra.

Cuối cùng, in Template: theo sau là mẫu, mẫu này phải giữ nguyên. Với đầu vào 2 và 10, đầu ra là:

{ "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"] }

Tự làm thử

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

	# Tạo và in ra n kẻ địch

	# In ra template
	pass
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng chương trình

Tự luyện tập: Trình biên dịch GDScript online