Java - Ayuda con trivia matemática

 
Vista:
sin imagen de perfil

Ayuda con trivia matemática

Publicado por Maria (3 intervenciones) el 14/08/2022 03:59:54
Este juego consiste en una trivia matemática, donde se va a ir mostrando al usuario preguntas
matemáticas que debe ir resolviendo de forma acumulada.
Cada pregunta va a estar formada de una operación matemática donde los números mostrados
se van a ir generando de forma aleatoria entre el 5 y el 25 y los signos de operación permitidos
son la suma ( + ), resta ( - ) y multiplicación ( * ), los cuales también se van a escoger al azar.
Con cada pregunta se le van a mostrar al usuario 3 opciones de respuesta, definidas de la
siguiente forma:
• Respuesta 1: es el resultado correcto de la operación definida
• Respuesta 2: se genera aleatoriamente con un número entre -35 y uno menos al valor
de la respuesta. Por ejemplo si el resultado correcto es 10, entonces se genera un
número aleatoriamente entre --35 y 9.
• Respuesta 3: se genera aleatoriamente con un número entre un valor mayor a la
respuesta correcta y 900. Por ejemplo si el resultado correcto es 20, entonces se genera
un número aleatoriamente entre 21 y 900.
Para evitar que todas las preguntas tengan siempre la respuesta en la primera opción, el orden
de las respuestas se deben colocar de forma aleatoria.
En total se deben realizar 5 operaciones. Por cada pregunta, se le debe indicar al usuario el
número, por ejemplo: “ Pregunta 1 … ”.
Si el usuario responde una pregunta de forma incorrecta, el programa le muestra un mensaje
indicando el resultado correcto.
Al final del juego, se le muestra al usuario la cantidad de respuestas correctas e incorrectas.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda con trivia matemática

Publicado por Kabuto (1381 intervenciones) el 14/08/2022 14:30:23
Un ejercicio interesante.

Así sobre la marcha, se me ocurre que para decidir al azar el tipo de operación matemática, previamente podemos declarar un array de tipo char con los 3 símbolos para cada tipo de operación.
De ese array iremos seleccionado un elemento al azar para cada pregunta que vayamos generando.

Para las selecciones al azar, necesitaremos un objeto Random, el cuál además nos servirá para generar números y otras selecciones.

Para generar preguntas, podemos desarrollar un método al que cada vez que lo llamemos, haga todo el trabajo de generar la pregunta y nos retorne la respuesta correcta, para luego poder comparar con la respuesta del usuario.

De momento, comenzaríamos así:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.util.Random;
 
public class Trivia {
 
	//Las 3 operaciones matemáticas posibles
	private static final char[] OPERADORES = {'+', '-', '*'};
	//Objeto Random
	private static Random azar = new Random();
 
	public static void main(String[] args) {
 
 
 
	}
 
	/*
	 * Genera una pregunta matemática al azar y
	 * retorna la respuesta que sería correcta
	 */
	private static int generarPregunta() {
 
 
 
	}
 
}

Vamos a ver cómo desarrollamos el método generarPregunta(), que es quien llevará todo el peso del programa.
Primero vamos a generar los dos valores con los que vamos a operar, nos dicen que han de ser entre 5 y 25.
Para ello le pedimos al objeto random que genera un entero con un límite de 21. Esto nos dará un entero entre 0 y 20(límite 21 queda excluido)
Si a este entero, le sumamos 5, pues ya tendremos valores entre 5 y 25
1
2
3
4
5
6
7
private static int generarPregunta() {
 
		//Operamos con dos valores generados entre 5 y 25
		int valor1 = azar.nextInt(21) + 5;
		int valor2 = azar.nextInt(21) + 5;
 
	}
Ahora necesitamos seleccionar un operador al azar. Para ello cogemos un char del array de OPERADORES pidiéndole al objeto random que nos de un entero con limite 3, es decir, nos dará un valor entre 0 y 2, que son las posibles posiciones del array.

