|
|||||||
|
|
|
|||||
|
|
|||||||
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
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
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.