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.
Wir testen drei Bedingungen für den Spielstatus: 1. Hat der Spieler das Gold eingesammelt und steht auf der Tür? (Das Spiel ist zu Ende.) 2. Beißt die Schlange den Spieler? (Das Spiel ist verloren.) 3. Sammelt der Spieler Gold ein?
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.
Im Quellcode sieht das so aus:
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++ ) {
java.awt.Point p = new java.awt.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!" );
return;
}
if ( playerPosition.equals( snakePosition ) ) {
System.out.println( "ZZZZZZZ. Die Schlange hat dich!" );
return;
}
if ( playerPosition.equals( goldPosition ) ) {
rich = true;
goldPosition.setLocation( -1, -1 );
}
// Konsoleneingabe und Spielerposition verändern
switch ( new java.util.Scanner( System.in ).next() ) {
// Spielfeld ist im Bereich 0/0 .. 39/9
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-Eigenschaften, die wir nutzen, sind:
die Objektzustände x, y: Der Spieler und die Schlange werden bewegt, und die Koordinaten müssen neu gesetzt werden.
die Methode setLocation(…): Ist das Gold aufgesammelt, setzen wir die Koordinaten so, dass die Koordinate vom Gold nicht mehr auf unserem Raster liegt.
die Methode equals(…): Testet, ob ein Punkt auf einem anderen Punkt steht.
Erweiterung
Wer Lust hat, an der Aufgabe noch ein wenig weiterzuprogrammieren, der kann Folgendes tun:
Spieler, Schlange, Gold und Tür sollen auf Zufallskoordinaten gesetzt werden.
Statt nur eines Stücks 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 am Anfang 5 Züge machen können, ohne dass die Schlangen sich bewegen.
Für Vorarbeiter: Das Programm, das sich bisher nur in der main-Methode befindet, soll in verschiedene Methoden aufgespalten werden.