Download Tarea # 2 Lenguajes de Programación Programación Orientada a
Document related concepts
no text concepts found
Transcript
Tarea # 2 Lenguajes de Programación Programación Orientada a Objetos Teddy Alfaro teddy.alfaro@inf.utfsm.cl Dr. Horst von Brand vonbrand@inf.utfsm.cl José Luis Martı́ jmarti@inf.utfsm.cl Jorge Avarias javarias@alumnos.inf.utfsm.cl Boris Tapia btapia@alumnos.inf.utfsm.cl Jorge Valencia jorjazo@labsd.inf.utfsm.cl 4 de abril de 2006 1. Objetivos Poner en práctica los conceptos del paradigma de la Orientación a Objetos. Familiarizarse con el lenguaje de programación Java. 2. 2.1. El Gato con Objetos Introducción El Gato con Objetos es un minino que, como tal, tiene dos grandes adicciones: trepar árboles y, por supuesto, jugar a un antiguo juego de herencia familiar: El Gato. A partir de estas dos adicciones le surge un gran problema: la celulosa necesaria para fabricar los millones de cuadernos que usa todos los años para jugar a su juego favorito hace que empiencen a desaparecer los árboles a los que tanto le gusta trepar. Una de estas tardes se fue a jugar El Gato con sus grandes amigos Don Gato, Felix y Sonic. Mientras jugaban, el Gato con Objetos contó el gran problema que tenı́a a sus amigos, y Sonic, que suele estar al tanto de las nuevas tecnologı́as, le dijo a su amigo que la solución era simple: implementar su juego favorito en versión abstracta para PC. 1 El Gato con Objetos sabe del paradigma OO, por lo que pudo hacer un breve análisis del juego, pero no sabe programar en ningún lenguaje en particular. 2.2. Tarea Se pide a los habilosos estudiantes de “Leguajes de Programación” ayudar al Gato con Objetos a seguir disfrutando su juego, sin destruir su bosque. Para esto se debe implementar en Java el famoso juego de “El Gato”, usando el análisis que pudo hacer el Gato con Objetos. Esto quiere decir que sus programas deben implementar las interfaces que se indicarán más adelante. Al principio, el usuario debe ingresar el nombre de los dos jugadores y sus correspondientes sı́mbolos para el tablero. Luego, por cada partida, se ingresará el tamaño del tablero en una lı́nea, seguida por indefinidas lı́neas con coordenadas del tablero indicado las jugadas de cada jugador alternadamente. Esto quiere decir que primero, en una lı́nea, se ingresan las coordenadas donde marcará el jugador 1; luego, en otra lı́nea se ingresarán las coordenadas del tablero donde marcará el jugador 2; luego lo mismo con el jugador uno y ası́ sucesivamente. Las coordenadas del tablero serán basadas en cero, es decir, irán desde 0 hasta N-1. El tablero tiene dimensión N x N, donde N es un entero positivo ingresado por el usuario (ver sección entrada, más adelante), siempre mayor o igual a 3. De esto surgen 2 tipos de tableros que se diferencian sólo en un punto: la condición de victoria. En un tablero de 3x3 un jugador gana cuando completa una correlación de 3 casilleros verticales, horizontales o diagonales. En un tablero NxN con N ≥ 4 el juego termina cuando uno de los dos jugadores logre posicionar su sı́mbolo en 4 casilleros correlativos (horizontal, vertical o diagonalmente). De esto puede deducirse que el tablero 3x3 es, en realidad, un caso especial del tablero NxN. Cuando algun jugador alcance la victoria o el tablero se llene sin un ganador, entonces el juego mostrará el tablero (en un formato indicado más adelante) y el nombre de los jugadores junto a las partidas ganadas por cada uno; luego el usuario ingresa una nueva dimensión de tablero para una nueva partida y será el turno del jugador que corresponda. El juego se repite hasta encontrar en la entrada el caracter de fin de archivo (EOF). Entrada La entrada comienza con una lı́nea de la siguiente forma: JUGADOR 1;SIMBOLO1;JUGADOR 2;SIMBOLO2 donde: JUGADOR 1 es el nombre del primer jugador. Este nombre puede contener espacios. Ejemplo: Gato con Objetos. JUGADOR 2 es el nombre del segundo jugador. Este nombre puede contener espacios. Ejemplo: Sonic. 2 SIMBOLO1 es el sı́mbolo del primer jugador. Este sı́mbolo consta sólo de un caracter. Ejemplo: X. SIMBOLO2 es el sı́mbolo del segundo jugador. Este sı́mbolo consta sólo de un caracter. Ejemplo: O. Luego, por cada partida se ingresa una lı́nea con un entero, representando la dimensión del tablero y a continuación se ingresarán indefinidas lı́neas con coordenadas hasta terminar la partida (en cuyo caso se comienza con un nuevo tablero) o encontrar el caracter EOF (termina el programa). Estas lı́neas tienen el siguiente formato: X Y donde: X es la componente horizontal de la coordenada. Ejemplo: 0. Y es la componente vertical de la coordenada. Ejemplo: 3. El programa debrá ser capaz de manejar de forma correcta las ocasiones en que se ingresen coordenas que haya sido marcadas con anterioridad, durante la partida, o el ingreso de coordenadas fuera del tablero (i.e. X o Y mayores a N o menores que 0), mostrando un mensaje por el flujo de error estándar. Salida Cada vez que un jugador gane una partida o el tablero se llene, el programa debe mostrar, por salida estándar, el tablero de la siguiente forma: Una lı́nea con N+2 guiones. N lı́neas comenzado con un caracter pipe(|), seguido por un caracter por cada casillero del tablero, indicadan el sı́mbolo del jugador que lo marcó o por un espacio si no fué marcado; esta lı́nea termina con un caracter pipe(|). Una lı́nea con N+2 guiones. Una lı́nea con el nombre del jugador 1, un espacio, y la cantidad de juegos ganados por él. Una lı́nea con el nombre del jugador 2, un espacio, y la cantidad de juegos ganados por él. Además, y como se mencionó con anterioridad, cada vez que se intente jugar en un casillero ya marcado o fuera del rango del tablero, se debe mostrar un mensaje de advertencia por error estándar y el jugador que se equivocó repite su turno. 3 Ejemplo jorjazo@bodoque:~/workspace/lp2006-tarea2v2$ ant run Buildfile: build.xml init: build: run: Gatúbela;G;Leono;L 3 0 0 0 1 1 1 2 2 2 0 1 0 0 2 [java] ----[java] |GLG| [java] |LG | [java] |G L| [java] ----[java] Gatúbela 1 [java] Leono 0 4 0 0 1 0 0 1 1 1 0 2 1 2 0 3 [java] -----[java] |LG | [java] |LG | [java] |LG | [java] |L | [java] -----[java] Gatúbela 1 [java] Leono 1 BUILD SUCCESSFUL Total time: 2 minutes 26 seconds jorjazo@bodoque:~/workspace/lp2006-tarea2v2$ 4 2.3. Detalles La tarea debe ser entregada en un archivo tar 1 compreso con gzip. Este archivo debe contener en un directorio llamado tarea2 el siguiente contenido: src - directorio con el código fuente completo del programa. build.xml - archivo de configuración de ant 2 README - Archivo de texto descrito en las reglas del juego. El archivo ant debe contener, por lo menos, los targets build y run, para compilar y ejecutar el programa, respectivamente. No se pedirá archivo Makefile. Interfaces Se pide implementar las interfaces anexas a este documento en el código del juego e implementar el comportamiento de las dos excepciones mencionadas anteriormente, derivando de la excepción abstracta provista. En particular los tableros a usar deben implementar la interfaz Marcable y los Jugadores deben implementar la interfaz Competible. Todas ellas estarán disponibles, junto a un archivo ant de ejemplo en formato electrónico en la plataforma DotLRN y una copia permanecerá en http://www.bodoque.cl/ayudantias/lp/1-2006/ 3. Sobre la Entrega Se debe trabajar individualmente, es decir en grupos de 1 persona. La tarea se debe entregar hasta el dı́a Viernes 21 de Abril, hasta las 23:59 horas. La entrega debe realizarse por dos medios: se debe entregar mediante la plataforma DotLRN y una copia de esa entrega debe enviarse por correo electrónico a ili253@alumnos.inf.utfsm.cl (con cualquier subject). Por cada dı́a de atraso se descontarán 20 puntos. Para la corrección se utilizará el compilador gcj del LabComp. El archivo a entregar debe llamarse rol-tarea2.tar.gz. Habrá un descuento de 5 puntos por cada entrega replicada de la tarea, se corregirá la última entrega. 1 tar(1) 2 http://ant.apache.org/manual/ 5 4. Referencias útiles http://www.eclipse.org/ Excelente IDE para trabajar en Java. http://java.sun.com/j2se/1.5.0/docs/api/ Especificación de la API Java. http://java.sun.com/j2se/1.5.0/download.jsp http://www.blackdown.org/java-linux/java-linux-d2.html http://gcc.gnu.org/java/index.html Sitios de descarga del JDK3 , en distintas implementaciones. http://java.sun.com/developer/onlineTraining/new2java/index.html Documentación de inicialización a Java. http://ant.apache.org/manual/ Documentación completa para la herramienta ant de la Apache Software Foundation. 3 Java Development Kit 6 5. Anexo: interfaces Archivo 1 Código fuente para Competible.java package cl.utfsm.inf.gato.interfaz; public interface Competible { /* * Función para marcar una partida ganada por * este competidor. */ public void ganó(); /* * Retorna el nombre del competidor. */ public String getNombre(); /* * Retorna el sı́mbolo usado por el * competidor en el tablero. */ public char getSı́mbolo(); /* * Retorna la cantidad de partidas ganadas * por el competidor. */ public int getGanados(); } LATEX 7 Archivo 2 Código fuente para Marcable.java package cl.utfsm.inf.gato.interfaz; import cl.utfsm.inf.gato.error.CasilleroException; public interface Marcable { /* * Esta función establece una marca del jugador * en un casillero determinado. * * Retorna true si el jugador gana con esa marca; * false en otro caso. */ public boolean marcar(Competible j, int x, int y) throws CasilleroException; /* * Muestra el marcador por salida estándar. */ public void show(); /* * Retorna el tama~ no del tablero. */ public int getTama~ no(); /* * Retorna true si el tablero tiene todos sus * casilleros marcado; false en otro caso. */ public boolean lleno(); } 8 Archivo 3 Código fuente para CasilleroException.java package cl.utfsm.inf.gato.error; public abstract class CasilleroException extends Exception { protected int x,y; public CasilleroException(int x, int y) { this.x=x; this.y=y; } public abstract String toString(); } 9