1
2
3
4
5
6
7
8
9
private static int generarPregunta() {
 
		//Operamos con dos valores generados entre 5 y 25
		int valor1 = azar.nextInt(21) + 5;
		int valor2 = azar.nextInt(21) + 5;
		//Seleccionamos un operador al azar
		char operador = OPERADORES[azar.nextInt(3)];
 
	}

Vale, tenemos los valores y el operador.
Ahora hay que analizar que operador nos ha tocado y decidir si creamos una suma, una resta, etc..
Es muy fácil hacerlo con un switch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private static int generarPregunta() {
 
		//Operamos con dos valores generados entre 5 y 25
		int valor1 = azar.nextInt(21) + 5;
		int valor2 = azar.nextInt(21) + 5;
		//Seleccionamos un operador al azar
		char operador = OPERADORES[azar.nextInt(3)];
		//Analizamos operador obtenido, usamos un switch
		switch(operador) {
		case '+':
			//Suma
			break;
		case '-':
			//Resta
			break;
		case '*':
			//Multiplicación
			break;
		}
	}

Bueno, hasta aquí un camino de rosas.
Ahora se complica un poco la cosa. Hay que generar 3 respuestas.
Una es la respuesta correcta.
Las otras dos son respuestas falsas que hemos de generar, cada una con determinadas reglas, y utilizando la respuesta correcta como base.
Y además, ojo a esto, cuando tengamos las tres respuestas, hemos de mostrarlas en pantalla en posiciones al azar. Es decir, la Respuesta #1 no tiene que ser siempre la correcta.

Para hacer selecciones de elementos al azar, ya hemos visto que es imprescindible contener esos elementos en algún tipo de colección de datos.
Para los operadores hemos usado un array primitivo. Para las respuestas podríamos usar otro, pero aquí hay una diferencia.

Con los operadores no importa si al elegir al azar, se repite o no el operador seleccionado. Si el azar decide que nos van a salir 5 sumas, pues que así sea.
En cambio para las respuestas, queremos elegirlas al azar al decidir quién es respuesta #1, quién es respuesta #2,... , pero que no se repitan. Hay que evitar que una misma respuesta salga al azar como respuesta #1 y también #3

Para poder controlar esto mejor, podemos usar esta vez un ArrayList, que es un tipo de colección más avanzada que un array primitivo. Y nos permite eliminar de la colección una respuesta que ya haya sido seleccionada, así no hay riesgo de que se repita dos o más veces.

Entonces, por ahora, justo antes del switch vamos a declarar un ArrayList para guardar enteros, que serán las tres posibles respuestas.
Además una variable int donde calcularemos la respuesta correcta.
Y en cada case del switch, comenzaremos añadiendo a este ArrayList la respuesta correcta en cada caso:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
private static int generarPregunta() {
 
		//Operamos con dos valores generados entre 5 y 25
		int valor1 = azar.nextInt(21) + 5;
		int valor2 = azar.nextInt(21) + 5;
		//Seleccionamos un operador al azar
		char operador = OPERADORES[azar.nextInt(3)];
 
		//ArrayList para almacenar las tres posibles respuestas
		ArrayList<Integer> respuestas = new ArrayList<Integer>();
		int correcta = 0;
		//Analizamos operador obtenido, usamos un switch
		switch(operador) {
		case '+':
			//Suma, calculamos respuesta correcta y añadimos
			correcta = valor1 + valor2;
			respuestas.add(correcta);
			break;
		case '-':
			//Resta
			correcta = valor1 - valor2;
			respuestas.add(correcta);
			break;
		case '*':
			//Multiplicación
			correcta = valor1 * valor2;
			respuestas.add(correcta);
			break;
		}
	}

Vale, ahora viene la tarea de generar las otras dos respuestas falsas.
La segunda respuesta es fácil, es un valor entre -35 y la respuesta correcta - 1.
Así que basta con generar un int entre 0 y "correcta", y luego restarle -35

