Teria como simplificar este codigo?

Olá preciso de ajuda para simplificar este código (se possível) ainda utilizando o JOptionPane
O código se trata da pessoa imaginar um dos animais pré-definidos e o programa adivinha-ló

Tabela com os tipos de cada animal
http://prntscr.com/nv5fyc

   import javax.swing.JOptionPane;
    public class Animal 
    {

        public Animal() 
        {
        	
        }

        public static void main(String[] args) 
        {
     	   String mami,quad,s1="Sim",s2="Não",carn,bi,oni,voador,ave,nvoador,tropical,nadadora,rept,casco,carni;
           	
           	JOptionPane.showMessageDialog(null,"Pense em um destes animais: leão, cavalo, homem, macaco, morcego, baleia, avestruz, pinguim, pato, águia, tartaruga, crocodilo, cobra") ;
           	mami = JOptionPane.showInputDialog("Seu animal é mamífero?") ;
           	//Mamiferos
           	 if (mami.equals (s1))
           	 {
           	 	quad = JOptionPane.showInputDialog("Seu animal é quadrúpede?") ;
           	 	
           	 	//Quadrupede
           	 	if (quad.equals (s1)) 
           	 	{
           	 		carn = JOptionPane.showInputDialog("Seu animal é carnívoro?") ;
           	 		  if (carn.equals (s1))
           	 		   JOptionPane.showMessageDialog(null,"Seu animal é um leão");
           	    
           	 		   if (carn.equals (s2))
           	 		   
           	 		   	JOptionPane.showMessageDialog(null,"Seu animal é um cavalo");
           	 	}   //Fim Quadrupede 	
           	 		//Bipede
           	 		   	if (quad.equals (s2))
           	    {
           	 		   		
           	 		bi = JOptionPane.showInputDialog("Seu animal é bípede?") ;	
           	 			
           	 			if (bi.equals (s1)) 
           	 	        {
           	 		oni = JOptionPane.showInputDialog("Seu animal é onívoro?") ;
           	 		  if (oni.equals (s1))
           	 		   JOptionPane.showMessageDialog(null,"Seu animal é um homem");
           	    
           	 		        if (oni.equals (s2)) 
           	 		    	JOptionPane.showMessageDialog(null,"Seu animal é um macaco");
           	 		   	}
           	 		   	
           	 			//Fim Bipede
           	 			if (bi.equals (s2)) 
           	 			{
           	 			voador = JOptionPane.showInputDialog("Seu animal é voador?" );
           	 					if(voador.equals(s1))
           	 					{
           	 						JOptionPane.showMessageDialog(null,"Seu animal é um morcego") ;
           	 					}
           	 			
           	 			if(voador.equals(s2))
           	 			{JOptionPane.showMessageDialog(null,"Seu animal é uma baleia") ;
           	 			}
           	 			}	
           	 			
           	 			 	
           	  }
           	 	
           	 		
           	 }//Fim Mamiferos	
           	  
           	 if (mami.equals (s2))
           	 {
           	 	ave = JOptionPane.showInputDialog("Seu animal é uma ave?") ;
           	 	if (ave.equals(s1))//Começo aves
           	 		{
           	 			nvoador = JOptionPane.showInputDialog("Seu animal é voador?") ;
           	 			
           	 			if (nvoador.equals(s2))
           	 			{
           	 				tropical = JOptionPane.showInputDialog("Seu animal é tropical?") ;
           	 				 if (tropical.equals(s1))
           	 				 	JOptionPane.showMessageDialog(null,"Seu animal é um avestruz") ;
           	 				 if (tropical.equals(s2))
           	 				 	JOptionPane.showMessageDialog(null,"Seu animal é um pinguim")	;
           	 			}	 	
           	 					
           	 		
           	            if (nvoador.equals(s1))
           	            {
           	            	nadadora = JOptionPane.showInputDialog("Seu animal é nadador?") ;
           	            	if (nadadora.equals(s1))
           	            	{
           	            		JOptionPane.showMessageDialog(null,"Seu animal é um pato") ;
           	            	}
           	            	if (nadadora.equals(s2))
           	            	{
           	            		JOptionPane.showMessageDialog(null,"Seu animal é uma águia") ;
           	            	}
           	            }
           	            	
           	            	
           	          
           	             
           	 		}//Fim aves
           	 		
           	 		if (ave.equals(s2))
           	 		{//Repteis
           	 			rept = JOptionPane.showInputDialog("Seu animal é um réptil?") ;
           	 			
           	 			 if (rept.equals(s1))
           	 			 {
           	 			 	casco = JOptionPane.showInputDialog("Seu animal tem casco?") ;
           	 			 	
           	 			 	  if (casco.equals(s1))
           	 			 	  {
           	 			 	  	JOptionPane.showMessageDialog(null,"Seu animal é uma tartaruga") ;
           	 			 	  }	
           	 			 	  	
           	 			 	  if (casco.equals(s2))
           	 			 	  	
           	 			 	  {
           	 			 	  	carni =	JOptionPane.showInputDialog("Seu animal é carnívoro") ;
           	 			 	  if (carni.equals(s1))
           	 			 	  	JOptionPane.showMessageDialog(null,"Seu animal é um crocodilo") ;
           	 			 	  if (carni.equals(s2))
           	 			 	  	JOptionPane.showMessageDialog(null,"Seu animal é uma cobra") ;
           	 			 	  }		  	

           	 			 }
           	 			 
           	 			 if (rept.equals(s2))
           	 			 {
           	 			 	JOptionPane.showMessageDialog(null,"Suas respostas estão incompativeís, tente novamente") ;
           	 			 }
           	 			 
           	 			
           	 			
           	 			
           	 		}//Fim repteis
           	 			
           	 		
           	 		
           	 		
           	 		
           	 		
           	 		
           	 		
           	 }//Nao Mamifero
    }		
    }

