[Dúvida] Enums!

6 respostas
Nicolas_Fernandes

Olá, galerinha!

Beleza?

Estou com uma dúvida acerca de Enums…

Criei alguns enums aqui:

enum Guerreiro { FORCA, CONSTITUICAO, DESTREZA, SABEDORIA, INTELIGENCIA, CARISMA};
enum Ladino     { DESTREZA, INTELIGENCIA, CONSTITUICAO, CARISMA, SABEDORIA, FORCA};
enum Mago       { INTELIGENCIA, CONSTITUICAO, DESTREZA, SABEDORIA, CARISMA, FORCA};

Como podem perceber, cada um possui uma ordem na qual os atributos devem ser colocado, por ordem de importância.

Legal, daí eu vou lá e gero os atributos:

List<Integer> atributos = new ArrayList<Integer>();
Random random = new Random();
int valor;

for (int I = 0; I < 6; ++I) {

    do { valor = random.nextInt(18); } while (valor < 10);
        
       atributos.add(valor);
}

Collections.sort(atributos);

Beleza…
Agora, eis a questão:
São seis atributos. Eu quero que pegue valor por valor da minha lista e jogue em cada posição do Enum.
Por exemplo:

Eu escolhi guerreiro. Os valores gerados foram 18/16/16/14/12/10.
Então, no final, o enum teria que estar da seguinte maneira:

enum Guerreiro { FORCA = 18,
CONSTITUICAO = 16,
DESTREZA = 16,
SABEDORIA = 14,
INTELIGENCIA = 12,
CARISMA = 10};

Pois eu usaria esses valores dessa maneira, futuramente.

Eu escolhi Ladino agora. Os valores gerados foram os mesmos.
Então, o certo seria:

enum Ladino{ DESTREZA = 18,
INTELIGENCIA = 16,
CONSTITUICAO = 16,
CARISMA = 14,
SABEDORIA = 12,
FORCA = 10};

Como fazer para colocar cada valor da minha List em cada posição do meu Enum, fazendo isso em um loop, sem precisar de Ladino.Destreza = 18; , por exemplo?

Desde já, grato pela ajuda!

6 Respostas

ViniGodoy

Não use enum para isso.

O enum poderia descrever apenas que atributos uma determinada classe tem, mas não os valores. Lembre-se que enuns são únicos, logo, dois guerreiros teriam exatamente os mesmos atributos.

Nicolas_Fernandes

Olá, Vini!

Você tem uma outra solução que eu possa usar para tal?

Pois eu precisaria ter os atributos ordenados de acordo com a classe que for escolhida para executar os processos!

A cada vez que for escolhido um Guerreiro, os atributos são gerados novamente e são colocados nessa ordem na tela. É essa a questão!

Obrigado!
[]s

ViniGodoy

Você pode criar uma classe para guardar o tipo de atributo e o valor. E deixar ela comparable por valor. E então usar um TreeSet ou um list, pois fica fácil ordenar.

Nicolas_Fernandes

Any example?

ViniGodoy

Algo nessa linha.

public enum Atributos {
 ST, DX, IQ, WS, CO, CHA
};

public class Atributo {
   private Atributos atributo;
   private int valor;
}


public class Guerreiro {
   private List<Atributo> atributos = new ArrayList<Atributo>();

   public Guerreiro() {
        atributos.add(new Atributo(Atributos.ST, sortear(3, 6));
        atributos.add(new Atributo(Atributos.CO, sortear(3, 6));
        atributos.add(new Atributo(Atributos.DX, sortear(3, 6));
        atributos.add(new Atributo(Atributos.WS, sortear(3, 6));
        atributos.add(new Atributo(Atributos.IQ, sortear(3, 6));
        atributos.add(new Atributo(Atributos.CHA, sortear(3, 6));
   }
}
ViniGodoy

Outra alternativa é gravar em qualquer ordem, mas ter um método getAtributos() que retorne a lista, na ordem de importância.

Isso ficaria assim:

public class Atributo {
   private String nome;
   private int valor;
}

public abstract class Personagem {
   private int st;
   private int dx;
   private int co;
   private int ws;
   private int iq;
   private int co;

   public abstract List<Atributo> listarPorImportancia();
   public Personagem() {
        st = sortear(3, 6);
        co = sortear(3, 6);
        dx = sortear(3, 6);
        ws = sortear(3, 6);
        iq = sortear(3, 6);
        cha = sortear(3, 6);
   }
}


public class Guerreiro extends Personagem {
   public List<Atributo> listarPorImportancia() {
      List<Atributo> atributos = new ArrayList<Atributo>();
      atributos.add(new Atributo("ST", st));
      atributos.add(new Atributo("CO", co));
      atributos.add(new Atributo("DX", dx));
      atributos.add(new Atributo("WS", ws));
      atributos.add(new Atributo("IQ", iq));
      atributos.add(new Atributo("CHA", cha));
   }
}

Acho essa alternativa melhor pq ficaria bem fácil de trabalhar com a classe personagem. Você teria getters e setter dos atributos diretamente.

Criado 15 de janeiro de 2010
Ultima resposta 15 de jan. de 2010
Respostas 6
Participantes 2