La tercera respuesta es un poco más enrevesada, un valor entre "correcta" + 1 y 900 inclusive.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
private static int generarPregunta() {
 
		//Operamos con dos valores generados entre 5 y 25
		int valor1 = azar.nextInt(21) + 5;
		int valor2 = azar.nextInt(21) + 5;
		//Seleccionamos un operador al azar
		char operador = OPERADORES[azar.nextInt(3)];
 
		//ArrayList para almacenar las tres posibles respuestas
		ArrayList<Integer> respuestas = new ArrayList<Integer>();
		int correcta = 0;
		//Analizamos operador obtenido, usamos un switch
		switch(operador) {
		case '+':
			//Suma, calculamos respuesta correcta y añadimos
			correcta = valor1 + valor2;
			respuestas.add(correcta);
			//Respuesta 2
			respuestas.add(azar.nextInt(correcta) - 35);
			//Respuesta 3
			respuestas.add(azar.nextInt(902 - correcta) + correcta + 1);
			break;
		case '-':
			//Resta
			correcta = valor1 - valor2;
			respuestas.add(correcta);
			//Respuesta 2
			respuestas.add(azar.nextInt(correcta) - 35);
			//Respuesta 3
			respuestas.add(azar.nextInt(902 - correcta) + correcta + 1);
			break;
		case '*':
			//Multiplicación
			correcta = valor1 * valor2;
			respuestas.add(correcta);
			//Respuesta 2
			respuestas.add(azar.nextInt(correcta) - 35);
			//Respuesta 3
			respuestas.add(azar.nextInt(902 - correcta) + correcta + 1);
			break;
		}
	}

Vale, respuestas calculadas y contenidas en el ArrayList.
Ahora hay que presentar en pantalla la pregunta y las respuestas en un orden al azar.
Para ello mostramos un mensaje cualquiera con los dos valores y el operador.
Luego las respuestas, extrayendo al azar elementos del ArrayList. En cada extracción, el valor elegido desaparece del ArrayList, así no hay riesgo de repeticiones indeseadas.

Una vez mostrado esto en pantalla, el método termina retornando la respuesta correcta. En este método no vamos a pedir nada al usuario ni vamos a evaluar si acierta o se equivoca. Esto lo haremos en el programa principal
Este método se dedica exclusivamente a crear la pregunta, la respuestas, mostrarlas en pantalla y retornar la respuesta correcta.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
private static int generarPregunta() {
 
		//Operamos con dos valores generados entre 5 y 25
		int valor1 = azar.nextInt(21) + 5;
		int valor2 = azar.nextInt(21) + 5;
		//Seleccionamos un operador al azar
		char operador = OPERADORES[azar.nextInt(3)];
 
		//ArrayList para almacenar las tres posibles respuestas
		ArrayList<Integer> respuestas = new ArrayList<Integer>();
		int correcta = 0;
		//Analizamos operador obtenido, usamos un switch
		switch(operador) {
		case '+':
			//Suma, calculamos respuesta correcta y añadimos
			correcta = valor1 + valor2;
			respuestas.add(correcta);
			//Respuesta 2
			respuestas.add(azar.nextInt(correcta) - 35);
			//Respuesta 3
			respuestas.add(azar.nextInt(902 - correcta) + correcta + 1);
			break;
		case '-':
			//Resta
			correcta = valor1 - valor2;
			respuestas.add(correcta);
			//Respuesta 2
			respuestas.add(azar.nextInt(correcta) - 35);
			//Respuesta 3
			respuestas.add(azar.nextInt(902 - correcta) + correcta + 1);
			break;
		case '*':
			//Multiplicación
			correcta = valor1 * valor2;
			respuestas.add(correcta);
			//Respuesta 2
			respuestas.add(azar.nextInt(correcta) - 35);
			//Respuesta 3
			respuestas.add(azar.nextInt(902 - correcta) + correcta + 1);
			break;
		}
 
		//Presentación en pantalla
		System.out.println("\n\tAcierta el resultado de " + valor1 + " " + operador + " " + valor2);
		//Mostramos posibles respuestas seleccionadas al azar
		System.out.println("\nRespuesta #1: " + respuestas.remove(azar.nextInt(3)));
		System.out.println("Respuesta #2: " + respuestas.remove(azar.nextInt(2)));
		System.out.println("Respuesta #3: " + respuestas.remove(0)); //Ya solo queda un posible elemento
 
		//Por último, retornamos la respuesta correcta
		return correcta;
	}

