Java: Wie kann man das Programm nochmals durchlaufen lassen?

4 Antworten

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;

}

}

}
}

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. 

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
@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

Danke ich werde es versuchen

0

Java frage zu boolean?

public static void main (string [] args){ System.out.println(welcheKleidung(false));}

public static String welcheKleidung (boolean esRegnet){ if (esRegnet){ return "regenjacken"} else { return "winterjacke"}

woher soll man hier nun wissen was raus kommt? es wurde ja nicht definiert , was false und was true ist?

...zur Frage

Java - Primzahlen ermitteln

Soll zwischen 1 und 100 alle Primzahlen in Java ermitteln. Lasse ich das Programm laufen wird keine Zahl ausgegeben. Ich habe festgestellt, dass bei jeder Zahl primzahl == false ist. Zu beginn war der boolean primzahl true. Was habe ich falsch gemacht?

System.out.println ("Primzahlen:");

for (i=1 ;i<=100 ;i++ ) {
  if (i==1) {
    primzahl = false;
  } // end of if
    else {
    for (j=2 ;j<i ;j++ ) {
      if (i % j == 0) {
        primzahl = false;
      } // end of if
    } // end of for
  } // end of if-else
  if (primzahl == true) {
    System.out.println (i);
  } // end of if
} // end of for
...zur Frage

Mein Java Programm gibt "Primzahl" 9 aus?!?!?!?!?

int zahl, Limit, P;

zahl = 1;                        //Primzahlen von...
Limit = 10;                      //...bis                     
boolean Prim = true;             // Prim = true wenn "zahl" eine Primzahl ist

System.out.println("Die Primzahlen zw. den Zahlen " + zahl + " und " + Limit + " sind: ");

while (zahl<=Limit) {            // solang "zahl" kleiner als "Limit" ist 
  if (zahl%2 == 0) {
    Prim = false; 

  } 
  if (Prim) {
    System.out.println(zahl);

  } 
  else{

    Prim = true;

  }
  zahl++;
}
...zur Frage

JavaFX letzte KeyCode-Eingabe "merken"?

Hallo!

Ich bin dabei, Snake zu programmieren.

Dabei bin ich auf das Problem gestoßen, dass wenn keine Taste gedrückt wird, dass Snake sich weiterhin in die zuletzt gewählte Richtung bewegen muss.

Das Problem ist, dass ich nicht die letzte Eingabe speichern kann.

...zur Frage

Java:Taschenrechner:Konsole:Problem

import java.util.Scanner;

public class test{
    public static void main(String[] args){

        System.out.println("Dies ist ein Taschenrechner, bitte nur folgende Rechenmethoden verwenden(ausgeschrieben): ");
        System.out.println("plus\n"+"minus\n"+"mal\n"+"durch\n");

        Scanner eingabe = new Scanner(System.in); //Scanner

        String rechenmethode = String.valueOf(eingabe); //String deklarieren

        double zahl1, zahl2; //Varriablen deklarieren


        System.out.println("Erste Zahl bitte: "); //Abfrage erste Zahl
        zahl1 = eingabe.nextDouble();
        System.out.println("Rechenmethode bitte: "); //Abfrage Rechenmethode
        rechenmethode = eingabe.next();
        System.out.println("Zweite Zahl bitte: "); //Abfrage zweite Zahl
        zahl2 = eingabe.nextDouble();
        Double Summe = zahl1+zahl2; //verarbeiten der eingaben
        Double Differenz = zahl1-zahl2; //verarbeiten der eingaben
        Double Produkt = zahl1*zahl2; //verarbeiten der eingaben
        Double Quotient = zahl1/zahl2; //verarbeiten der eingaben


        if(rechenmethode.equals("plus")){ //Ausgeben des Ergebnisses
            System.out.println(Summe);
        }
        else if(rechenmethode.equals("minus")){ //Ausgeben des Ergebnisses
            System.out.println(Differenz);
        }
        else if(rechenmethode.equals("mal")){ //Ausgeben des Ergebnisses
            System.out.println(Produkt);
        }
        else if(rechenmethode.equals("durch")){ //Ausgeben des Ergebnisses
            System.out.println(Quotient);
        }




        System.out.println("\n\nby Max Musterma"); //Ausgabe des wundervollen Namen des Programmierers

    }
}

Taschenrechner der 2Zahlen zusammenrechnet...

Nun will ich beliebig viele Zahlen zusammenrechnen..

import java.util.Scanner;
public class Rechner2 {
    public static void main(String[]args){

        Scanner eingabe = new Scanner(System.in);

        double ergebnis = 0;
        int i = 0;

        while(i<1){
            System.out.println("Zahl:");
            double zahl = eingabe.nextDouble();
            if(zahl == 0){
                break;
            }
            System.out.println("Rechenmethode:");
            String zeichen = eingabe.next();
            if(zeichen.equals(0)){
                break;
            }
            switch(zeichen){
                case "+": ergebnis = ergebnis + zahl;
                break;
                case "-": ergebnis = ergebnis - zahl;
                break;
                case "*": ergebnis = ergebnis * zahl;
                break;
                case "/": ergebnis = ergebnis / zahl;
                break;  
            }
        }
        System.out.println(ergebnis);

        System.out.println("\n\nMax Mustermt");
    }
}

testen...

man kann nun beliebig viele Zahlen zusammenrechnen, mit verschiedenen

...zur Frage

Was möchtest Du wissen?