Handy-Programmierung mit JavaME


PHBern Institut Sekundarstufe I
HomeTurtle GidletsBerechnungenKoordinatengrafikDruckenJava-Online
Online-Editor starten

Snake-Spiel


Die Turtle kann mit den Cursortasten gesteuert werden. Das Ziel ist es, die Turtle möglichst lange so zu steuern, dass sie ihre eigene Spur nicht kreuzt. Das Spiel wird immer schwieriger, da sich die Turtle immer schneller bewegt.

 

 

Beispiel zeigen

Beispiel im Online-Editor bearbeiten

// Snake.java

import ch.aplu.gidlet.*;
import javax.microedition.lcdui.*;
import java.util.Vector;


public class Snake extends Gidlet
{
  Turtle joe;
  boolean stop;
  Vector posX = new Vector();
  Vector posY = new Vector();

  public void main()
  {
    showMessage("Spielregeln:\n" +
                "Versuch mit dem Cursor die Turtle so zu \n" +
                "steuern, dass sie ihre eigene Spur nicht \n" +
                "berührt. Vorsicht, sie wird immer schneller.\n" +
                "Starte mit OK!");
    joe = new Turtle();
    joe.addKeyListener(this);
    joe.wrap();

    while (!isExiting())
    {
      playGame();
    }
  }

  void playGame()
  {
    int x = 0;
    int y = 0;
    int counter = 0;
    int delay = 30;
    double timer = 0;
    stop = false;
    posX.removeAllElements();
    posY.removeAllElements();
    joe.clear();

    while (!stop && !isExiting())
    {
      joe.forward(1)// Nur ganzzahlige Positionen

      // Geschwindigkeit erhoehen
      if (counter == 250 && delay != 0)
      {
        delay -= 5;
        counter = 0;
      }
      joe.setDelay(delay);

      // Ueberpruefung, ob Gitterpunkt vorhanden
      x = (int)joe.getX();
      y = (int)joe.getY();
      for (int p = 0; p < posX.size(); p++)
      {
        Integer xGrid = (Integer)(posX.elementAt(p));
        Integer yGrid = (Integer)(posY.elementAt(p));
        if (xGrid.intValue() == x && yGrid.intValue() == y)
          stop = true;
      }
      // Speichere neue Position
      
      
      posX.addElement(new Integer(x));
      posY.addElement(new Integer(y));

      counter++;
      timer += delay;
    }
    if (!isExiting())
      showMessage("Game Over\nZeit: "+ timer/1000 +" Sekunden\n" + "neues Spiel mit OK");
  }

  public void keyPressed(int keyCode)
  {
    switch (joe.getPlayground().getGameAction(keyCode))
    {
      case Canvas.UP:
        joe.setHeading(0);
        break;

      case Canvas.DOWN:
        joe.setHeading(180);
        break;

      case Canvas.LEFT:
        joe.setHeading(270);
        break;

      case Canvas.RIGHT:
        joe.setHeading(90);
        break;
    }
  }
}
   

Grundsätzliche Idee:
Damit keine Schnittpunkte berechnet werden müssen, wird die Bewegung auf ein Gitter mit ganzzahligen Koordinaten eingeschränkt. Die "besuchten" Gitterpunkte werden in zwei Vektoren abgespeichert. Falls einer der Gitterpunkte wieder "getroffen" wird, ist das Spiel zu Ende.

Erklärungen zum Programmcode:
joe.forward(1) Schränkt die Bewegung auf das ganzzahlige Gitter ein
posX.addElement(new Integer(x)) In einem Vektor können nur Referenzen abgespeichert werden. Der int muss daher in einen Integertyp verwandelt und mit addElement als neues Element am Ende des Vektors gespeicher werden
Integer xGrid = (Integer)(posX.elementAt(p)) Holt das gespeicherte Element als Object zurück und verwandelt es in einen Integer
xGrid.intValue() == x Verwandelt den Integer in einen int und vergleicht ihn mit der aktuellen Position