Ahora nos vamos al método main() de nuestra clase, y podemos hacer una prueba inicial de este método que hemos escrito.
Simplemente lo llamamos para que se ejecute, y así veremos si no da errores y si genera una pregunta y unas respuestas que se ajuste a los que nos han pedido.
1
2
3
4
5
public static void main(String[] args) {
 
		generarPregunta(); //Probando método...
 
	}

Podemos ver en pantalla que parece funcionar bien:
1
2
3
4
5
Acierta el resultado de 10 - 9
 
Respuesta #1: 1
Respuesta #2: 219
Respuesta #3: -35

Si lo probamos varias veces, veremos que la respuesta correcta sale en distintas posiciones, así que la selección al azar funciona perfectamente.

Vale, pues sabiendo que esto funciona, vamos a desarrollar el programa principal.
La mecánica es realizar 5 preguntas, recoger la respuesta del usuario y al final decirle cuántas ha acertado y cuántas ha fallado.
Bien, pues necesitaremos un objeto Scanner para pedir respuestas al usuario y un contador de respuestas acertadas.

Usamos un bucle FOR que se repita 5 veces.
En cada repetición llamamos a nuestro método para que genera la pregunta trivia y recogemos la respuesta correcta que nos va a retornar.
Pedimos al usuario que nos de su respuesta y comparamos con la correcta para ver si ha acertado.
Si acierta, le felicitamos y aumentamos contador de aciertos.
Si falla, le abucheamos e indicamos la respuesta correcta.

Cuando termine el bucle FOR, mostramos cuántas ha acertado y cuántas ha fallado.
Y fin de programa.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
 
public class Trivia {
 
	//Las 3 operaciones matemáticas posibles
	private static final char[] OPERADORES = {'+', '-', '*'};
	//Objeto Random
	private static Random azar = new Random();
 
	public static void main(String[] args) {
 
		Scanner teclado = new Scanner(System.in);
		int acertadas = 0;
 
		for (int i = 1; i <= 5 ; i++) {
			System.out.println("\n\t\tPregunta #" + i);
			int correcta = generarPregunta();
			System.out.print("Tu respuesta: ");
			int respuesta = teclado.nextInt();
			if (respuesta == correcta) {
				System.out.println("¡¡Correcto!!");
				acertadas++;
			}
			else {
				System.out.println("¡¡Error!!");
				System.out.println("Respuesta correcta: " + correcta);
			}
		}
 
		//Ciclo de preguntas terminado. Mostramos resultados
		System.out.println("\n\t\tJuego terminado");
		System.out.println("Aciertos: " + acertadas);
		System.out.println("Fallos: " + (5 - acertadas));
 
		System.out.println("\n\t\tFIN DE PROGRAMA");
		teclado.close();
	}
 