Agradeceria caso alguem possa me ajudar

Muito legal seu problema. Eu acho que dá pra melhorar com uma arvore binária.

Eu tentei implementar e parece que está funcionando, mas não testei todas as possibilidades. De qualquer forma acho que dá pra vc pegar a idéia, olha como ficou:

import javax.swing.JOptionPane;

class Node {
  public String value;
  public Node yes, no;

  public Node(String value) {
    this.value = value;
  }

  public Node(String value, Node yes, Node no) {
    this.value = value;
    this.yes = yes;
    this.no = no;
  }
}

public class Main {
  public static void main(String[] args) {
    // Respostas:
    Node leao = new Node("Seu animal é um leão");
    Node cavalo = new Node("Seu animal é um cavalo");
    Node homem = new Node("Seu animal é um homem");
    Node macaco = new Node("Seu animal é um macaco");
    Node morcego = new Node("Seu animal é um morcego");
    Node baleia = new Node("Seu animal é um baleia");
    Node avestruz = new Node("Seu animal é um avestruz");
    Node pinguim = new Node("Seu animal é um pinguim");
    Node pato = new Node("Seu animal é um pato");
    Node aguia = new Node("Seu animal é um aguia");
    Node tartaruga = new Node("Seu animal é um tartaruga");
    Node crocodilo = new Node("Seu animal é um crocodilo");
    Node cobra = new Node("Seu animal é um cobra");
    Node erro = new Node("Erro. Tente novamente");
    // Perguntas:
    Node carni2 = new Node("Seu anima é carnívoro?", crocodilo, cobra);
    Node casco = new Node("Seu animal tem casco?", tartaruga, carni2);
    Node reptil = new Node("Seu animal é um réptil?", casco, erro);
    Node nadador = new Node("Seu animal é nadador?", pato, aguia);
    Node tropical = new Node("Seu animal é tropical?", avestruz, pinguim);
    Node voador2 = new Node("Seu animal é voador?", nadador, tropical);
    Node ave = new Node("Seu animal é uma ave?", voador2, reptil);
    Node voador1 = new Node("Seu animal é voador?", morcego, baleia);
    Node oni = new Node("Seu animal é onívoro?", homem, macaco);
    Node bi = new Node("Seu animal é bípede?", oni, voador1);
    Node carn = new Node("Seu animal é carnívoro?", leao, cavalo);
    Node quad = new Node("Seu animal é quadrúpede?", carn, bi);
    Node mami = new Node("Seu animal é mamífero?", quad, ave);

    run(mami);
  }

  private static void run(Node node) {
    if (node.yes == null && node.no == null) {
      JOptionPane.showMessageDialog(null, node.value);
    } else {
      char answer = JOptionPane.showInputDialog(node.value).toLowerCase().charAt(0);
      run((answer == 's') ? node.yes : node.no);
    }
  }
}
1 curtida

