Sou novo em Kotlin e decidi programar um jogo de texto simples. Quando tento acessar a taxa de spawn de um inimigo (não importa a bruxa), sempre recebo um erro:
Kotlin: Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
public operator fun MatchGroupCollection.get(name: String): MatchGroup? defined in kotlin.text
e .get
fica vermelho no meu IDE.
Aqui está meu dragão inimigo:
"dragon" to mapOf(
"spawnRate" to mapOf("hill" to 1.01),
"drops" to mapOf(
"dragon scale" to mapOf("quantity" to listOf(1,10)),
"dragon egg" to 0.01,
"dragon head" to 1.01,
),
"exp" to listOf(1, 4),
"dmg" to listOf(35,75),
),
Estou tentando acessar o spawnRate assim:
val dragonSpawnRate = mobs["dragon"]?.get("spawnRate")?.get("hill")
println("Dragon Spawn Rate: $dragonSpawnRate")
Tentei mais ideias, mas todas acabaram com o mesmo erro.
val dragon = mobs["dragon"]?.get("spawnRate")
val dragonSpawnRate = dragon?.get("hill")
//-----------------------------------------------
val dragon = mobs["dragon"]?.get("spawnRate")
val dragonSpawnRate = dragon["hill"]
Também tentei algumas soluções para esta questão: https://stackoverflow.com/questions/61660123/define-class-parameter-with-get-at-kotlin
mas nenhum deles ajudou. Também tentei perguntar ao chat gpt, mas também não funcionou.
Como o nome sugere, as coleções servem para armazenar coleções de itens semelhantes. Os mapas são bons para casos como, por exemplo, mapeamento de IDs de usuários para dados de usuários. Neste caso, cada item é praticamente o mesmo caso.
No seu exemplo, cada item é uma história totalmente diferente: alguns deles são números, alguns deles são listas ou outros mapas. Os mapas não foram realmente projetados para tal caso. Eles podem armazenar esses dados, mas perderemos as informações de tipo, então teríamos que converter valores onde necessário:
Se tivermos vários campos conhecidos com um significado muito específico, não devemos armazená-los em um mapa, mas em uma classe. Em Kotlin podemos usar classes de dados para isso:
Isenção de responsabilidade: não tenho certeza se
IntRange
é uma boa ideia aqui.Isso não é realmente específico do Kotlin. Esta regra se aplica a praticamente todas as linguagens fortemente tipadas.