	/*
	 * Genera una pregunta matemática al azar y
	 * retorna la respuesta que sería correcta
	 */
	private static int generarPregunta() {
 
		//Operamos con dos valores generados entre 5 y 25
		int valor1 = azar.nextInt(21) + 5;
		int valor2 = azar.nextInt(21) + 5;
		//Seleccionamos un operador al azar
		char operador = OPERADORES[azar.nextInt(3)];
 
		//ArrayList para almacenar las tres posibles respuestas
		ArrayList<Integer> respuestas = new ArrayList<Integer>();
		int correcta = 0;
		//Analizamos operador obtenido, usamos un switch
		switch(operador) {
		case '+':
			//Suma, calculamos respuesta correcta y añadimos
			correcta = valor1 + valor2;
			respuestas.add(correcta);
			//Respuesta 2
			respuestas.add(azar.nextInt(correcta) - 35);
			//Respuesta 3
			respuestas.add(azar.nextInt(902 - correcta) + correcta + 1);
			break;
		case '-':
			//Resta
			correcta = valor1 - valor2;
			respuestas.add(correcta);
			//Respuesta 2
			respuestas.add(azar.nextInt(correcta) - 35);
			//Respuesta 3
			respuestas.add(azar.nextInt(902 - correcta) + correcta + 1);
			break;
		case '*':
			//Multiplicación
			correcta = valor1 * valor2;
			respuestas.add(correcta);
			//Respuesta 2
			respuestas.add(azar.nextInt(correcta) - 35);
			//Respuesta 3
			respuestas.add(azar.nextInt(902 - correcta) + correcta + 1);
			break;
		}
 
		//Presentación en pantalla
		System.out.println("\n\tAcierta el resultado de " + valor1 + " " + operador + " " + valor2);
		//Mostramos posibles respuestas seleccionadas al azar
		System.out.println("\nRespuesta #1: " + respuestas.remove(azar.nextInt(3)));
		System.out.println("Respuesta #2: " + respuestas.remove(azar.nextInt(2)));
		System.out.println("Respuesta #3: " + respuestas.remove(0)); //Ya solo queda un posible elemento
 
		//Por último, retornamos la respuesta correcta
		return correcta;
	}
 
}

Si probamos el programa, todo parece funcionar bien, se cuentan aciertos y errores correctamente.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Pregunta #1
 
	Acierta el resultado de 25 * 19
 
Respuesta #1: 475
Respuesta #2: -34
Respuesta #3: 682
Tu respuesta: 475
¡¡Correcto!!
 
		Pregunta #2
 
	Acierta el resultado de 6 + 24
 
Respuesta #1: 30
Respuesta #2: -21
Respuesta #3: 61
Tu respuesta: 30
¡¡Correcto!!
 
		Pregunta #3
 
	Acierta el resultado de 7 + 8
 
Respuesta #1: 844
Respuesta #2: -29
Respuesta #3: 15
Tu respuesta: 15
¡¡Correcto!!
 
		Pregunta #4
 
	Acierta el resultado de 19 + 25
 
Respuesta #1: -32
Respuesta #2: 495
Respuesta #3: 44
Tu respuesta: 44
¡¡Correcto!!
 
		Pregunta #5
 
	Acierta el resultado de 20 + 24
 
Respuesta #1: 471
Respuesta #2: 44
Respuesta #3: 0
Tu respuesta: 99999
¡¡Error!!
Respuesta correcta: 44
 
		Juego terminado
Aciertos: 4
Fallos: 1
 
		FIN DE PROGRAMA


Entonces, ¿ya está? ¿Hemos terminado? :-)

Pues casi, pero no.... (-_-x)

Como todo programa con cierta complejidad..., puede presentar errores inesperados.
Y este programa lo tiene, hay un error que puede ocurrir aleatoriamente.

En el caso de que se genere una resta, si el valor1 es MENOR que el valor2, la respuesta correcta será un valor negativo.
Por ejemplo: 5 - 7 = -2

Vale, ¿y cuál es el problema?
Pues que en este caso, luego al querer generar la respuesta 2, le estaremos pasando un valor negativo al método nextInt() del objeto Random

1
2
3
4
5
6
case '-':
			//Resta
			correcta = valor1 - valor2;
			respuestas.add(correcta);
			//Respuesta 2
			respuestas.add(azar.nextInt(correcta) - 35);

Y esto producirá una excepción interrumpiéndose el programa, porque este método no acepta ni negativos ni valor 0.
Así que tenemos buscar una solución para impedir que esta casuística nos fastidie el programa.

Una forma rápida de solucionarlo, podría ser capturar la excepción y cuanto esta ocurra, retornar una llamada recursiva al propio método para que genera una nueva pregunta, quedando esta pregunta actual descartada.

