Há um modo de economizar tempo/espaço? ou terei de fazer mais de 200 ifs mesmo?

Olá,
Estou fazendo uma calculadora de um jogo.

Para isso eu terei de ler cada habilidade.

Para inicio tenho de saber qual o tipo da habilidade, no caso há 5.
Após isso tenho de ver qual das 47 habilidades foi escolhida. Ou seja, 47 em cada um dos 5 ifs dos tipos…
Dentro de cada um dos 47, terei de ver o valor dado à habilidade, mas antes de ver o valor, terei de analisar se esse valor está ligado a uma das 15 condições de aumento. Ou seja, 15 dentro de cada um dos 47…

O que fazer? Vai ter que ser essa arvore gigante de if’s mesmo?

Mano, não pensei em nada concreto ainda. Mas acho q o conceito de reflexão consegue te ajudar uma pá em casos como esse.

Não pode usar Banco ou algo em memória?

Acredito que a solução de se utilizar banco seja bem apropriada. Mas ao invés de utilizar ifs encadeados, tente uma solução utilizando switch cases encadeados, talvez poupe bastante trabalho.

Tá difícil entender o que vc quer, tente explicar melhor, pf

Acho que trocar ifs por switch da na mesma

Sem banco se possível.

Exemplo, uma habilidade pode ser Punição Gelada 2, ou Bola de Fogo Rúnica 400, 600 se Atacante.
No caso Punição óu Bola de fogo são duas das habilidades, Gelada ou Rúnica são 2 dos 5 tipos de habilidades. 2 ou 400 são os valores das habilidades, mas na BdF Runica, será 600 se vc começar a batalha…

Eu quero calcular o que resultará no total, pra isso eu tenho q verificar tudo, no caso tipo de habilidade(5), a habilidade(47), o valor dela, e se tem alguma forma de aumentar o valor.

Mas não sei o que fazer, se terei que ficar analisando cada coisinha um monte de vezes, ou se tem um jeito de economizar essa repetição…

Entendeu? Se não, o que você não entendeu?

Monte então @Zahal uma estrutura de armazenamento dentro de uma classe, monte um lógico de negócio igual você está contanto para gente e faça pesquisa nela, Não é boa pratica tem muitos ifs encadeados em um código.

pode me dizer como se faz isso? fiz um curso técnico, mas não aprendi muito nele :T achava q ja tinha feito a parte mais dificil fazendo analisar qtas vezes usará cada habilidade…

ou se não quiser explicar, se possivel enviar um link que explique bem isso :thinking:

Vou postar um exemplo, mas, a idéia tem que vir da sua caxola (rs)

package code;
public class Habilidade {    
    private String descricao;
    private int valor;
    public Habilidade(String descricao, int valor) {
        this.descricao = descricao;
        this.valor = valor;
    }     
    public String getDescricao() {
        return descricao;
    }
    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
    public int getValor() {
        return valor;
    }
    public void setValor(int valor) {
        this.valor = valor;
    }   
}

package code;
import java.util.ArrayList;
import java.util.List;
public class Gerenciador {    
    private final List<Habilidade> habilidades;
    public List<Habilidade> getHabilidades() {
        return habilidades;
    }
    public Gerenciador() {
        habilidades = new ArrayList<>();
        carregar_habilidades();
    }    
    private void carregar_habilidades()
    {
        // seria aqui sua base de dados ...
        habilidades.add(new Habilidade("Punição Gelada", 400));
        habilidades.add(new Habilidade("Punição Gelada 1", 800));
        habilidades.add(new Habilidade("Punição Gelada 2", 80));
    }
}

Nessa classe Gerenciador você colocar um busca para pegar a chave dessa lista e ai os valores para somar!

Como eu disso é um protótipo, porque, realmente eu não sei bem como é o seu código.

Nao é a mesma coisa que eu criar métodos?
Ainda assim eu nao precisaria ver qual o tipo da habilidade para saber o q fazer nela? Tipo, verificar ainda com if a habilidade toda pra calcular o dano que ela fara(se fizer dano)? ou se ela usa um valor? por exemplo se for punição tem q multiplicar a força do oponente por X, e se for gelada, aumenta o dano em X/10 pra cada gelo no oponente…

Se quiser entender mais aqui esta os 3 arquivos que uso:

DadosUtils.java (1.3 KB)
Tudinho.java (147.1 KB)
Tudinho.form (137.3 KB)

a interface:

e na classe tudinho tem uma descrição de cada habilidade

Fazer essa parada sem banco vai te custar uma porrada de código, mas com MVC e reflexão vc consegue sim.

oque aprendi em complexidade de algoritmos, é que cada if representa uma soma na complexidade, ou seja um caminho diferente que pode ser percorrido, e oque o professor citou é que um método com complexidade > 50 já indica que há coisa errada. Provavelmente você pode “quebrar” em vários casos, ou usar reflexão, banco de dados, como os amigos já citaram.

Não… não é mesma coisa que criar métodos.

Se fizer um Lista de valores é só criar filtros para pesquisar e o número de ifs quase some.

Você pode colocar as regras dentre os itens da lista, então o número de ifs vai cair no minimo para 5%, isso já melhora.

Mas agora precisa desenvolver essa idéia ou outra que assim preferir, agora criar um encadeamento de ifs não recomendo.

Vale lembrar que é um exemplo, ou um protótipo.