Aprender Java creando un juego (Parte 6) - Final


Hola y buen día a todos mis lectores, les tengo la parte final de este gran proyecto de la tortuga en el entorno Greenfoot, si se han perdido de todas las demás partes ya publicadas aquí ¡qué esperan!, visítenlas y entérense de qué se trata este proyecto:


El juego que continuamos creando en previas entradas se acerca más y más a estar completo, pero algunas partes siguen perdidas. Hoy, te mostraré como terminar el juego y—lo más importante—como compartirlo con tus amigos. Si no nos has acompañado en este proyecto, revisa cada una de sus partes en este blog (links arriba), descarga Greenfoot y únete a la diversión.

Finalizando el juego
Actualmente, no hay forma de ganar este juego. Comes todas las rebanadas de pizza, y nada pasa. No hay trompeteo, ni un gran anuncio de “¡GANASTE!”. Igualmente, cuando las serpientes te atrapan, el juego solamente sigue corriendo en silencio. Queremos arreglar ambas situaciones. Vamos a decir que cuando logres comer 12 rebanadas de pizza, ganas. El juego se detiene, y oímos un victorioso trompeteo. De todas formas, cuando las serpientes te atrapan, pierdes. Obtenemos de igual forma un sonido, y el juego se detiene. El segundo escenario (perder) es fácil de hacer—tenemos casi todo para eso ya. Así que haremos eso primero, y entonces mirar a la funcionalidad necesaria para ganar.

Perder (Ser comido por las serpientes)
Tenemos ya un efecto de sonido para cuando la serpiente se come a la tortuga (en el método eat de la serpiente), el cual usa el método Greenfoot playSound. La primera cosa que haremos es solo cambiar el sonido a un nuevo archivo de sonido (el cual puedes descargar aquí) nombrado trombone.wav.

Entonces añade una nueva línea: una llamada al método Greenfoot stop para detener el juego en este punto. Juntos, el código se ve así:
Nota que ambos métodos son métodos estáticos de la clase Greenfoot, así que tenemos que escribir el nombre de la clase Greenfoot y un punto antes del nombre del método en la llamada al método.


Para descubrir que otros métodos ofrece la clase Greenfoot, elige Greenfoot Class Documentation del menú Help.

Otra alternativa es, usar code completion. Por ejemplo, después de escribir Greenfoot. (eso es, después del punto), presiona Ctr-Space en tu teclado, y verás una lista de todos los métodos que puedas llamar hasta ese punto, como se muestra a continuación:



Al empezar a escribir un nombre de un método va a reducir las opciones. Entonces elige cualquiera de los métodos de la lista. Implementar este fin del juego fue bastante fácil. Hacer una cosa similar para ganar es un poco más de trabajo.

Ganando (Terminando tu pizza)
Queremos que nuestra funcionalidad de ganar (trompeteo y detener el juego) ocurra cuando hayamos comido toda nuestra pizza (12 rebanadas). Escogiendo este criterio, tenemos dos problemas. Primero, actualmente tenemos solo 7 rebanadas de pizza en nuestro juego. Podemos, por supuesto, simplemente poner 12 rebanadas desde el inicio, pero eso haría el juego demasiado fácil. En su lugar, quiero hacer que aparezca una nueva rebanada cada vez que una es comida.
Y segundo, ahora necesitamos contar cuando hemos comido, de manera que sepamos cuando parar. Nosotros no sabemos aún como hacer eso.
Haremos estas dos cosas.

La pizza que aparece mágicamente
Las rebanadas de pizza que se comen en la clase Turtle—para ser específico, en el método eat de la tortuga. Así que ahí es donde comenzamos a trabajar. Para mantener el código limpio, ponemos las instrucciones para crear una nueva rebanada de pizza en un método separado y llamar a ese método desde aquí. Así que ponemos una llamada a placeNewPizza() en nuestro método eat, justo debajo de la reproducción del sonido:
El método placeNewPizza() va a poner una nueva rebanada en el mundo cada vez que otra rebanada es comida. Este método no existe—vamos a tener que escribirlo ahora.
El código completo para este método se muestra a continuación:
Veremos que el método eat() llama al método placeNewPizza() y la definición para este nuevo método. Vamos a analizar esto línea por línea.
Para poner una nueva rebanada de pizza al azar en el mundo, tenemos que lograr tres cosas:
  • Crear un nuevo objeto pizza.
  • Generar coordenadas al azar.
  • Poner la pizza en esas coordenadas en el mundo.
La primera línea en nuestro nuevo método pone:
Hemos visto antes que la llamada a getWorld() nos da una referencia a nuestro objeto mundo actual. Esta vez, vamos a declarar una variable local llamada myWorld (es de tipo World) y almacena el objeto mundo en sí. Esto, por su cuenta, no logra mucho todavía, a parte del hecho de que ahora podemos usar la variable myWorld para “hablar” con nuestro mundo.
En las siguientes dos líneas, vamos a generar las coordenadas al azar y almacenarlas en dos variables locales de tipo enteras (int):
Hemos visto ya antes llamadas a los métodos getRandomNumber, getWidth, y getHeightAquí, vamos a generar un número aleatorio entre 0 y el ancho del mundo y almacenarlo en la variable x. Entonces haremos lo mismo para y usando el alto del mundo como límite. Esto nos da coordenadas x y y al azar que concuerdan con el tamaño exacto del mundo.
La última línea hace la magia:
Aquí, ponemos el nuevo objeto pizza en el mundo. Para hacer esto, estamos usando el método del mundo addObject. Este método espera tres parámetros: el objeto a ser ubicado, la coordenada x, y la coordenada y.

