5. Repetir: adivinar un número del 1 al 1000

Hemos visto que dar varios intentos al usuario usando "if" va haciendo el programa cada vez menos legible y más complejo.

Hay una alternativa más razonable para estos casos: las estructuras repetitivas, como "while", que repiten un bloque de programa mientras se cumpla una condición. Así podemos dar al usuario 10 intentos sin que eso dispare la dificultad del programa.

Para probarlo, vamos a crear un programa que dé al usuario 10 oportunidades de adivinar un número del 1 al 1000.

Además de la orden "while", apenas hay una novedad: cómo comprobar dos condiciones a la vez, porque la partida podrá terminar cuando el usuario agote sus 10 oportunidades o quizá antes, si encuentra el número en menos de 10 intentos. Podemos enlazar varias condiciones con:


  Operador  Significado
     &&        Y
     ||        O
     !         No

También hay que tener en cuenta que como se repita mientras se den dos condiciones (no haber acertado y no haber agotado intentos), cuando dejemos de repetir habrá que comprobar por cuál de esos dos motivos hemos salido. Es más razonable fijarnos en si ha acertado que en si ha usado los 10 intentos, porque puede ocurrir que el usuario acierte justo en su última oportunidad:

// Adivinar un numero del 1 al 1000 en 10 intentos
 
/* Pseudocodigo:
 * 
- Generar aleatorio
- Pedir número
- restantes = 0
- Mientras no acertado y queden intentos restantes
  - Si número > aleatorio, Escribir "Pasado"
  - Si número < aleatorio, Escribir "Corto"
  - Disminuir restantes
  - Pedir número
- Fin mientras
- Si número = aleatorio, Escribir "Felicidades"
  Si no, Escribir aleatorio
*/  
 
 
using System;
 
public class Juego02
{
    public static void Main()
    {       
        //Declaración de variables        
        int aleatorio, introducido;
        int restantes = 10;
 
        Random generador = new Random();
        aleatorio = generador.Next(1,1001); 
 
        Console.WriteLine("Te quedan {0} intentos", restantes);
        Console.Write("Introduce un número: ");
        introducido = Convert.ToInt32(Console.ReadLine());
 
        //Bucle que se repite hasta que acierte o se quede sin intentos
 
        while (( introducido != aleatorio ) && ( restantes > 1 ))
        {
            restantes = restantes - 1;
 
            if (introducido < aleatorio)
                Console.WriteLine("Te has quedado corto");
 
            if (introducido > aleatorio)
                Console.WriteLine("Te has pasado");
 
            Console.WriteLine("Te quedan {0} intentos", restantes);
            Console.Write("Introduce un número: ");
            introducido = Convert.ToInt32(Console.ReadLine());          
        }
 
        //Comprobar si gana o pierde
 
        if ( introducido == aleatorio )
            Console.WriteLine("Has ganado!");
        else
        {
            Console.WriteLine("Has perdido!");
            Console.WriteLine("Era el {0}",aleatorio);
        }
    }
}
 

Ejercicio propuesto: Modificar el juego para que el número esté entre 1 y 10.000, y el usuario tenga 13 intentos (intenta hacerlo desde cero, y comparar tu solución con la propuesta).