Free Web Site - Free Web Space and Site Hosting - Web Hosting - Internet Store and Ecommerce Solution Provider - High Speed Internet
Search the Web

Problema de la moneda moviendose en un tablero unidimensional de 5 casilleros



Definicion del problema

Se tiene una moneda representada por una 'o' en un tablero unidimensional de tamaño 5 representado por caracteres 'x' ,la cual el usuario debera mover hacia la izquierda o derecha, a partir de una posicion inicial correspondiente al centro del tablero.

En el caso, de que el usuario indicara un movimiento hacia la izquierda o derecha encontrandose actualmente en uno de los bordes del tablero, se debera lanzar una excepcion indicando la imposibilidad de moverse en aquella dirección.

Para ello, se recomienda crear una nueva clase de tipo Excepcion, que herede de la clase Exception, toda su funcionalidad.

Adicional : debe existir la opcion de volver a poner la moneda en el centro y además se requiere el uso de teclado numérico para mayor claridad de direccion (4 : Izquierda , 5 : Centro, 6 : Derecha)

Solucion

import java.io.*;

class ExcepcionMoneda extends Exception
{
  public ExcepcionMoneda(String s)
  {
    super(s);  /* llama al constructor de la clase padre Exception */
  }
}


class Moneda
{
  /* atributos de clase, visibles en todos los métodos */
  /* se declaran estaticos, ya que son accesados por métodos estáticos */

  static char tablero[ ];    /*declaracion de arreglo vacio */
  static int PM = 2;         /* posicion de la moneda PM */


  public static void inicializarTablero()
  {
    tablero = new char[5];    /* asigna dimension al tablero */

    /*inicializa el tablero con 'x' y luego posiciona la moneda 'o' en
     su posición inicial almacenada en el atributo PM */

    for(int i = 0; i < tablero.length; i++)
      tablero[i] = 'x';

    tablero[PM] = 'o';
  }

  /* imprime en pantalla el estado del tablero */

  public static void mostrarTablero()
  {
    System.out.println("\n\tTablero");
    System.out.println("\t-------\n");

    for(int i = 0; i < tablero.length; i++)
      System.out.print("\t" + tablero[i]);

    System.out.println();

  }

  /* imprime en pantalla las opciones de movimiento */

  public static void mostrarOpciones()
  {
    String s = "\n\tIndique a donde mover la moneda\n\n";
    s += "\t4) IZQUIERDA\t5) CENTRO\t6) DERECHA";
    s += "\n\t1) SALIR.\n";
    System.out.println(s);
  }

  /* imprime en pantalla una introduccion o explicacion del programa */

  public static void introduccion()
  {
    String s = "\n\n\tPROGRAMA DE LA MONEDA Y EL TABLERO\n";
    s += "\t----------------------------------\n";
    s += "\n\tEl programa consiste en mover la moneda 'o' del tablero ";
    s += "\n\ta la izquierda o a la derecha ";

    s += "\n\n\tSi intentas mover la moneda fuera del tablero ";
    s += "\n\tel programa lanzara un excepcion...";

    s += "\n\n\tPara mayor comodidad puedes usar el teclado numerico (asegurate) ";
    s += "\n\tde activar este teclado con la tecla Bloq Num";

    System.out.println(s);
  }


  /* El constructor de la clase ExcepcionMoneda, requiere que se le pase
  como parametro un String s que refleje en palabras la excepcion que se
  produjo. Como en este caso, la excepcion se produce o se lanza debido a un
  intento de acceso a una posicion invalida del tablero, en el siguiente metodo
  vamos a generar un String de mensaje en funcion de la posicion.

  Ahora bien, para poder acceder a este mensaje, en el bloque catch
  correspondiente a la excepcion ExcepcionMoneda, se debe imprimir en
  pantalla el retorno del método getMessage().
  */

  public static String generarMensajeExcepcion(int posicion)
  {
    String s = "\tLa moneda no puede moverse hacia la ";

    if (posicion < 0)
    {
      s += "izquierda...";
    }
    else
    {
      if (posicion > 4)
      {
        s += "derecha...";
      }
    }

    s += "\n\tDecide si la moneda retorna al centro o se mueve de aqui!";
    return s;
  }



  /* El metodo posicionar, determina una posicion auxiliar en
  funcion de la opcion de movimiento, que es accesada a riesgo de
  producir una excepcion de tipo ArrayIndexOutOfBoundsException */

