3.5 ZZZZZnake
Ein Klassiker aus dem Genre der Computerspiele ist Snake. Auf dem Bildschirm gibt es den Spieler, eine Schlange, Gold und eine Tür. Die Tür und das Gold sind fest, den Spieler können wir bewegen, und die Schlange bewegt sich selbstständig auf den Spieler zu. Wir müssen versuchen, die Spielfigur zum Gold zu bewegen und dann zur Tür. Wenn die Schlange uns vorher erwischt, haben wir Pech gehabt und das Spiel ist verloren.
Vielleicht hört sich das auf den ersten Blick komplex an, aber wir haben alle Bausteine zusammen, um dieses Spiel zu programmieren.
- Spieler, Schlange, Gold und Tür sind Point-Objekte, die mit Koordinaten vorkonfiguriert sind.
- Eine Schleife läuft alle Koordinaten ab. Ist ein Spieler, die Tür, die Schlange oder Gold »getroffen«, gibt es eine symbolische Darstellung der Figuren.
- Wie testen drei Bedingungen für den Spielstatus:
- Mit dem Scanner können wir auf Tastendrücke reagieren und den Spieler auf dem Spielbrett bewegen.
- Die Schlange muss sich in Richtung des Spielers bewegen. Während der Spieler sich nur entweder horizontal oder vertikal bewegen kann, erlauben wir der Schlange, sich diagonal zu bewegen.
a) Hat der Spieler das Gold eingesammelt und steht auf der Tür? (Das Spiel ist zu Ende.)
b) Beißt die Schlange den Spieler? (Das Spiel ist verloren.)
c) Sammelt der Spieler Gold ein?
In Quellcode sieh das so aus:
Listing 3.5: ZZZZZnake.java
import java.awt.Point;
public class ZZZZZnake
{
public static void main( String[] args )
{
java.awt.Point playerPosition = new java.awt.Point( 10, 9 );
java.awt.Point snakePosition = new java.awt.Point( 30, 2 );
java.awt.Point goldPosition = new java.awt.Point( 6, 6 );
java.awt.Point doorPosition = new java.awt.Point( 0, 5 );
boolean rich = false;
while ( true )
{
// Raster mit Figuren zeichnen
for ( int y = 0; y < 10; y++ )
{
for ( int x = 0; x < 40; x++ )
{
Point p = new Point( x, y );
if ( playerPosition.equals( p ) )
System.out.print( '&' );
else if ( snakePosition.equals( p ) )
System.out.print( 'S' );
else if ( goldPosition.equals( p ) )
System.out.print( '$' );
else if ( doorPosition.equals( p ) )
System.out.print( '#' );
else System.out.print( '.' );
}
System.out.println();
}
// Status feststellen
if ( rich && playerPosition.equals( doorPosition ) )
{
System.out.println( "Gewonnen!" );
break;
}
if ( playerPosition.equals( snakePosition ) )
{
System.out.println( "ZZZZZZZ. Die Schlange hat dich!" );
break;
}
if ( playerPosition.equals( goldPosition ) )
{
rich = true;
goldPosition.setLocation( –1, –1 );
}
// Konsoleneingabe und Spielerposition verändern
switch ( new java.util.Scanner( System.in ).next().charAt( 0 ) )
{
case 'h' : playerPosition.y = Math.max( 0, playerPosition.y – 1 ); break;
case 't' : playerPosition.y = Math.min( 9, playerPosition.y + 1 ); break;
case 'l' : playerPosition.x = Math.max( 0, playerPosition.x – 1 ); break;
case 'r' : playerPosition.x = Math.min( 39, playerPosition.x + 1 ); break;
}
// Schlange bewegt sich in Richtung Spieler
if ( playerPosition.x < snakePosition.x )
snakePosition.x--;
else if ( playerPosition.x > snakePosition.x )
snakePosition.x++;
if ( playerPosition.y < snakePosition.y )
snakePosition.y--;
else if ( playerPosition.y > snakePosition.y )
snakePosition.y++;
} // end while
}
}
Die Point-Eingeschaften, die wir nutzen, sind:
- x, y: Der Spieler und die Schlange werden bewegt, und die Koordinaten müssen neu gesetzt werden.
- setLocation(): Ist das Gold aufgesammelt, setzen wie die Koordinaten so, dass die Koordinate vom Gold nicht mehr auf unserem Raster liegt.
- equals(): Testet, ob ein Punkt auf einem anderen Punkt steht. Der gleiche Test könnte mit p.distance(q) == 0 durchgeführt werden, was sogar noch besser wäre, da die Point-Klasse intern mit dem Datentyp double statt int arbeitet und exakte Vergleiche immer etwas problematisch sind. Mit distance() können wir eine kleine Abweichung erlauben. Der Test p.equals(q) wäre dann etwa p.distance(q) < 0.0001.
Erweiterung
Wer Lust hat, an der Aufgabe noch ein wenig weiter zu programmieren, der kann Folgendes tun:
- Statt nur einem Stück Gold soll es zwei Stücke geben.
- Statt einer Schlange soll es zwei Schlangen geben.
- Mit zwei Schlangen und zwei Stücken Gold kann es etwas eng für den Spieler werden. Er soll daher 5 Züge machen können, ohne dass die Schlangen sich bewegen.
- Wenn der Spieler ein Goldstück einsammelt, soll die Länge der Schlange um eins schrumpfen.
- Für Vorarbeiter: Das Programm, das bisher nur eine Methode ist, soll in verschiedene Untermethoden aufgespalten werden.
Ihr Kommentar
Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.