Así que envolvemos el switch donde analizamos el operador con un try catch para poder capturar la posible excepción y actuar en consecuencia:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
private static int generarPregunta() {
 
		//Operamos con dos valores generados entre 5 y 25
		int valor1 = azar.nextInt(21) + 5;
		int valor2 = azar.nextInt(21) + 5;
		//Seleccionamos un operador al azar
		char operador = OPERADORES[azar.nextInt(3)];
 
		//ArrayList para almacenar las tres posibles respuestas
		ArrayList<Integer> respuestas = new ArrayList<Integer>();
		int correcta = 0;
		//Analizamos operador obtenido, usamos un switch
		try {
			switch(operador) {
			case '+':
				//Suma, calculamos respuesta correcta y añadimos
				correcta = valor1 + valor2;
				respuestas.add(correcta);
				//Respuesta 2
				respuestas.add(azar.nextInt(correcta) - 35);
				//Respuesta 3
				respuestas.add(azar.nextInt(902 - correcta) + correcta + 1);
				break;
			case '-':
				//Resta
				correcta = valor1 - valor2;
				respuestas.add(correcta);
				//Respuesta 2
				respuestas.add(azar.nextInt(correcta) - 35);
				//Respuesta 3
				respuestas.add(azar.nextInt(902 - correcta) + correcta + 1);
				break;
			case '*':
				//Multiplicación
				correcta = valor1 * valor2;
				respuestas.add(correcta);
				//Respuesta 2
				respuestas.add(azar.nextInt(correcta) - 35);
				//Respuesta 3
				respuestas.add(azar.nextInt(902 - correcta) + correcta + 1);
				break;
			}
		}
		catch(IllegalArgumentException ex) {
			/*
			 * Objeto Random podría generar una excepción si
			 * recibe un valor 0 o negativo. Esto puede ocurrir
			 * especialmente en el caso de que estemos creando una resta.
			 * En caso de que ocurra, lo que haremos será retornar una
			 * nueva pregunta.
			 */
			return generarPregunta();
		}
 
		//Presentación en pantalla
		System.out.println("\n\tAcierta el resultado de " + valor1 + " " + operador + " " + valor2);
		//Mostramos posibles respuestas seleccionadas al azar
		System.out.println("\nRespuesta #1: " + respuestas.remove(azar.nextInt(3)));
		System.out.println("Respuesta #2: " + respuestas.remove(azar.nextInt(2)));
		System.out.println("Respuesta #3: " + respuestas.remove(0)); //Ya solo queda un posible elemento
 
		//Por último, retornamos la respuesta correcta
		return correcta;
	}

Y con esto parece quedar solucionado dicho problema. He estado probando varias veces, forzando a que solo se generen restas y haciendo que muestre un mensaje en pantalla cada vez que ocurre una excepción, y parece que se gestiona bien esta incidencia.
El ciclo de 5 preguntas no se ve afectado aunque se estén descartando y generando preguntas extra.

Otra forma de solucionarlo sería comparar los valores antes de hacer la resta. Si son iguales o si valor1 es inferior a valor 2, tendríamos un negativo, así que habría que evitarlo intercambiando los valores o alternadolos para asegurarnos de que valor1 SIEMPRE es mayor que valor2.

En fin, espero que tanta explicación haya servido para que todo quede lo más claro posible.
Si tienes dudas, pregunta por aquí.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda con trivia matemática

Publicado por Maria (3 intervenciones) el 17/08/2022 18:54:51
Hola, muchas gracias por la ayuda. Tenia una pregunta?
Necesito hacerlo con la librería java.swing.JOptionPane;
Ya que necesito que se muestre al usuario y no en el output.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda con trivia matemática

Publicado por Kabuto (1381 intervenciones) el 18/08/2022 18:39:16
En ese caso, el método generarPregunta() ha de modificarse y realizar más tareas.
Para mostrar las respuestas generadas se puede usar el método showOptionDialog() de JOptionPane.
Esas respuestas han de estar contenidas en un array de una clase que sea hija de Object, en este caso nos conviene usar Integer.

Como antes, usaremos el ArrayList para obtener respuestas en posiciones al azar, solo que esta vez en lugar de mostrarlas en pantalla directamente, las meteremos en ese array para luego pasárselo al JOptionPane y que los muestre.