Podemos  escribir new Pizza() para crear un nuevo objeto de tipo Pizza, y podemos usar éste en el lugar del objeto para ser ubicado en el mundo. Entonces podemos usar nuestras variables x y y (las cuales acabamos de llenar con nuestros valores aleatorios) en el lugar de las coordenadas.

Lee el código de arriba completo (el que incluye el método eat y placeNewPizza) nuevamente y asegúrate de entenderlo. Entones inténtalo por ti mismo.

Contando la pizza
La funcionalidad hasta ahora nos da un suministro sin fin de rebanadas de pizza. La siguiente tarea que se debe hacer es contar cuando hemos comido. Hacemos esto creando un campo (también conocido como una variable instancia) nombrada slices (rebanadas) que se usarán para contar. (Aún estamos trabajando en la clase Turtle.)
Así es como se ve:
La declaración de campo consiste de la palabra clave private, seguida por el tipo y el nombre para nuestra variable, y un valor opcional de inicialización. El tipo y nombre (int slices) es el mismo que hemos visto para una variable local. La inicialización (= 0) asigna cero a la variable para empezar. Poner esta línea es importante. Las declaraciones de campo deben hacerse fuera de las definiciones de métodos, así que escribimos esta línea inmediatamente después de la cabecera de clase (antes de nuestro método act).

El campo slices puede almacenar enteros (eso es, números enteros). Actualmente almacena cero. Podemos ahora usar este campo para contar nuestras rebanadas de pizza. Cada vez que comemos algo de pizza, incrementamos este campo en 1. Cuando hayamos llegado a 12, reproducimos el trompeteo (el archivo de sonido fanfare.wav, el cual puedes descargar aquí) y detenemos el juego.
A continuación se muestra la implementación completa:
Vamos brevemente a examinar los aspectos interesantes.
Tenemos adjunta la siguiente línea: El operador ++, escrito después de una variable int, incrementa (eso es, contar hacia arriba) esta variable en 1. Así que podemos ver que estamos contando hacia arriba cada vez después de eliminar una rebanada de pizza del mundo.

A continuación, tenemos las siguientes líneas (con algunas instrucciones en el lugar de los tres puntos): Este código revisa si la variable slices es ahora igual a 12 y, si lo es, ejecuta las instrucciones entre el primer par de llaves. De otra forma (si la variable no es igual a 12), las instrucciones después de la palabra clave else son ejecutadas. Nota que necesitamos usar un símbolo de igual doble (==) para revisar si hay igualdad.

Lee el código completo de arriba con cuidado (donde está el método eat completo). Verás que este código es usado para reproducir nuestro sonido de sorber y pone una nueva rebanada de pizza mientras no se hayan comido 12 rebanadas aún. Entonces reproduce el sonido de las trompetas y termina el juego cuando hayamos comido 12 rebanadas. Intenta el código en tu propia versión del juego.

Compartiendo tu juego
Ahora que nuestro juego está “completo” en algún sentido—por su puesto, ningún juego está realmente terminado nunca—sería grandioso si pudiéramos hacer que todos nuestros amigos lo probaran. Afortunadamente, podemos.

Greenfoot tiene una función llamada “share” (compartir) que nos permite subir nuestro programa al sitio web de Greenfoot, donde otros usuarios pueden jugarlo y darte algo de retroalimentación.
Tú puedes ver todos los scenarios que otros usuarios Greenfoot han creado dirigiéndote al sitio Greenfoot y mirando alrededor.

Para subir tu propio juego, da click en el botón Share en la parte superior derecha de la ventana principal de Greenfoot. Al dar click aparece una caja de dialogo que nos permite especificar algunos detalles para subirlo como se muestra en la siguiente imagen:


Para poder subir tu juego, debes tener una cuenta en el sitio Greenfoot. (Si no la tienes, da click en el link Create account.) Puedes explorar y jugar juegos de otras personas sin registrarte, pero para subir tu propio juego, necesitas una cuenta.

Una vez que tengas una cuenta, esta caja de dialogo te deja añadir un título, una descripción, un ícono, y algunas etiquetas, y entonces puedes subir tu juego. Cuando subes un juego, puedes elegir si quieres subir el código fuente también. Si lo haces, otros pueden mirar el código fuente y posiblemente aprender de él o modificarlo por ellos mismos.

Tu proyecto tendrá una URL única en el sitio web Greenfoot. ¡Envía ésta a tus amigos para mostrarles las cosas ‘chidas’ (cool) que has hecho!

Pues bien, se terminaron las entradas sobre el proyecto de la tortuga en Greenfoot, pero quizá vengan algunos otros diferentes, espero que hayan disfrutado de estas entradas tanto como yo disfrute subiéndolas, ya saben, pueden suscribirse en la parte superior derecha con solo poner su email y les llegarán las noticias de mi blog a su bandeja de entrada, los comentarios, peticiones, dudas o criticas van abajo, saludos :D.

Traducción: El Blog De Baro.
Escrito por: Michael Kölling.

Comentarios