2017-09-17 17:06:21 +02:00
|
|
|
import java.awt.Point;
|
|
|
|
import java.util.Scanner;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Spielklasse des Spiels Snake.
|
2019-09-12 07:52:17 +02:00
|
|
|
* <p>
|
|
|
|
* Ziel dieses Spiels ist es alle Goldstuecke einzusammeln und
|
|
|
|
* die Tuer zu erreichen, ohne sich selber zu beissen oder in
|
|
|
|
* die Spielfeldbegrenzung reinzukriechen.
|
2017-09-17 17:06:21 +02:00
|
|
|
*/
|
|
|
|
public class SnakeSpiel {
|
|
|
|
private Schlange schlange;
|
|
|
|
private Tuer tuer;
|
|
|
|
private Spielfeld spielfeld;
|
|
|
|
private Point goldStueck;
|
|
|
|
private boolean spielLaeuft = true;
|
2019-09-12 07:52:17 +02:00
|
|
|
private Scanner scanner;
|
|
|
|
|
|
|
|
public static void main(String[] args) {
|
|
|
|
new SnakeSpiel().spielen();
|
|
|
|
}
|
2017-09-17 17:06:21 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Startet das Spiel.
|
|
|
|
*/
|
|
|
|
public void spielen() {
|
2019-09-12 07:52:17 +02:00
|
|
|
scanner = new Scanner(System.in);
|
2017-09-17 17:06:21 +02:00
|
|
|
spielInitialisieren();
|
|
|
|
while (spielLaeuft) {
|
|
|
|
zeichneSpielfeld();
|
|
|
|
ueberpruefeSpielstatus();
|
|
|
|
fuehreSpielzugAus();
|
2019-09-12 07:52:17 +02:00
|
|
|
}
|
|
|
|
scanner.close();
|
2017-09-17 17:06:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private void spielInitialisieren() {
|
|
|
|
tuer = new Tuer(0, 5);
|
|
|
|
spielfeld = new Spielfeld(40, 10);
|
|
|
|
goldStueck = new Point(20, 2);
|
|
|
|
schlange = new Schlange(30, 2);
|
|
|
|
}
|
|
|
|
|
|
|
|
private void zeichneSpielfeld() {
|
|
|
|
char ausgabeZeichen;
|
|
|
|
for (int y = 0; y < spielfeld.gibHoehe(); y++) {
|
|
|
|
for (int x = 0; x < spielfeld.gibBreite(); x++) {
|
|
|
|
Point punkt = new Point(x, y);
|
|
|
|
ausgabeZeichen = '.';
|
|
|
|
if (schlange.istAufPunkt(punkt)) {
|
|
|
|
ausgabeZeichen = '@';
|
|
|
|
} else if (istEinGoldstueckAufPunkt(punkt)) {
|
|
|
|
ausgabeZeichen = '$';
|
|
|
|
} else if (tuer.istAufPunkt(punkt)) {
|
|
|
|
ausgabeZeichen = '#';
|
2019-09-12 07:52:17 +02:00
|
|
|
}
|
|
|
|
if (schlange.istKopfAufPunkt(punkt)) {
|
|
|
|
ausgabeZeichen = 'S';
|
2017-09-17 17:06:21 +02:00
|
|
|
}
|
|
|
|
System.out.print(ausgabeZeichen);
|
|
|
|
}
|
|
|
|
System.out.println();
|
|
|
|
}
|
|
|
|
}
|
2019-09-12 07:52:17 +02:00
|
|
|
|
2017-09-17 17:06:21 +02:00
|
|
|
private boolean istEinGoldstueckAufPunkt(Point punkt) {
|
|
|
|
return goldStueck != null && goldStueck.equals(punkt);
|
|
|
|
}
|
2019-09-12 07:52:17 +02:00
|
|
|
|
2017-09-17 17:06:21 +02:00
|
|
|
private void ueberpruefeSpielstatus() {
|
|
|
|
if (istEinGoldstueckAufPunkt(schlange.gibPosition())) {
|
|
|
|
goldStueck = null;
|
|
|
|
schlange.wachsen();
|
|
|
|
System.out.println("Goldstueck eingesammelt.");
|
|
|
|
}
|
2019-09-12 07:52:17 +02:00
|
|
|
if (istVerloren()) {
|
2017-09-17 17:06:21 +02:00
|
|
|
System.out.println("Verloren!");
|
|
|
|
spielLaeuft = false;
|
|
|
|
}
|
2019-09-12 07:52:17 +02:00
|
|
|
if (istGewonnen()) {
|
2017-09-17 17:06:21 +02:00
|
|
|
System.out.println("Gewonnen!");
|
|
|
|
spielLaeuft = false;
|
|
|
|
}
|
|
|
|
}
|
2019-09-12 07:52:17 +02:00
|
|
|
|
2017-09-17 17:06:21 +02:00
|
|
|
private boolean istGewonnen() {
|
2019-09-12 07:52:17 +02:00
|
|
|
return goldStueck == null &&
|
2017-09-17 17:06:21 +02:00
|
|
|
tuer.istAufPunkt(schlange.gibPosition());
|
|
|
|
}
|
|
|
|
|
|
|
|
private boolean istVerloren() {
|
2019-09-12 07:52:17 +02:00
|
|
|
return schlange.istKopfAufKoerper() ||
|
|
|
|
!spielfeld.istPunktInSpielfeld(schlange.gibPosition());
|
2017-09-17 17:06:21 +02:00
|
|
|
}
|
2019-09-12 07:52:17 +02:00
|
|
|
|
2017-09-17 17:06:21 +02:00
|
|
|
private void fuehreSpielzugAus() {
|
|
|
|
char eingabe = liesZeichenVonTastatur();
|
|
|
|
schlange.bewege(eingabe);
|
|
|
|
}
|
|
|
|
|
|
|
|
private char liesZeichenVonTastatur() {
|
|
|
|
char konsolenEingabe = scanner.next().charAt(0);
|
|
|
|
return konsolenEingabe;
|
|
|
|
}
|
|
|
|
}
|