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.