/* Juego operaciones aritméticas */
import java.util.Scanner;

public class RetoMatematico2
{
   public static void main(String args[])
   {
      Scanner teclado = new Scanner(System.in);
      System.out.print("Juego: reto matemático. Responda cada operación correctamente:\n\n");
      
      // Indica la cantidad de digitos de los números generados en las operaciones
      // Si el jugador acierta, se incrementa, si falla, se decrementa. Siempre debe
      // estar en el rango 1 a 18 inclusive.
      short nivelDificultad = 1;
      
      // La respuesta del jugador en cada intento
      short continuarJugando = 1;
      
      // Se mantiene en el juego hasta que responda que no
      while ( continuarJugando == 1 )
      {
         // Escoger dos operandos aleatorios de tantos digitos como diga el nivel de dificultad
         long numero1 = (long)(Math.pow(10, nivelDificultad - 1) * (1 + 9 * Math.random()));
         long numero2 = (long)(Math.pow(10, nivelDificultad - 1) * (1 + 9 * Math.random()));
         
         // Escoger una operación aleatoria
         short operacion = (short)(Math.random() * 5);
         switch ( operacion )
         {
            case 0: nivelDificultad += hacerOperacion(numero1 + " + " + numero2, numero1 + numero2) ? 1 : -1; break;
            case 1: nivelDificultad += hacerOperacion(numero1 + " - " + numero2, numero1 - numero2) ? 1 : -1; break;
            case 2: nivelDificultad += hacerOperacion(numero1 + " * " + numero2, numero1 * numero2) ? 1 : -1; break;
            case 3: nivelDificultad += hacerOperacion(numero1 + " / " + numero2, numero1 / numero2) ? 1 : -1; break;
            case 4: nivelDificultad += hacerOperacion(numero1 + " % " + numero2, numero1 % numero2) ? 1 : -1; break;            
         }
         
         // Mantener el nivel de dificultad en sus valores permitidos
         if ( nivelDificultad < 1 ) nivelDificultad = 1;
         if ( nivelDificultad > 18 ) nivelDificultad = 18;
         
         // Preguntar al usuario si quiere seguir jugando
         System.out.print("Continuar jugando [1=Sí, 2=No]: ");
         continuarJugando = teclado.nextShort();
         System.out.println();
      }
   }
   
   public static boolean hacerOperacion(String operacion, long resultado)
   {
      System.out.print(operacion + " = ");
      boolean correcto = getNextLong() == resultado;
      System.out.println(correcto ? "Felicidades, respuesta correcta!" : ("El resultado correcto es " + resultado));
      return correcto;
   }
   
   public static long getNextLong()
   {
      Scanner teclado = new Scanner(System.in);
      long resultado = 0;
      boolean lecturaCorrecta = false;
      while ( lecturaCorrecta == false )
      {
         try
         {
            resultado = teclado.nextLong();
            lecturaCorrecta = true;
         }
         catch(java.util.InputMismatchException e)
         {
            teclado.nextLine();
         }
      }
      return resultado;
   }
}