Menu
CoddyTech

Kopiowanie słowników

Część sekcji Logika i przepływ programu ścieżki GDScript w Coddy. Lekcja 22 z 78.

Przypisanie słownika do innej zmiennej nie kopiuje go. Obie zmienne wskazują na ten sam słownik, więc zmiana wprowadzona przez jedną jest widoczna przez drugą:

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

duplicate() tworzy nowy słownik z tymi samymi parami. Zmiana kopii nie wpływa na oryginał:

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

duplicate() tworzy płytką kopię: kopia ma własne pary, ale wartość będąca tablicą lub słownikiem jest nadal współdzielona przez oba obiekty:

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

Przekaż true, aby utworzyć głęboką kopię: duplicate(true) kopiuje również każdą znajdującą się wewnątrz tablicę i słownik, więc oba obiekty nie współdzielą żadnych danych:

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

Kopia płytka wystarczy, gdy każda wartość jest liczbą, ciągiem znaków lub wartością logiczną. Gdy tylko wartość jest tablicą lub słownikiem, użyj duplicate(true). Tablice działają tak samo: grid.duplicate(true) kopiuje tablicę 2D wraz z jej wierszami.

challenge icon

Wyzwanie

Łatwy

Utwórz falę przeciwników na podstawie szablonu. Podany jest słownik template. Program odczytuje dwie liczby całkowite, po jednej w wierszu: ilu przeciwników utworzyć (n) oraz premię do hp.

Dla każdego numeru przeciwnika i od 1 do n:

  1. Utwórz kopię template, która nie współdzieli z nim żadnych danych.
  2. Dodaj klucz "id" o wartości i.
  3. Dodaj bonus * i do "hp" wewnątrz "stats".
  4. Jeśli jest to ostatni przeciwnik, dołącz "crown" do jego "loot".
  5. Wypisz przeciwnika.

Na koniec wypisz Template: , a następnie szablon, który musi pozostać niezmieniony. Dla danych wejściowych 2 i 10 wynikiem jest:

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

Spróbuj swoich sił

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

	# Utwórz i wypisz n wrogów

	# Wypisz szablon
	pass
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ programu

Poćwicz samodzielnie: Kompilator GDScript online