Java - Adivinar números

 
Vista:

Adivinar números

Publicado por HUlk (14 intervenciones) el 28/10/2018 12:00:34
No sé qué puede fallar en este programa. Soy novato, agradecería su comprensión y su pronta respuesta.

Crear un programa que adivine el número pensado por el usuario (entre 1 y 100).
El programa generará números aleatorios, con
trolando que no se repita ninguno de
los números y además será capaz de detectar si el usuario está mintiendo (porque
ya ha preguntado por todos los números y según el usuario no es ninguno). Deberá
contar además cuántos intentos ha necesitado. La salida p
or pantalla debe ser:
Es tu numero el 6? (true/false)
Estas mintiendo! He intentado todos los numeros!
El numero de intentos fueron 6.

CODE

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
package ejercicios;
 
import java.util.Scanner;
 
public class Ejercicio9 {
 
	public static void main(String[] args) {
		Scanner teclado = new Scanner (System.in);
		int a;
		int b=0;
		int d=0;
		int[] numeros = new int[100];
		boolean c= false;
		do {
		System.out.println("Introduzca un número del 0 al 100");
		a= teclado.nextInt();
		}
		while ( a>100 || a<0 );
		do {
			do {
				b= (int) Math.random ()*100+1;}
				while (numeros [b]==1);
			numeros [b]=1;
			System.out.println("Es su numero "+b+"?");
			c= teclado.nextBoolean();
			teclado.nextLine();
			d++;}
		while (c == false && d!=100);
		if (c == true) {
			System.out.println("Lo he conseguido en "+d+" intentos");
		}
			else
				System.out.println("Me estás mintiendo, he intentado todos los numeros");
 
		teclado.close();
	}
}
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

Adivinar números

Publicado por Kabuto (1381 intervenciones) el 28/10/2018 13:17:00
Hola.

Evita usar nombres de variables como a, b, c, .... no son descriptivos, quien lea el código no sabrá el propósito de cada variable, incluso tú mismo puedes confundirte si el programa se hace demasiado largo.
Es mejor usar nombres descriptivos, aunque suponga teclear más letras, pero entonces el código es más fácil de leer y comprender.

Esto así puede dar problemitas:
b= (int) Math.random ()*100+1;
Mejor si envuelves en parentesis tambien la expresión que casteamos a int
b= (int) (Math.random ()*100+1);


Luego, fallos en la lógica del código...
Le estás pidiendo al usuario que introduzca un número, pero no tiene que hacer esto.
Tan solo tenemos que generar un numero al azar, preguntarle si es el que está pensando y que nos responda true o false.

No estás guardando en el array los numeros que generamos al azar, así que no hay forma de controlar si estamos generando numeros repetidos o no.

De todos modos, no estás controlando si estamos repitiendo numeros. Tras cada numero al azar generado, hay que recorrer el array y buscar si ya existe el numero que acabamos de generar.
Por eso hay que ir guardando los numeros que generamos, para llevar un control.

Luego hay algo raro aquí. Generas un numero al azar y lo usas como indice del array para preguntar si en esa posicion al azar, hay un 1
1
2
3
4
do {
b= (int) Math.random ()*100+1;}
while (numeros [b]==1);
numeros [b]=1;

En fin, mira, te pongo aquí la lista de pasos que hay que seguir, para cumplir el objetivo.

1 - Generar numero al azar
2 - Comprobar si existe el numero generado en el array de numeros.
3 - Si ya existe, volver al paso 1
4 - Si no existe, lo guardamos en el array, contabilizamos este intento y preguntamos al usuario si es el numero que ha pensado.
5 - Si el usuario responde true, fin del juego, hemos acertado el numero que pensaba
6 - Si el usuario responde false, volvemos al paso 1
7 - Cuando los intentos lleguen a valor 100, es que hemos generado todos los numeros posibles y el usuario nos ha mentido diciendo que no lo hemos acertado.



Y además te pongo aquí el código con la solución. Tu decides si quieres primero intentarlo de nuevo por tí, o ver directamente la solución.
He incluido varios comentarios explicando cada cosa, aún así, por favor, no dudes en preguntar cualquier cosa que te parezca rara o no entiendas.
No te conformes solo con haber obtenido la solución.

Por último mencionar que el código se puede mejorar con programación algo más avanzada.
Por ejemplo usar un método que se encarge únicamente de generar un numero al azar no repetido o usar un try{} catch{} cuando le preguntamos al usuario que nos diga true o false. Porque ahora mismo si no teclea correctamente las palabras "true" o "false", se produce una excepcion y el programa termina brúscamente.
Con try.. catch podemos evitar que esto ocurra y no pasaría nada si el usuario no teclea bien. Pero todo esto ya lo irás aprendiendo con el tiempo, no vale la pena complicar más el código.

Un saludo.

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
import java.util.Scanner;
 
public class Ejercicio9 {
 
	public static void main(String[] args) {
		Scanner teclado = new Scanner (System.in);
 
		int[] numeros = new int[100];
		int intentos = 0;
		int numAzar = 0;
		boolean respuesta = false;
		boolean repetido = false;
 
		do {
			do {//Bucle para generar numero azar no repetido
				repetido = false;
				numAzar = (int) (Math.random ()*100+1);
				//recorremos array de numeros generados con un FOR, desde posicion 0 hasta los intentos que llevamos hechos
				//El FOR tambien se detendrá automaticamente si encontramos un repetido, porque ya no hará falta que siga buscando
				for (int i = 0; i < intentos && repetido == false; i++)
				{
					if (numeros[i] == numAzar)
						repetido = true;//Este numero azar ya esta repetido, no nos sirve
				}
			}while(repetido == true);//Esto se repite hasta generar un numero no repetido
 
			//Ahora ya tenemos un numero no repetido, lo guardamos en el array, contamos el intento y preguntamos al usuario
			numeros[intentos] = numAzar;//La variable intentos nos sirve de indice para el array, ya que irá de 0 a 99 en cada intento 
			intentos++;//YA hemos guardado el numero, incrementamos el contador para el próximo intento, si lo hubiera
			System.out.println("¿Su numero es el " + numAzar + " ?");
			respuesta = teclado.nextBoolean();
 
			//Evaluamos respuesta, si TRUE hemos acertado e informamos al usuario.
			//Si no, no hacemos nada. Dejamos que el WHILE se repita de nuevo para volver a intentarlo
			if (respuesta == true )
				System.out.println("Lo he conseguido en " + intentos + " intentos.");
 
		}while(respuesta == false && intentos < 100);
		//El bucle WHILE ha terminado, puede que sea porque hemos acertado.
		//Pero también puede ser porque hemos completado los 100 intentos posibles y el usuario nos ha engañado
		if (intentos == 100)
			System.out.println("Me estás mintiendo, he intentado todos los numeros");
 
		teclado.close();
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Adivinar números

Publicado por HUlk (14 intervenciones) el 28/10/2018 14:11:32
Muchas gracias Kabuto. Intentaré hacerlo por mi cuenta siguiendo tus indicaciones.
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