Java: Wie kann man das Programm nochmals durchlaufen lassen?

4 Antworten

Zunächst solltest du dafür sorgen, dass dein Code etwas aufgeräumter aussieht, sowie die Vorteile der Objektorientierung nutzen, denn so viele Zeilen in einer Methode machen das sehr unlesbar.

Du beendest deine Schleife 'Haupt-Schleife' indem du das hier machst:

if (rich && rich2 && playerPosition.equals(doorPosition)) {
System.out.println("Gewonnen!");
break;
}
if (playerPosition.equals(snakePosition)) {
System.out.println("Game Over!");
break;
}

um jetzt so wenig an deinem Code zu ändern wie möglich, hättest du die Option, das 'gesamte' in eine zweite schleife zu kapseln.

Deine 'äußere schleife' aktuell, die bei dir so zu finden ist:

boolean isRunning = true;
...
while (isRunning) {...

Stellt letztendlich nur die aktuelle Spielrunde dar: Von Spielbeginn bis Spielende.

Deine andere Schleife:

while (true) {

Ist jeweils dein Spielzug.

Demnach bräuchtest du nun eine weitere Schleife, die für das eingeworfene Geld gilt. 

jaunel 
Fragesteller
 24.04.2016, 18:53

Ok danke. Aber kann man sich dann nicht die while is Running Schleife sparen? Weil das war ja auch mein Ziel mit dieser Schleife, das die für alle Spiele gilt. (= die äußerste Schleife)

0
KnusperPudding  24.04.2016, 20:52
@jaunel

Aber kann man sich dann nicht die while is Running Schleife sparen?

Das geht sehr wohl. - Per Rekursion.

Sobald du deinen Code eben etwas aufgeräumt hast, wird das eben leichter lesbar. 

Du musst dir eben vor Augen führen wie es für dich am leichtesten und verständlichsten ist.

Beispielsweise hätte ich hier mehrere Klassen:

- Spielautomat

- Spiel

- Snake (extends Spiel)

- Spielbrett

- Spieler

- SpielEndeListener

Zur ersten Klasse: Spielautomat. Hier würde ich bereits im Konstruktor ein Spiel übergeben, z.B. Snake, was von Spiel ableitet, sodass du dein Spiel als Instanzvariable verwenden kannst.

des weiteren hat deine Klasse Spielautomat auch noch eine Variable: EingeworfenesGeld. Sowie eine Methode: StarteSpiel.

Deine Methode StarteSpiel könnte so aussehen: 

public void starteSpiel() {
    if (eingeworfenesGeld > 0) {
        eingeworfenesGeld--;
        erwirtschaftetesGeld++;
        this.spiel.start();
    }
}

Dann: Die Klasse Spiel: Diese ist das "Grundgerüst" für alle Spiele, die auf dem Automaten gespielt werden können. - Das wäre ein Klassiker für eine Abstrakte Klasse.

Hier kannst du Methoden bereits definieren, wovon nicht alle ausgebaut werden müssen: start(); spielende(); addSpielEndeListener(); removeSpielendeListener();

Interessant wäre beispielsweise die Methode: spielende(); - hier könnte man bereits folgendes machen:

protected void spielende() {
  for (SpielendeListener listener : this.spielendeListenerList) {
    listener.execute();
  }
}

Was dir dann in der Klasse: Automat hilft, da du nun beispielsweise hier einen SpielendeListener definieren kannst der bei Spielende ausgeführt wird, z.B.: so:

new SpielEndeListener() {
   
   @Override
   public void execute() {
     if (eingeworfenesGeld > 0) {
        System.out.println("Erneut versuchen?")
        if (new Scanner(System.in).next().equals("y") {
           spiel.start();
        }
     }
   }
}

Oh je, schon so viel Text.. Naja, erstmal soviel. Sollte ja auch nur als Beispiel dienen.

0

Also du lagerst die zu wiederholende funktion in eine extra methode aus. Diese kannst du dann mittels rekursion wieder aufrufen. Also wenn die methode gameRunner
() heisst kannst du sie aus sich selber mit gameRunner() aufrufen. Dabei muss du nur aufpassen dass die wiederholung nur in bestimmten fällen aufgerufen wird um keine endlosschleife zu erzeugen

jaunel 
Fragesteller
 24.04.2016, 18:35

Danke ich werde es versuchen

0

Sry der Code war nich komplett:

//S. 244-245
public class Snake {

public static void main(String[] args) {

boolean isRunning = true;
boolean ok = true;
while ( isRunning ) {
if ( ok )
System.out.println("Cash einwerfen:");
ok = false;
int cash = new java.util.Scanner( System.in ).nextInt();

java.awt.Point playerPosition = new java.awt.Point( 10, 9 );
java.awt.Point snakePosition = new java.awt.Point( 39, 0 );
java.awt.Point goldPosition = new java.awt.Point( 6, 6 );
java.awt.Point doorPosition = new java.awt.Point( 0, 5 );
java.awt.Point gold2Position = new java.awt.Point( 20, 8 );
boolean rich = false;
boolean rich2 = false;

while ( true ) {

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 ( gold2Position.equals( p ) )
System.out.print('$');//Wichtig: print statt println
else if ( doorPosition.equals( p ) )
System.out.print('#');
else System.out.print('.');
}
System.out.println();
}

//Textausgaben
if ( rich && rich2 && playerPosition.equals( doorPosition ) ) {
System.out.println("Gewonnen!");
break;
}
if ( playerPosition.equals( snakePosition ) ) {
System.out.println("Game Over!");
break;
}
if ( playerPosition.equals ( goldPosition ) ) {
rich = true;
goldPosition.setLocation( -1, -1 );
}
if ( playerPosition.equals ( gold2Position ) ) {
rich2 = true;
gold2Position.setLocation( -1, -1 );

goldPosition.setLocation( -1, -1 );
}

switch ( new java.util.Scanner ( System.in ).next() ) {
case "w" : playerPosition.y = Math.max( 0, playerPosition.y - 1); break;
case "s" : playerPosition.y = Math.min( 9, playerPosition.y + 1); break;
case "a" : playerPosition.x = Math.max( 0, playerPosition.x - 1); break;
case "d" : playerPosition.x = Math.min( 39, playerPosition.x + 1); break;
case "wa": playerPosition.y = Math.max( 0, playerPosition.y - 1);
playerPosition.y = Math.max( 0, playerPosition.x - 1 ); break;
case "wd": playerPosition.y = Math.max( 0, playerPosition.y - 1);
playerPosition.x = Math.min( 39, playerPosition.x + 1); break;
case "sa": playerPosition.y = Math.min( 9, playerPosition.y + 1);
playerPosition.x = Math.max( 0, playerPosition.x - 1); break;
case "sd": playerPosition.y = Math.min( 9, playerPosition.y + 1);
playerPosition.x = Math.min( 39, playerPosition.x + 1); break;
}

//Bewegung der Schlange in Richtung des Spielers

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

cash --;
if ( cash == 0){
isRunning = false;
}
else if ( cash > 0){
isRunning = true;

}

}

}
}

Ich habs probiert aber keine Lösung gefunden...ich bleib dran...Spiel mit Suchtfaktor :D

jaunel 
Fragesteller
 24.04.2016, 18:30

xD

0