Menu
CoddyTech

Copiar diccionarios

Parte de la sección Lógica y flujo del Journey de GDScript de Coddy. Lección 22 de 78.

Asignar un diccionario a otra variable no lo copia. Ambas variables hacen referencia al mismo diccionario, así que un cambio realizado a través de una se refleja en la otra:

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

duplicate() crea un nuevo diccionario con los mismos pares. Cambiar la copia no afecta al original:

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

duplicate() hace una copia superficial: la copia tiene sus propios pares, pero un valor que sea un array o un diccionario sigue siendo compartido entre ambos:

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

Pasa true para hacer una copia profunda: duplicate(true) también copia todos los arrays y diccionarios que contiene, así que no comparten nada:

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

Una copia superficial es suficiente cuando cada valor es un número, una cadena o un booleano. En cuanto un valor es un arreglo o un diccionario, usa duplicate(true). Los arreglos funcionan de la misma manera: grid.duplicate(true) copia un arreglo bidimensional junto con sus filas.

challenge icon

Desafío

Fácil

Genera una oleada de enemigos a partir de una plantilla. Se proporciona el diccionario template. El programa lee dos números enteros, uno por línea: cuántos enemigos generar (n) y una bonificación de hp.

Para cada número de enemigo i desde 1 hasta n:

  1. Haz una copia de template que no comparta nada con ella.
  2. Añade la clave "id" con el valor i.
  3. Añade bonus * i a "hp" dentro de "stats".
  4. Si es el último enemigo, añade "crown" a su "loot".
  5. Imprime el enemigo.

Por último, imprime Template: seguido de la plantilla, que debe permanecer sin cambios. Para las entradas 2 y 10, la salida es:

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

Pruébalo tú mismo

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 imprime los n enemigos

	# Imprime la plantilla
	pass
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y flujo

Practica por tu cuenta: Compilador de GDScript online