Menu
CoddyTech

Copiare dizionari

Fa parte della sezione Logica e flusso del percorso GDScript di Coddy. Lezione 22 di 78.

Assegnare un dizionario a un’altra variabile non lo copia. Entrambe le variabili fanno riferimento allo stesso dizionario, quindi una modifica apportata tramite una si riflette anche nell’altra:

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

duplicate() crea un nuovo dizionario con le stesse coppie. Modificare la copia non altera l'originale:

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

duplicate() crea una copia superficiale: la copia ha le proprie coppie, ma un valore che è un array o un dizionario è comunque condiviso tra i due:

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

Passa true per una copia profonda: duplicate(true) copia anche ogni array e dizionario al suo interno, così i due non condividono nulla:

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

Una copia superficiale è sufficiente quando ogni valore è un numero, una stringa o un booleano. Non appena un valore è un array o un dizionario, usa duplicate(true). Gli array funzionano allo stesso modo: grid.duplicate(true) copia un array 2D insieme alle sue righe.

challenge icon

Sfida

Facile

Genera un'ondata di nemici da un modello. Il dizionario template è fornito. Il programma legge due numeri interi, uno per riga: quanti nemici generare (n) e un bonus di hp.

Per ogni numero di nemico i da 1 a n:

  1. Crea una copia di template che non condivida nulla con esso.
  2. Aggiungi la chiave "id" con il valore i.
  3. Aggiungi bonus * i a "hp" all'interno di "stats".
  4. Se è l'ultimo nemico, aggiungi "crown" a "loot".
  5. Stampa il nemico.

Infine, stampa Template: seguito dal modello, che deve rimanere invariato. Per gli input 2 e 10, l'output è:

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

Provalo tu

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

	# Genera e stampa i n nemici

	# Stampa il template
	pass
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore GDScript online