Ejercicio 1. Adivina un número

Crea una aplicación que permita adivinar un número. La aplicación genera un número aleatorio del 1 al 100. A continuación va pidiendo números y va respondiendo si el número a adivinar es mayor o menor que el introducido, a demás de los intentos que te quedan (tienes 10 intentos para acertarlo). 

El programa termina cuando se acierta el número (además te dice en cuantos intentos lo has acertado), si se llega al limite de intentos te muestra el número que había generado.

Este es el primer ejercicio de repaso de estructuras repetitivas en JAVA, o lo que es lo mismo, el primero en el que veremos el uso de estructuras como for, while o do-while… ahora iremos analizando cual es, a mi juicio, la opción más adecuada en cada caso.

Para la realización de este primer programa, vemos que podemos dividirlo en tres partes:

Obtención de número aleatorio.

Para obtener un número aleatorio, debemos hacer uso de otra función del método ya bastante frecuentado Math de Java.

En esta ocasión, en concreto haremos uso de Math.random(), la cual nos devuelve un valor aleatorio entre 0.0 y 1.0. ¿Cómo hacemos para que el valor que nos devuelva esté entre 1 y 100?

Math.random()*numerosRango + numeroInicial

Para conseguir ese valor, debemos multiplicar Math.random() * (cantidad de números en el rango) en este caso, 100 (incluye el 1 y el 100).

Para que después empiece a mostrar desde el número 1, debemos sumar 1.

Por ejemplo, si en vez de números del 1 al 100 queremos, 50 números, del 51 al 100 debemos poner Math.random() * 50 +51;

Elección estructura repetitiva (do-while)

Una vez tenemos el valor aleatorio en el rango deseado, debemos elegir el tipo de bucle más adecuado para nuestro programa, entre las tres opciones que hemos visto, nos decantamos por do-while, ¿por qué?

Este bucle, realizará al menos una vez la comprobación tipo “Intenta adivinar el número”, y será al final de la ejecución de este bloque, cuando comprobará si el valor asignado a la variable coincide con el número aleatorio, o si se han acabado los intentos que deseas realizar.

Para la realización de este bloque, necesitaremos las siguientes variables:

  • numeroAleatorio, asignado en el apartado anterior.
  • intento almacenará el valor que el usuario introduzca por teclado en cada ciclo que realice el bucle.
  • contador será una variable, que irá aumentando en cada ciclo y que provocará la salida del mismo en el caso de alcanzar un valor igual a 0 (debe inicializarse a 9)

Condiciones que debe cumplir el ciclo do-while

  • Si intento = numeroAleatorio, debe salir del bucle e indicar que se ha acertado y el número de rondas que se ha necesitado.
  • Si contador = 0, debe salir del bucle e indicar que no se ha acertado el número, debe mostrar cual era el númeroAleatorio y que ya no se disponen de más intentos.

En este caso, como vemos, la condición que debe cumplir el do-while debe ser OR, en caso de que se cumpla al menos una de las dos, debe salir.

Condicionales para el desarrollo.

En el interior del bucle do-while, debemos desarrollar una estructura if que marcará el desarrollo del programa. Debemos realizar tanto la comprobación del intento, como el aumento de la variable contador.

  • Si intento > númeroAleatorio, debe mostrar mensaje indicando que el número que buscamos es inferior a intento y muestra cuantos intentos quedan (contador – 1)
  • Si intento < númeroAleatorio, debe mostrar mensaje indicando que el número que buscamos es mayor a intento y muestra cuantos intentos quedan (contador – 1)
  • Si intento = númeroAleatorio, debe mostrar mensaje indicando que hemos acertado el número aleatorio y el número de intentos que hemos necesitado (10 – (contador + 1))

Independientemente del caso anterior que obtengamos en cada ciclo, la variable contador decrece en 1.

package estructurasRepetitivas;

/**
01 Ejercicios Estructuras Repetitivas en Java

Programa:
Crea una aplicación que permita adivinar un número. La aplicación genera
un número aleatorio del 1 al 100. A continuación va pidiendo números y va
respondiendo si el número a adivinar es mayor o menor que el introducido,
a demás de los intentos que te quedan (tienes 10 intentos para acertarlo). 
El programa termina cuando se acierta el número (además te dice en cuantos 
intentos lo has acertado), si se llega al limite de intentos te muestra el 
número que había generado.

@author: manolohidalgo_
@date: 09-11-19
*/

import java.util.Scanner;
// Inicio del programa y declaración de variables:
public class Ej01AdivinaNumero {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int numeroAleatorio;
    int intento;
    int contador = 10;

    // Obtención de número aleatorio
    numeroAleatorio = (int) (Math.random()*100+1);
    System.out.println("Intenta adivinar un número aleatorio entre el 1 y 100. "
        + "Tienes 10 intentos.");
    System.out.println(numeroAleatorio);
    // Realización del ciclo do-while
    do {
      System.out.println("Número contador: " + contador);
      System.out.print("Introduce el número que creas posible: ");
      intento = scanner.nextInt();
      if (intento > numeroAleatorio) {
        System.out.println("El número que buscas es menor, te quedan "
            + (contador-1) + " intentos: ");
      } else if (intento < numeroAleatorio){
        System.out.println("El número que buscas es mayor, te quedan "
            + (contador-1) + " intentos: ");
      } else {
        System.out.print("¡CORRECTO! "+ numeroAleatorio + " era el número que estabas "
            + "buscando, has necesitado " + (10 - (contador-1)) +" intentos.");
      }
      contador--;
    } while (intento != numeroAleatorio && contador > 0);
    if (contador == 0) {
      System.out.println("Has perdido. El numero aleatorio era " + numeroAleatorio);
    }
  }
}

Puedes acceder a este ejercicio en GitHub en este enlace

Si tienes alguna duda al respecto, alguna sugerencia o algo que no te haya quedado claro, no tienes más que escribirme en los comentarios, estoy aquí para ayudarte y aprender, ¡Nos leemos!