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"]) # 10duplicate() 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"]) # 30duplicate() 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"]) # 1Uma 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.
Desafio
FácilGere 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:
- Faça uma cópia de
templateque não compartilhe nada com ele. - Adicione a chave
"id"com o valori. - Adicione
bonus * iao"hp"dentro de"stats". - Se for o último inimigo, acrescente
"crown"ao seu"loot". - 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
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
1Strings em Profundidade
Métodos de StringBusca em StringsSubstituir e Remover EspaçosDividir e UnirRecapitulação - Verificação de Nome de Usuário4Dicionários - Parte 2
Dicionários aninhadosArrays de dicionáriosMesclando dicionáriosCopiando dicionáriosRevisão - Contador de frequência10Funções Avançadas
Retornando Múltiplos ValoresFunções Lambda Parte 1Funções Lambda Parte 2Revisão - Ordenação com LambdaFunções Recursivas Parte 1Funções Recursivas Parte 2Revisão - Somando Array Aninhado13Sistema de Gerenciamento de Estoque
Visão Geral do ProjetoAdicionar Item2Tomada de Decisões Avançada
Correspondência com VariáveisGuards de CorrespondênciaPadrões de ArrayPadrões de DicionárioVerificações de PertinênciaRevisão - Analisador de Comandos5Aplicativo de Agenda de Contatos
Exibir menuAdicionar contato8Gerenciador de Registros de Alunos
Visão Geral do ProjetoAdicionar Aluno3Arrays multidimensionais
Fundamentos de arrays 2DAcessando elementos de arrays 2DLaços aninhados com arrays 2DRevisão - arrays 2DArrays irregularesPadrões comuns de arrays 2DRevisão - tabuleiro de jogo6Conjuntos com Dicionários
O que é um conjunto?Dicionário como conjuntoAdicionando e removendoUnião e interseçãoDiferença entre conjuntosRevisão - Removendo duplicatas9Agregação Avançada de Dados
Somando ValoresEncontrando o Mínimo e o MáximoOrdenação PersonalizadaRevisão - Ordenador de DicionáriosPratique por conta própria: Compilador de GDScript online