Menu
CoddyTech

Copiando dicionários

Parte da seção Lógica e fluxo do Journey de GDScript da Coddy. Lição 22 de 78.

Atribuir um dicionário a outra variável não o copia. Ambas as variáveis se referem ao mesmo dicionário, então uma alteração feita por uma delas também aparece na outra:

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

duplicate() cria um novo dicionário com os mesmos pares. Alterar a cópia não afeta o original:

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

duplicate() faz uma cópia superficial: a cópia tem seus próprios pares, mas um valor que seja um array ou um dicionário ainda é compartilhado entre os dois:

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 para uma cópia profunda: duplicate(true) também copia cada array e dicionário interno, então os dois não compartilham nada:

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

Uma cópia superficial é suficiente quando todos os valores são números, strings ou booleanos. Assim que um valor for um array ou um dicionário, use duplicate(true). Os arrays funcionam da mesma forma: grid.duplicate(true) copia um array 2D junto com suas linhas.

challenge icon

Desafio

Fácil

Gere uma onda de inimigos a partir de um modelo. O dicionário template é fornecido. O programa lê dois números inteiros, um por linha: quantos inimigos gerar (n) e um bônus de hp.

Para cada inimigo de número i, de 1 até n:

  1. Faça uma cópia de template que não compartilhe nada com ele.
  2. Adicione a chave "id" com o valor i.
  3. Adicione bonus * i ao "hp" dentro de "stats".
  4. Se for o último inimigo, acrescente "crown" ao seu "loot".
  5. Imprima o inimigo.

Por fim, imprima Template: seguido pelo modelo, que deve permanecer inalterado. Para as entradas 2 e 10, a saída é:

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

Experimente você mesmo

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

	# Crie e imprima os n inimigos

	# Imprima o template
	pass
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica e fluxo

Pratique por conta própria: Compilador de GDScript online