First, you don’t need these if (esc == 1)
, if (esc == 2)
, etc. The answer code of the previous question was made so that you had the same code no matter what the esc
. I’ll repeat what I put in my answer to the previous question:
Always prefer to use math than a lot of if
s with copied and pasted code.
Second, let’s simplify the generation of random numbers a little bit:
private static final Random RND = new Random();
private int numeroAleatorio() {
return RND.nextInt(set * 10) + 1;
}
Third, that you have resultadoConta = res1 + res2
because you were doing a bill like X = A + B
, where A
and B
were the numbers given and X
was the unknown value to be answered. Now you have accounts in the format X + A = B
, and will probably have other such as X - A = B
, A + X = B
, A - X = B
, A * B = X
, X * A = B
, A / X = B
, AX = B
, etc..
To model all these possible accounts, first use a class to represent the operation:
public class Conta {
private int a;
private int b;
private int x;
private String formato;
public Conta(int a, int b, int x, String formato) {
this.a = a;
this.b = b;
this.x = x;
this.formato = formato
.replace("A", String.valueOf(a))
.replace("B", String.valueOf(b));
}
public int getA() {
return a;
}
public int getB() {
return a;
}
public int getX() {
return x;
}
public String getFormato() {
return formato;
}
public String getTermo1() {
return formato.split(" ")[0];
}
public String getOperacao() {
return formato.split(" ")[1];
}
public String getTermo2() {
return formato.split(" ")[2];
}
public String getResultado() {
return formato.split(" ")[4];
}
}
And then use an interface to represent all kinds of possible operations and generate the numbers accordingly:
public interface ModeloConta {
public Conta fazerConta();
}
And with this interface, generate a lot of implementations in an array:
ModeloConta[] modelos = {
new ModeloConta() {
@Override
public Conta fazerConta() {
int a = numeroAleatorio();
int b = numeroAleatorio();
int x = a + b;
return new Conta(a, b, x, "A + B = X");
}
},
new ModeloConta() {
@Override
public Conta fazerConta() {
int a = numeroAleatorio();
int x = numeroAleatorio();
int b = a + x;
return new Conta(a, b, x, "A + X = B");
}
},
new ModeloConta() {
@Override
public Conta fazerConta() {
int a = numeroAleatorio();
int x = numeroAleatorio();
int b = a + x;
return new Conta(a, b, x, "X + A = B");
}
},
new ModeloConta() {
@Override
public Conta fazerConta() {
int a = numeroAleatorio();
int x = numeroAleatorio();
int b = a * x;
return new Conta(a, b, x, "A * X = B");
}
},
new ModeloConta() {
@Override
public Conta fazerConta() {
int x = numeroAleatorio();
int a = numeroAleatorio();
int b = x - a;
return new Conta(a, b, x, "X - A = B");
}
}
};
If you are using Java 8 or higher, this above code can be simplified for this:
ModeloConta[] modelos = {
() -> {
int a = numeroAleatorio();
int b = numeroAleatorio();
int x = a + b;
return new Conta(a, b, x, "A + B = X");
},
() -> {
int a = numeroAleatorio();
int x = numeroAleatorio();
int b = a + x;
return new Conta(a, b, x, "A + X = B");
},
() -> {
int a = numeroAleatorio();
int x = numeroAleatorio();
int b = a + x;
return new Conta(a, b, x, "X + A = B");
},
() -> {
int a = numeroAleatorio();
int x = numeroAleatorio();
int b = a * x;
return new Conta(a, b, x, "A * X = B");
},
() -> {
int x = numeroAleatorio();
int a = numeroAleatorio();
int b = x - a;
return new Conta(a, b, x, "X - A = B");
}
};
Put in the array all the account templates you have. Then having the templates, you adapt the previous code to choose a template and use. I will also use an array of TextView
in case you want more than four answers and also to make sure you don’t want to replace this with a lot of if
s awful:
TextView[] opcoes = {op1, op2, op3, op4 /*, op5, op6, op7, quantas você quiser */};
ModeloConta modeloEscolhido = modelos[RND.nextInt(modelos.length)];
Conta conta = modeloEscolhido.fazerConta();
int respostaCerta = conta.getX();
esc = RND.nextInt(opcoes.length);
Set<Integer> respostas = new HashSet<>();
respostas.add(respostaCerta);
while (respostas.size() < opcoes.length) {
respostas.add(modeloEscolhido.fazerConta().getX());
}
respostas.remove(conta.getX());
Iterator<Integer> respostasErradas = respostas.iterator();
for (int i = 0; i < opcoes.length; i++) {
int valor = esc == i ? respostaCerta : respostasErradas.next();
opcoes[i].setText(Integer.toString(valor));
}
num1.setText(conta.termo1());
sinal.setText(conta.operacao());
num2.setText(conta.termo2());
txt_resultado.setText(conta.resultado());
The variables res1
, res2
and resultadoConta
should then be deleted. The method numeroDecisao()
should also be deleted. I added a TextView
calling for sinal
to save the desired signal for the operation.
By the way, if you prefer, you can replace num1
, sinal
, num2
and txt_resultado
by a single TextView
that will have the entire account. In that case, you would change it:
num1.setText(conta.getTermo1());
sinal.setText(conta.getOperacao());
num2.setText(conta.getTermo2());
txt_resultado.setText(conta.getResultado());
That’s why:
txtConta.setText(conta.getFormato());
Where txtConta
would be the TextView
in which you would show the account (will appear as also similar to 5 + X = 12
). Having this new TextView
, you would delete the TextView
s num1
, num2
, sinal
and txt_resultado
. Could also delete methods getTermo1()
, getOperaco()
, getTermo2()
and getResultado()
class Conta
.
Put your current code here instead of just pointing to the previous question as if nothing had changed. The link was supposed to be just a detail to explain the context better to anyone who would answer the question, it wasn’t supposed to be practically the whole question.
– Victor Stafusa
@Victorstafusa, thanks for the tip, I’m still learning how to ask the right questions in the stack. I did the editing and put in the code snippet.
– Christian Gomes da Silva