Tendo como base a resposta do colega @wldomiciano, se você criar uma estrutura de árvore um pouco mais elaborada, como esta:

import java.util.LinkedList;
import java.util.List;

@SuppressWarnings({ "rawtypes", "unchecked" })
public final class Node<T> {

    public static <S> Node<S> create(S value) {
        return new Node<>(value);
    }

    private final T value;
    private final List children = new LinkedList<>();

    private Node(T value) {
        this.value = value;
    }

    public <S> List<S> allLeaves() {
        List<Object> leaves = new LinkedList<>();
        for (Node child : children()) {
            if (child.isLeaf()) {
                leaves.add(child.value());
            } else {
                leaves.addAll(child.allLeaves());
            }
        }
        return (List<S>) leaves;
    }

    public <S> List<Node<S>> children() {
        return (List<Node<S>>) children;
    }

    public boolean isLeaf() {
        return children.isEmpty();
    }

    public <S> Node<S> node(S value) {
        for (Node child : children()) {
            if (child.value().equals(value)) {
                return child;
            }
        }
        Node Tree = new Node<>(value);
        children.add(Tree);
        return Tree;
    }

    @Override
    public String toString() {
        return toString("");
    }

    public T value() {
        return value;
    }

    private String toString(String indent) {
        if (isLeaf()) {
            return indent + value;
        }
        StringBuilder text = new StringBuilder(indent + value);
        for (Node<?> child : children()) {
            text.append("\n" + child.toString(indent + "    "));
        }
        return text.toString();
    }
}

Você consegue montar uma árvore de tomada de decisões que simplifica bastante a implementação de seu programa, veja:

import java.util.List;

import javax.swing.JOptionPane;
import javax.swing.UIManager;

public class Programa {

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            Programa programa = new Programa();
            programa.executar();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    public void executar() {
        Node<String> arvore = criarArvoreDeDecisoes();
        mensagem("Pense em um destes animais: ", arvore.allLeaves());
        perguntar("Seu animal é ", arvore);
    }

    private Node<String> criarArvoreDeDecisoes() {
        Node<String> arvore = Node.create("Arvore de decisão");

        arvore.node("Mamífero").node("Quadrúpede").node("Carnívoro").node("Leão");
        arvore.node("Mamífero").node("Quadrúpede").node("Herbívoro").node("Cavalo");
        arvore.node("Mamífero").node("Bípede").node("Onívoro").node("Homem");
        arvore.node("Mamífero").node("Bípede").node("Frutífero").node("Macaco");
        arvore.node("Mamífero").node("Voador").node("Morcego");
        arvore.node("Mamífero").node("Aquatico").node("Baleia");

        arvore.node("Ave").node("Não Voadora").node("Tropical").node("Avestruz");
        arvore.node("Ave").node("Não Voadora").node("Polar").node("Pinguim");
        arvore.node("Ave").node("Nadadora").node("Pato");
        arvore.node("Ave").node("De Rapina").node("Águia");

        arvore.node("Réptil").node("Com Casco").node("Tartaruga");
        arvore.node("Réptil").node("Carnívoro").node("Crocodilo");
        arvore.node("Réptil").node("Sem Patas").node("Cobra");

        return arvore;
    }

    private void mensagem(String mensagem, List<?> parametros) {
        StringBuilder texto = new StringBuilder(mensagem);
        for (int i = 0; i < parametros.size(); i++) {
            if (i > 0) {
                texto.append(", ");
            }
            texto.append(parametros.get(i));
        }
        JOptionPane.showMessageDialog(null, texto.toString());
    }

    private boolean perguntar(String mensagem, Node<String> node) {
        List<Node<String>> subNodes = node.children();
        for (Node<String> subNode : subNodes) {
            if (subNode.isLeaf()) {
                JOptionPane.showMessageDialog(null, mensagem + subNode.value() + "!");
                return true;
            }
            String resposta = JOptionPane.showInputDialog(mensagem + subNode.value() + "?");
            if ("Sim".equalsIgnoreCase(resposta)) {
                return perguntar(mensagem, subNode);
            }
        }
        return false;
    }
}

Ficou muito legal. Bem mais facil pra adicionar as perguntas e as respostas. Valeu por mostrar.

Usa banco de dados, cria uma tabela com auto-relacionamento.