  public static void posicionar(int opcion) throws ExcepcionMoneda
   {
     int pos = PM;

     /* OPCIONES de movimiento (teclado numerico):
      5.- Ir al centro
      4.- Izquierda
      6.- Derecha
      */

     switch(opcion)
     {
       case 4  : pos = PM - 1;    break;
       case 5  : pos = 2;         break;
       case 6  : pos = PM + 1;    break;
     }

     try
     {
       tablero[pos] = 'o';

       /* Si pos es invalida entonces el flujo salta
        hacia el bloque catch, lanzando la excepcion ExcepcionMoneda, con el
        String generado en el método generarMensajeExcepcion.
        Por ende, no se ejecutarian las dos instrucciones
        siguientes, manteniendo intacta la posicion de la moneda y el estado del
        tablero.

        En cambio, si pos es valida, se ejecutan las dos instrucciones siguientes
        sin problema */

       if (PM != pos)
       {
         tablero[PM] = 'x';   /* asigna una x a la posicion actual */
         PM = pos;            /* se asigna nueva posicion a la moneda */
       }

     }
     catch(ArrayIndexOutOfBoundsException e)
     {
       throw new ExcepcionMoneda(generarMensajeExcepcion(pos));
     }

   }


   /* El metodo principal main(), consiste basicamente en un ciclo iterativo
    que realiza los siguientes pasos :

    1) Inicializa el tablero
    2) Muestra una explicacion o introduccion al programa

    3) Muestra el estado del tablero
    4) Muestra las opciones de movimiento
    5) Lee la opcion por teclado
    6) Llama al metodo posicionar, que tiene la particularidad de poder generar
    una excepcion
    7) Volver al paso 3) mientras la opcion no sea salir

    */


   public static void main(String[ ] args)
   {
     int opcion = 0;

     BufferedReader in = new BufferedReader(new
         InputStreamReader(System.in));

    inicializarTablero();
    introduccion();

    try
    {
      System.out.print("\n\n\tPresiona tecla para continuar...");
      in.readLine();
    } catch(IOException e){ }

    do
    {
      try
      {
        mostrarTablero();
        mostrarOpciones();

        System.out.print("\n\tIngresa la opcion : ");
        opcion = Integer.parseInt(in.readLine());

        if (opcion != 1) posicionar(opcion);
      }
      catch (ExcepcionMoneda e)
      {
        System.out.println("\n" + e.getMessage());
      }
      catch(IOException ioe) { }

    } while(opcion != 1);

    System.out.println("\n\n\tFIN DEL PROGRAMA.\n");
  }
}
Bajar archivo



Salida a pantalla






Problema de la moneda moviendose en un tablero bidimensional de 3x3 casilleros



El problema consiste fundamentalmente en lo mismo del problema anterior, pero ahora aplicado al movimiento sobre una matriz de tamaño 3x3.

Se debe lanzar una excepcion en caso de intento inválido de movimiento.
Además las opciones de movimiento deben ser : izquierda, derecha, arriba, abajo, centro y diagonales, siendo capturadas a través del teclado numérico.

Solución

import java.io.*;

class ExcepcionMoneda extends Exception
{
    public ExcepcionMoneda(String s)
    {
        super(s);  
    }
}

class MonedaTablero {

    static char tablero[ ][ ];  
    static int FM = 1, CM = 1;           /* posicion de la moneda FM: fila, CM : columna */

    public static void inicializarTablero()
    {
        tablero = new char[3][3];

        for(int i = 0; i < tablero.length; i++)
            for(int j = 0; j < tablero[i].length; j++)
                tablero[i][j] = 'x';

        tablero[FM][CM] = 'o';
    }

    public static void mostrarTablero()
    {
        System.out.println("\n\tTABLERO");
        System.out.println("\n\t-------\n");

        for(int i = 0; i < tablero.length; i++)
        {
            System.out.print("\t");
            for(int j = 0; j < tablero[i].length; j++)
                System.out.print(tablero[i][j] + "\t");

            System.out.println();
        }
    }


    public static void mostrarOpciones()
    {
        String s = "\n\tOpciones\n\n";
        s += "\t5) CENTRO     4) IZQ      6) DER     8) UP    2) DOWN";
        s += "\n\tDIAGONALES --> 7,9,1,3";
        s += "\n\t-1) SALIR.\n";
        System.out.println(s);
    }

