Colision y puntuaje

Agarra una manzana

En la anterior parte aprendimos a mover nuestro personaje, así como ponerle pausa al juego. Para continuar, crearemos la manzana. Para ello, crearemos un nuevo punto para su posición:

	Point manzana = new Point (100, 100);

Después, dibujaremos la manzana en nuestro paint. Pongamosle antes de los demás, así se pondrá por debajo de los otros objetos. Recordemos que el orden con el que decidamos dibujar los objetos es muy importantes, pues esto afectará la forma en que se verán las imágenes al final.

		g.setColor(Color.red);
		g.drawOval(manzana.x, manzana.y, 10, 10);

Probemos de forma rápida con Shift+F6 el programa para asegurarnos que la manzana aparesca.

Ahora comenzaremos con los elementos interactivos de nuestro juego. Para ello, agregaremos una función que compruebe cuando colisiona el personaje con la manzana. Para ello, agregaremos el siguiente código en nuestra función game:

			//	Colisión Personaje-Manzana
			if (personaje.x == manzana.x && personaje.y == manzana.y)
			{
				
			}

De esta forma, creamos una condicional que se activará cuando la posición en X del personaje sea la posición en X de la manzana, y al mismo tiempo, la posición en Y del personaje sea la posición en Y de la manzana. En el interior de las llaves, pondremos lo que queramos que ocurra en ese momento. Para comenzar, haremos que la manzana cambie de lugar a una nueva posición al azar. Esto lo haremos de la forma siguiente:

				manzana.x = (int)(Math.random() * (this.getWidth()/10 - 1)) * 10;
				manzana.y = (int)(Math.random() * (this.getHeight()/10 - 1)) * 10;

Se que se ve un poco complicado, pero dejenme explicarles: Se llama a Math.random(), que devuelve un número decimal al azar entre 0 y 1. Para que nos de un entero que deseamos dentro de nuestra pantalla, lo multiplicamos por nuestro alto o ancho. Como en nuestro juego estamos avanzando de diez en diez, dividimos primero este número entre diez y le restamos uno para que no aparesca en las esquinas lateral derecha o inferior (Fuera de la pantalla). Luego convertimos este decimal a entero, y finalmente lo multiplicamos por diez para que nos quede en un lugar preciso de nuestra pantalla, múltiplo de diez.

Ahora, corramos nuestro código con Shift+F6 y provemosle. Si todo ha salido de forma correcta, al tocar la manzana, aparecerá en otro lado y así de forma continua por toda la eternidad.

Contando la puntuación

Ahora que ya tenemos la manzana en juego, necesitamos crear un contador de nuestro puntuaje. Como nuestro en juego, la puntuación está directamente ligada con la longitud de nuestra serpiente, simplemente crearemos una variable que nos marque nuestra longitud:

	int longitud = 1;

Después, crearemos un método que imprima nuestra longitud en pantalla:

		g.drawString("Longitud: " + longitud, 10, 10);

Como veremos, la cadena literal se escribe entre comillas, y la variable fuera de ellas. Todos los objetos distintos deben ser concatenados con el signo "+" para que se puedan imprimir en una misma línea. Otro punto a resaltar, es que todos los espacios dentro de las comillas son importantes, pues si se imprimen estos en pantalla, por eso dejamos un espacio después del dos puntos.

Por último, haremos que cuando el personaje y la manzana estén colisionando, además de mover la manzana, agreguemos un punto a nuestro contador. Para esto agregaremos este código:

				longitud += 1;

Corramos nuestro proyecto con Shift+F6. De esta forma, podremos ver que nuestro puntuaje va aumentando conforme agarramos las manzanas. ¡Felicidades! ¡Llevamos un buen progreso!

Por cualquier duda, nuestro código deberá lucir así ahora:

import GameLib.Game;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Point;
import java.awt.Event;

public class snake extends Game
{
	// Aquí se declaran nuestras variables
	boolean PAUSE = true;
	Point personaje = new Point(50, 50);
	Point manzana = new Point (100, 100);
	int direccion = 1;
	int longitud = 1;
	
	public void init()
	{
		// Comienza descarga asíncrona de recursos pesados
		setBackground(Color.black);
	}

	public void game()
	{
		// Aquí va el código de nuestro juego
		if (!PAUSE)
		{
			//	Se mueve el personaje
			switch	(direccion)
			{
				case 0:
					personaje.y -= 10;
					break;
				case 1:
					personaje.x += 10;
					break;
				case 2:
					personaje.y += 10;
					break;
				case 3:
					personaje.x -= 10;
					break;
			}
			
			//	Salida del escenario
			if (personaje.x < 0)
			{
				personaje.x = this.getWidth()-10;
			}
			if (personaje.x > this.getWidth()-10)
			{
				personaje.x = 0;
			}
			if (personaje.y < 10)
			{
				personaje.y = this.getHeight()-10;
			}
			if (personaje.y > this.getHeight()-10)
			{
				personaje.y = 10;
			}
			
			//	Colisión Personaje-Manzana
			if (personaje.x == manzana.x && personaje.y == manzana.y)
			{
				longitud += 1;
				manzana.x = (int)(Math.random() * (this.getWidth()/10 - 1)) * 10;
				manzana.y = (int)(Math.random() * (this.getHeight()/10 - 2)) * 10 + 10;
			}
		}
	}
	
	public void paint(Graphics g)
	{
		// Aquí se dibujan todos los objetos
		g.clearRect(0, 0, this.getWidth(), this.getHeight());
		g.setColor(Color.red);
		g.drawOval(manzana.x, manzana.y, 10, 10);
		g.setColor(Color.green);
		g.drawOval(personaje.x, personaje.y, 10, 10);
		g.setColor(Color.white);
		g.drawString("Longitud: " + longitud, 10, 10);
		if (PAUSE)
		{
			g.drawString("PAUSA", this.getWidth()/2-20, this.getHeight()/2);
		}
	}
	
	public boolean keyDown(Event e, int key)
	{
		switch(key)
		{
			//	Cambia el rumbo de la serpiente
			case Event.UP:
				direccion = 0;
				break;
			case Event.RIGHT:
				direccion = 1;
				break;
			case Event.DOWN:
				direccion = 2;
				break;
			case Event.LEFT:
				direccion = 3;
				break;
			case Event.ENTER:
				PAUSE = !PAUSE;
				break;
		}
		return true;
	}
}

Notará que he modificado unas partes que puse en color rojo. Si corren el juego bajo estas modificaciones, podrán notar que en ningún momento la serpiente o la manzana vuelven a aparecer en la primer línea. Esto, con el proposito de dejar esta entera primer línea como una zona reservada para la puntuación y cualquier otro texto que deseemos. Nuestro juego ahora debe verse como a continuación:

[Un proyecto de Ayotli Diseño Web]