Enum vs. Inteiro para valores de habilidade


10

Estou implementando um sistema básico de habilidades e atributos, embora tenha dúvidas sobre como devo proceder.

Por exemplo, eu poderia usar um Dictionary / HashMap que usa enumerações SkillType para representar chaves e valores inteiros representando os valores. Mas devo fazer isso?

public class Skills
{
    public IDictionary<StatType, Int> skills; //StatType is enum, being the key; the int //is the value.

}

vs.

public class Skills
{
    public int LongBlade, Armor, Marksman; //...etc
}

Gostaria de conhecer os benefícios da segurança de tipo aqui, em vez de usar apenas números inteiros básicos. Alguma recomendação?


Eu prefiro interface Skill { /* ... */ int toInt(); }; public class Skills : IList { private ArrayList<Skill> skills; /* ... */ };, na verdade ...
Martin Sojka

Respostas:


8

Se eventualmente houver:

  • uma grande variedade de tipos de habilidades em seu jogo,
  • ou itens de concessão de habilidades,
  • ou buffs de concessão de habilidades,
  • ou uma grande árvore de habilidades,

então começo a preferir a flexibilidade de cadeias de caracteres ou chaves inteiras em um dicionário, em vez de campos de instância individuais ou até mesmo um dicionário com uma chave enum.

Meu raciocínio ... Porque você logo perceberá ...

Rapaz, seria bom se eu pudesse ajustar minha arte matemática e selecionar habilidades de unidade (meu editor de texto favorito | Excel | uma ferramenta personalizada).

... nesse ponto, um dicionário com chaves de seqüência de caracteres ou números inteiros se torna um ajuste mais natural do que ter que manter os valores de enumeração ou uma longa lista de campos de instância. No entanto, a referida ferramenta sempre pode ser escrita para gerar código C # também, para que você possa encontrar um híbrido feliz.

Se a complexidade do seu jogo for bastante simples e sua variedade de habilidades for pequena, o gerenciamento manual dos campos de instância (em vez de dicionário e enum) parece mais conveniente e evita um nível de indireção, tanto em tempo de execução quanto em "pressionamento de tecla" - Tempo.


O que você quer dizer com habilidades de unidade e matemática? Não estou entendendo direito, pelo menos nesse sentido. Eu gostaria de usar um enum, se isso for prático.
Bluesfreak

Eu concordo parcialmente com você, as strings são ótimas para níveis mais altos (por exemplo, a API de script), mas mover as strings não é uma boa ideia (a memória e o tempo de movimentação limitam a quantidade máxima de operações que você pode fazer por frame). Ser híbrido pode ser uma opção: entidades nomeadas com identificadores de número inteiro. Os nomes devem ser armazenados uma vez (talvez em um mapa singleton) e as entidades se identificam usando números inteiros. Fazendo isso, você pode inserir seqüências de caracteres em suas interfaces, se necessário, e trabalhar como se fossem enumerações.
FxIII

@ fxiii Eu concordo, e é por isso que mencionei "string ou número inteiro". Eu não entrei em muitos detalhes, então, obrigado por esclarecer alguns por que e como em relação ao uso de números inteiros.
DuckMaestro
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.