    public static void introduccion()
    {
        String s = "\n\n\tPROGRAMA DE LA MONEDA Y EL TABLERO BIDIMENSIONAL\n";
        s += "\t------------------------------------------------\n";
        s += "\n\tEl programa consiste en mover la moneda 'o' del tablero ";
        s += "\n\ta la izquierda, derecha, arriba, abajo o diagonal. ";

        s += "\n\n\tSi intentas mover la moneda fuera del tablero ";
        s += "\n\tel programa lanzara un excepcion.";

        s += "\n\n\tPara mayor comodidad puedes usar el teclado numerico (asegurate ";
        s += "\n\tde activar este teclado con la tecla Bloq Num).";

        System.out.println(s);
    }

    public static String generarMensajeExcepcion(int f, int c)
    {
        String s = "\tLa moneda no puede salir ";
       
        if (c < 0 || c > 2 ) 
           {
            if (f >= 0 && f < 3) 
            {
                if(c < 0) s += "a la izquierda...";
                else s+= "a la derecha...";    
            }    
            else s += "en direccion de la cruz\n\tdiagonal del tablero...";
        }
        else 
        {
            if (f < 0) s+= "hacia arriba...";
            else s += "hacia abajo...";    
        }
        
        s += "\n\tEspecifica a continuacion el movimiento de la moneda ";

        return s;
    }


    public static void posicionar(int opcion) throws ExcepcionMoneda
    {
        int f = FM, c = CM;

                /* OPCIONES de movimiento:
                 
                   5.- CENTRO
                   6.- Derecha
                   4.- Izquierda
                   8.- Arriba
                   2.- Abajo
                   9.- Diagonal Derecha y Arriba
                   7.- Diagonal Izquierda y Arriba
                   3.- Diagonal Derecha y Abajo
                   1.- Diagonal Izquierda y Abajo
                
                */

        switch(opcion)
        {
            case 5  : c = 1;    f = 1; break;

            case 6  : c++;         break;
            case 4  : c--;         break;
            case 8  : f--;         break;
            case 2  : f++;         break;


            case 9 : c++;    f--;    break;
            case 7 : c--;    f--;    break;
            case 3 : c++;    f++;    break;
            case 1 : c--;    f++;    break;
        }

        try
        {
            tablero[f][c] = 'o';    
            
            if (FM != f || CM != c)
            {
                tablero[FM][CM] = 'x';   
                FM = f;            
                CM = c;
            }
            
        }
        catch(ArrayIndexOutOfBoundsException e)
        {
            throw new ExcepcionMoneda(generarMensajeExcepcion(f,c));
        }       
    }

   public static void main(String[ ] args)
   {
        int opcion = 0;

        BufferedReader in = new BufferedReader(new
            InputStreamReader(System.in));

        inicializarTablero();
        introduccion();

        try
        {
            System.out.print("\n\n\tPresiona tecla para continuar...");
            in.readLine();
        } catch(IOException e){ }

        do
        {
            try
            {
                mostrarTablero();
                mostrarOpciones();

                System.out.print("\n\tIngresa la opcion : ");
                opcion = Integer.parseInt(in.readLine());

                if (opcion != -1) posicionar(opcion);
            }
            catch (ExcepcionMoneda e)
            {
                System.out.println("\n" + e.getMessage());
            }
            catch(IOException ioe) { }

        } while(opcion != -1);

        System.out.println("\n\n\tFIN DEL PROGRAMA.\n");
    }
}

Bajar archivo



Salida a pantalla






Ayuda para la tarea del mounstruito



Pasos recomendados para realizar la tarea :

1) Averiguar en Internet el tema de las Excepciones en Java

2) Entender la diferencia entre una excepcion en tiempo de ejecución como lo es ArrayIndexOutOfBoundsException, y una excepcion en tiempo de programacion que es lanzada desde el mismo programa,a través de un método.

3) Revisar el programa de la moneda y el tablero unidimensional y analizar el movimiento y el lanzamiento de la excepcion con los métodos : generarMensajeExcepcion(int posicion) y posicionar.

4) Analizar la lógica de la llamada al método posicionar(opcion) dentro del bloque try{}catch(ExcepcionMoneda e){}

5) Revisar la solución al problema del tablero biidimensional y pensar que la moneda representa al mounstruito y el tablero representa al terreno.

6) Revisar la declaración de los atributos de la clase e interpretarlos.

7) Ir método por método revisando la lógica, ajustando el código al problema del mounstruito si es que es necesario.