Podemos evaluar si la respuesta es correcta directamente en el método generarPregunta() y hacer que ahora sea de tipo boolean para indicar si el usuario ha elegido la correcta o no.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import java.util.ArrayList;
import java.util.Random;
 
import javax.swing.JOptionPane;
 
public class Trivia {
 
	//Las 3 operaciones matemáticas posibles
	private static final char[] OPERADORES = {'+', '-', '*'};
	//Objeto Random
	private static Random azar = new Random();
 
	public static void main(String[] args) {
 
		int acertadas = 0;
 
		for (int i = 1; i <= 5 ; i++) {
 
			if (generarPregunta(i)) {
				JOptionPane.showMessageDialog(null,
						"¡¡Correcto!!", "Respuesta", JOptionPane.WARNING_MESSAGE);
				acertadas++;
			}
			else {
				JOptionPane.showMessageDialog(null,
						"¡¡Error!!", "Respuesta", JOptionPane.ERROR_MESSAGE);
			}
		}
 
		//Ciclo de preguntas terminado. Mostramos resultados
		JOptionPane.showMessageDialog(null,
				String.format("Juego terminado\nAciertos: %d\nFallos: %d", acertadas, 5-acertadas),
				"Resultados", JOptionPane.INFORMATION_MESSAGE);
	}
 
	/*
	 * Genera una pregunta matemática al azar y
	 * retorna la respuesta que sería correcta
	 */
	private static boolean generarPregunta(int nPregunta) {
 
		//Operamos con dos valores generados entre 5 y 25
		int valor1 = azar.nextInt(21) + 5;
		int valor2 = azar.nextInt(21) + 5;
		//Seleccionamos un operador al azar
		char operador = OPERADORES[azar.nextInt(3)];
 
		//ArrayList para almacenar las tres posibles respuestas
		ArrayList<Integer> respuestas = new ArrayList<Integer>();
		int correcta = 0;
		//Analizamos operador obtenido, usamos un switch
		try {
			switch(operador) {
			case '+':
				//Suma, calculamos respuesta correcta y añadimos
				correcta = valor1 + valor2;
				respuestas.add(correcta);
				//Respuesta 2
				respuestas.add(azar.nextInt(correcta) - 35);
				//Respuesta 3
				respuestas.add(azar.nextInt(902 - correcta) + correcta + 1);
				break;
			case '-':
				//Resta
				correcta = valor1 - valor2;
				respuestas.add(correcta);
				//Respuesta 2
				respuestas.add(azar.nextInt(correcta) - 35);
				//Respuesta 3
				respuestas.add(azar.nextInt(902 - correcta) + correcta + 1);
				break;
			case '*':
				//Multiplicación
				correcta = valor1 * valor2;
				respuestas.add(correcta);
				//Respuesta 2
				respuestas.add(azar.nextInt(correcta) - 35);
				//Respuesta 3
				respuestas.add(azar.nextInt(902 - correcta) + correcta + 1);
				break;
			}
		}
		catch(IllegalArgumentException ex) {
			/*
			 * Objeto Random podría generar una excepción si
			 * recibe un valor 0 o negativo. Esto puede ocurrir
			 * especialmente en el caso de que estemos creando una resta.
			 * En caso de que ocurra, lo que haremos será retornar una
			 * nueva pregunta.
			 */
			return generarPregunta(nPregunta);
		}
 
		//Presentacion con JOptionPane
		//Primero construimos un array con las respuestas
		Integer[] respus = new Integer[3];
		respus[0] = respuestas.remove(azar.nextInt(3));
		respus[1] = respuestas.remove(azar.nextInt(2));
		respus[2] = respuestas.remove(0);
		int respuesta = JOptionPane.showOptionDialog(null, "Acierta el resultado de "+valor1+" "+operador+" "+valor2,
				"Pregunta #"+nPregunta, 0, JOptionPane.QUESTION_MESSAGE, null, respus, 0);
 
 
		//Por último, informamos si ha acertado o no.
		return correcta == respus[respuesta];
	}
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar