Menu
CoddyTech

Copier des dictionnaires

Fait partie de la section Logique et flux d’exécution du Journey GDScript de Coddy. Leçon 22 sur 78.

Affecter un dictionnaire à une autre variable ne le copie pas. Les deux variables font référence au même dictionnaire, donc une modification effectuée par l’une apparaît dans l’autre :

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

duplicate() crée un nouveau dictionnaire contenant les mêmes paires. Modifier la copie ne change pas l’original :

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

duplicate() crée une copie superficielle : la copie possède ses propres paires, mais une valeur qui est un tableau ou un dictionnaire est toujours partagée entre les deux :

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

Passe true pour une copie profonde : duplicate(true) copie également chaque tableau et dictionnaire qu’elle contient, de sorte que les deux ne partagent rien :

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

Une copie superficielle suffit lorsque chaque valeur est un nombre, une chaîne ou un booléen. Dès qu’une valeur est un tableau ou un dictionnaire, utilise duplicate(true). Les tableaux fonctionnent de la même manière : grid.duplicate(true) copie un tableau à 2 dimensions avec ses lignes.

challenge icon

Défi

Facile

Fais apparaître une vague d’ennemis à partir d’un modèle. Le dictionnaire template est fourni. Le programme lit deux nombres entiers, un par ligne : le nombre d’ennemis à faire apparaître (n) et un bonus de hp.

Pour chaque numéro d’ennemi i de 1 à n :

  1. Fais une copie de template qui ne partage rien avec lui.
  2. Ajoute la clé "id" avec la valeur i.
  3. Ajoute bonus * i au "hp" dans "stats".
  4. S’il s’agit du dernier ennemi, ajoute "crown" à son "loot".
  5. Affiche l’ennemi.

Enfin, affiche Template: suivi du modèle, qui doit rester inchangé. Pour les entrées 2 et 10, la sortie est :

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

Essayez vous-même

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

	# Génère et affiche les n ennemis

	# Affiche le modèle
	pass
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Logique et flux d’exécution

Entraînez-vous par vous-même : Compilateur GDScript en ligne