Simple ejemplo del juego de la serpiente con Java – Parte 2

En el articulo anterior llegamos al punto donde poder mover la cabeza de la víbora y «comer» los huevos que iban apareciendo aleatoriamente en la pantalla; quedo pendiente que crezca con cada huevo que comía y que al colisionar contra si misma el juego termine.

Usaremos el siguiente razonamiento: cada vez que la vibora coma un huevo se debe agregar un nuevo punto que representa su crecimiento; en algún momento sera una lista de puntos. Es por ello que utilizaremos el objeto ArrayList que agrupara los puntos de la vibora, comenzaremos solo con uno, agregaremos de manera global una variable llamada listaPosiciones:


1
ArrayList<Point> listaPosiciones = new ArrayList<Point>();

En el metodo startGame() agregaremos las siguientes lineas:


1
2
listaPosiciones = new ArrayList<Point>();
listaPosiciones.add(snake);

Será necesario modificar el metodo paintComponent(Graphics g) para que dibuje la vibora acorde a la lista; de paso aprovechamos para incorporar algunas lineas relacionadas a cuando se termina el juego, el metodo queda de la siguiente manera:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public void paintComponent(Graphics g) {
    super.paintComponent(g);

    if(gameOver) {
        g.setColor(new Color(0,0,0));
    } else {
        g.setColor(new Color(255,255,255));
    }
    g.fillRect(0,0, width, height);
    g.setColor(new Color(0,0,255));

    if(listaPosiciones.size() > 0) {
        for(int i=0;i<listaPosiciones.size();i++) {
            Point p = (Point)listaPosiciones.get(i);
            g.fillRect(p.x,p.y,widthPoint,heightPoint);
        }
    }

    g.setColor(new Color(255,0,0));
    g.fillRect(comida.x,comida.y,widthPoint,heightPoint);    
   
    if(gameOver) {
        g.setFont(new Font("TimesRoman", Font.BOLD, 40));
        g.drawString("GAME OVER", 300, 200);
        g.drawString("SCORE "+(listaPosiciones.size()-1), 300, 240);

        g.setFont(new Font("TimesRoman", Font.BOLD, 20));
        g.drawString("N to Start New Game", 100, 320);
        g.drawString("ESC to Exit", 100, 340);
    }

}

Son dos los cambios realizados:
1. El primer consiste en recorrer la lista e ir dibujando los puntos
2. El segundo muestra la leyenda cuando se termina el juego junto con el puntaje y las posibles opciones para continuar.

Ahora solo nos queda modificar el método actualizar() para que cambie las posiciones de los elementos de la lista de manera que se genere cierta continuidad con los puntos; y tambien detecte si existe colision, el metodo queda de la siguiente manera:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void actualizar() {

    listaPosiciones.add(0,new Point(snake.x,snake.y));
    listaPosiciones.remove(listaPosiciones.size()-1);

    for (int i=1;i<listaPosiciones.size();i++) {
        Point point = listaPosiciones.get(i);
        if(snake.x == point.x && snake.y  == point.y) {
            gameOver = true;
        }
    }

    if((snake.x > (comida.x-10) && snake.x < (comida.x+10)) && (snake.y > (comida.y-10) && snake.y < (comida.y+10))) {
        listaPosiciones.add(0,new Point(snake.x,snake.y));
        System.out.println(listaPosiciones.size());
        generarComida();
    }
    imagenSnake.repaint();

}

Con este ultimo cambio el juego esta completo. Es muy sencillo, es una forma ideal de aprender a utilizar listas en Java.

El link al repositorio en github lo pueden encontrar aqui.

Una respuesta a «Simple ejemplo del juego de la serpiente con Java – Parte 2»

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *