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
[email protected]
Dr. Horst von Brand
[email protected]
José Luis Martı́
[email protected]
Jorge Avarias
[email protected]
Boris Tapia
[email protected]
Jorge Valencia
[email protected]
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 [email protected] (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