Universidad de Costa Rica
Escuela de Ciencias de la Computación e Informática
CI-0202 Principios de informática - II-2013
Profesor Jeisson Hidalgo-Céspedes
Fecha: 11-oct-2013. Entrega límite: 25-oct-2013 11:55 p.m.
Tarea 03
El pez grande se come al pez pequeño. Ocurre en la economía y por qué no en el océano. Se nace siendo un vulnerable y diminuto pez, que debe ser astuto para sortear los peces mayores, y saciar su hambre con los menores, con el fin de surgir, de crecer y aspirar a ser el más grande del océano. Existen diversas implementaciones de este juego, como son Fish tales, Franky the fish, Fish For Food, y Hungry Space.
Procedimiento inicial
- Cree un nuevo escenario con Greenfoot (File | New...). Dele el nombre que guste para su videojuego.
- Descargue el archivo de recursos provisto por el profesor. Extraiga su contenido a cualquier carpeta. Mueva los archivos extraídos: las imágenes, los sonidos y la clase
Pez.java
a sus lugares correspondientes en su proyecto de Greenfoot. Pueda que necesite reiniciar Greenfoot para que vea los cambios.
- Cree una clase para manejar el escenario (el océano), la cual debe heredar de
World
. Asóciele la imagen Oceano.jpg
.
- Estudie la clase
Pez
provista por el profesor. Puede estudiarla mirando su documentación en lugar de su código fuente.
Pez del jugador [25%]
- Haga una nueva clase heredar de
Pez
para implementar el pez del jugador.
- El constructor del pez del jugador debe llamar al constructor de la clase
Pez
. Indague qué parámetros necesita. Invoque al constructor de la superclase con super(...)
.
- Ponga un pez de jugador en el escenario. Trate de hacerlo crecer. Observe qué pasa. ¿Se mueve al ejecutar el juego?
- Haga que el pez reaccione a las teclas de flecha. Sugerencia, utilice el método
setLocation()
heredado de Actor
.
- Evite que el pez del jugador suba a la superficie. Note que en la parte superior del escenario hay un celaje de 100 pixeles de alto, seguido por unas olas de 15 pixeles de alto.
- Haga que el pez siempre mire en la dirección del movimiento en caso de ser hacia la izquierda o la derecha. Es decir, si el pez está mirando hacia la izquierda y el jugador presiona la tecla flecha derecha, el pez se orienta hacia la derecha. Si está mirando hacia la derecha y el jugador presiona la tecla flecha izquierda, el pez se orienta hacia la izquierda. Estudie la clase
Pez
en busca de algún método que ayude en esta labor.
- Haga que el movimiento del pez del jugador conserve la cantidad de movimiento conforme su crecimiento. Es decir, un pez pequeño es ágil y puede moverse rápidamente. Pero a medida que crece, su movimiento será cada vez más lento. Estudie si en la clase
Pez
hay algún método que pueda resultarle de ayuda.
- Modifique la clase que representa el escenario, para que cada vez que se crea un escenario, se cree el pez del jugador, el cual deberá estar ubicado en el centro del océano. No tome en cuenta el celaje como tamaño del océano.
Peces enemigos [25%]
- Haga una nueva clase heredar de
Pez
para implementar los peces enemigos que el jugador, debe esquivar si son de mayor tamaño, o devorar si son de menor o igual tamaño (nivel de crecimiento).
- Haga que el constructor de la nueva clase reciba los mismos parámetros de su superclase
Pez
y simplemente los pase al invocar a super()
.
- Modifique el método de actuación
act()
de la clase que representa su escenario, para que periódicamente ponga en el océano algunos peces, creados con imágenes aleatorias, direcciones (orientaciones) aleatorias y tamaños iniciales (niveles de crecimiento) aleatorios. Debe utilizar un temporizador (timer) en la clase que representa el escenario para determinar en qué momento lanzar un nuevo enemigo. ¿Se mueven estos peces?
- Haga a los peces enemigos moverse en cada acto. Un pez enemigo debe moverse horizontalmente. Es decir, si el pez está orientado hacia la derecha, debe aparecer en el extremo izquierdo y moverse hacia la derecha. Puede hacer que el pez enemigo conserve también la cantidad de movimiento, es decir, un pez gordo se moverá más lento que uno pequeño; o si lo prefiere que cada pez tenga su propia velocidad, determinada aleatoriamente o bajo otro criterio.
- Haga que cuando un pez enemigo alcance el otro extremo del océano, sea eliminado del escenario. Sugerencia: deberá utilizar el método
getWorld()
para acceder a los métodos del escenario.
Colisión entre peces [20%]
Haga que cuando el pez del jugador hace contacto con un pez enemigo:
- Si el pez enemigo es de menor o igual tamaño que el pez del jugador, será devorado por éste segundo. Haga desaparecer al pez enemigo del océano.
- Reproduzca un sonido de mordizco cada vez que el pez del jugador devora un pez enemigo. Note que en la carpeta de sonidos hay dos mordiscos posibles. Haga que el programa los escoja aleatoriamente.
- Haga que el pez del jugador requiera comer cinco peces para pasar al siguiente nivel de crecimiento. Cuando lo haya hecho, incremente el tamaño del pez. Busque en la clase
Pez
por algún método que ayude en esta labor.
- Cada vez que el pez del jugador incremente el nivel de crecimiento, reproduzca un sonido adecuado.
- Si en la colisión el pez enemigo es de mayor tamaño, devorará al pez del jugador. Haga que el juego termine. Indague en la clase
Greenfoot
por un método que ayude detener el juego.
- Reproduca un sonido de "juego terminado" (en inglés, game over), cuando el pez del jugador es devorado.
Mejoras al juego 1 [20%]
Escoja dos de las siguientes mejoras e impleméntelas en el juego. Si implementa más, puede optar por puntos adicionales (5% por cada característica extra implementada).
- Haga que el juego se detenga cuando el jugador haya alcanzado el nivel máximo de crecimiento (10). Se le felicita al jugador por su logro. Utilice un nuevo mundo (escenario) para ello.
- Haga que el juego tenga un marcador. Cada vez que el jugador devora un pez, se incremente este marcador en proporción al tamaño o velocidad del pez devorado. Cuando el juego haya terminado, se muestra su marcador final. Ubique este indicador en el celaje.
- Implemente un rótulo que indique el nivel de crecimiento del pez del jugador, y la cantidad de peces que le hace falta devorar para pasar al siguiente nivel de crecimiento. Ubique este indicador en el celaje.
- Haga que el juego incremente la dificultad conforme pasa el tiempo. Al inicio se lanzan pocos peces de pequeño tamaño y baja velocidad. Conforme pasa el tiempo, se lanzan más peces, de tamaños más diversos y a diferentes velocidades.
- Permita que el jugador tenga 3 vidas. Si es devorado, se le brinda un nuevo pez. El juego termina cuando haya perdido sus tres vidas (o cuando haya alcanzado el nivel máximo de crecimiento).
- Haga que cuando el pez del jugador devora un pez enemigo, abra su boca. Para ello debe temporalmente cambiar la imagen del pez por una que tenga la boca abierta. Mantenga el tamaño del pez acorde.
- No parece realista que si el pez del jugador tiene un nivel de crecimiento alto, por ejemplo, nivel 6, con sólo comer cinco peces pequeños (de nivel 0), pase al siguiente nivel de crecimiento. Haga más realista el nivel de transferencia de energía. En la naturaleza ésta no es ciento por ciento eficiente (o más como ocurre en el juego), sino que el pez del jugador sólo aprovecha un porcentaje de la energía del pez devorado. De esta forma, para crecer requerirá unos pocos peces grandes o muchos peces pequeños o una combinación proporcional de ambos.
- Anime burbujas que surgen del fondo del océano y suben lentamente hacia la superficie. Busque en la carpeta de imágenes por burbujas. Escoja aleatoriamente la gráfica de las burbujas y la posición de donde surgen. Reproduzca un sonido de burbujas cada vez que surgen unas nuevas.
Mejora al juego 2 [10%]
Idee una característica distintiva, única para su juego e impleméntela. Documente su característica en el código fuente, en su clase escenario. La característica debe ser sustancial (como las listadas en la sección Mejora al juego 1.
Para presentar su solución, comprima la carpeta que contiene el escenario y súbala a Mediación virtual en la asignación con nombre Tarea03
.