Schleife soll wieder da anfangen wo ich es möchte !

DrahtEck

Aktives Mitglied
Java:
import java.util.Scanner;

public class myMiniGame {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        System.out.println("         Hi willkommen zu nie dagewesenem Console-Game : ) ! ");
        System.out.println("");
        System.out.println(" 1.)wie lautet dein Spielername : ");
        Scanner spielerName = new Scanner(System.in);
        String name = spielerName.nextLine();

        System.out.print("Hallo " + name + " mit welcher Stufe willst du anfangen ? ");
        System.out.println("");
        System.out.println("");
        System.out.println("1. Einfach ");
        System.out.println("2. Mittel ");
        System.out.println("3. Schwer ");
        System.out.println("Gib hier dazu die gewuenschte Zahl ein:");

        int stufe = spielerName.nextInt();
        spielerName.close();
        while (stufe >= 4) {
            if (stufe == 1) {
                System.out.println("Stufe  " + stufe + ".. dass du ein Loser bist ist dir schon klar : ) ");
                break;
            } else if (stufe == 2) {
                System.out.println("Stufe " + stufe + " ist eine kluge Entscheidung ");
                break;
            } else if (stufe == 3) {
                System.out.println("Stufe " + stufe + " ich sehe du hast Eier RESPEKT! ");
                break;
            } else {
                System.out.println("Eingabe unbekannt bitte versuche es nochmal: ");
               stufe ++;
               break;
            
            }

        }

    }
}

Moin allerseits,
eine Frage, wie sage ich dieser🤬dämlichen while Schleife, sie soll wieder in Zeile 20 bzw. 22 anfangen ??
Das kann doch nicht so schwer sein, oder gibt es da einen anderen Weg ??
Unter BASIC hieß das GOTO 22 😅

Danke im voraus für die Tipps
 
Zuletzt bearbeitet:
Die while Schleife macht so keinen Sinn würde ich sagen. Die while Schleife läuft nur bei stufe >= 4. Stufe kann also nie 1, 2 oder 3 sein. Evtl. willst Du die Bedingung also umformulieren in < 4?

Und dann kannst Du paar Dinge in die Schleife ziehen - halt ab Zeile 20 alles.
Du hast aber dann ein Problem: Die Variable spiel ist nur eine lokale Variable, die dann für den Schleifenkopf noch nicht existiert. Da wäre dann eine Aufteilung sinnvoll:
a) erst eine Deklaration vor der Schleife. Also sowas wie int stufe = 0;
b) bei der Zuweisung dann die Deklaration weglassen. Also einfach das int wegnehmen und nur noch stufe = .... stehen haben als reine Zuweisung
 
Die while Schleife macht so keinen Sinn würde ich sagen. Die while Schleife läuft nur bei stufe >= 4. Stufe kann also nie 1, 2 oder 3 sein. Evtl. willst Du die Bedingung also umformulieren in < 4?
Richtig habe ich schon versucht ohne Erfolg.
Und dann kannst Du paar Dinge in die Schleife ziehen - halt ab Zeile 20 alles.
Du hast aber dann ein Problem: Die Variable spiel ist nur eine lokale Variable, die dann für den Schleifenkopf noch nicht existiert.
Ja soweit war ich auch schon
Da wäre dann eine Aufteilung sinnvoll:
Ja und da bin ich gescheitert .
a) erst eine Deklaration vor der Schleife. Also sowas wie int stufe = 0;
b) bei der Zuweisung dann die Deklaration weglassen. Also einfach das int wegnehmen und nur noch stufe = .... stehen haben als reine Zuweisung
ich versuche es .

and @ Oneixee5
Du benötigst eine zweite Schleife um deine bestehende Schleife, inklusive der Zeile 20.
hatte schon schon dran gedacht, war mir nur nicht sicher ob man Schleife in Schleife machen kann.
Danke, ich poste euch das Ergebnis 😉
 
James Gosling hatte das mal "vorgesehen", aber dann der Übersichtlichkeit wegen wieder entfernt, weil es lesbare Alternativen gibt, heute ist es nur noch ein reserviertes Wort:


Du brauchst einfach noch eine Schleife drum rum
 
James Gosling hatte das mal "vorgesehen", aber dann der Übersichtlichkeit wegen wieder entfernt, weil es lesbare Alternativen gibt, heute ist es nur noch ein reserviertes Wort:
Die Verwendung von goto wäre die einfachste und klarste Art, etwas auszudrücken, und daher wäre es zwangsläufig nicht weniger lesbar zu mindest in einigen Fällen, als es in etwas anderes zu zwingen .
Aber als Anfänger will ich nicht zuviel Klugsch........

Danke, ich versuche die Schleife drum herum zu erst .
 
Zuletzt bearbeitet:
Du musst (eigentlich) erst mal den gewünschten Ablauf festlegen, dann den Ablauf codieren.

Begrüßung: Hi willkommen zu nie dagewesenem Console-Game

Frage: wie lautet dein Spielername?

Frage: mit welcher Stufe willst du anfangen ? (mögliche Antworten: 1, 2 oder 3)

Das soll offensichtlich nur einmal am Anfang passieren, also nicht in einer Schleife.

Offensichtlich willst Du bei

Frage: mit welcher Stufe willst du anfangen ? (mögliche Antworten: 1, 2 oder 3)

eine Prüfung machen, ob der Benutzer eine richtige Antwort eingegeben hat.

Dafür könntest Du das Stellen der Frage und das Prüfen der Antwort in eine eigene Methode auslagern.
Die in der Methode notwendige Schleife ist damit von dem Ablauf außen drum herum isoliert.

Also ungefähr so:
Java:
// Datei: MeinConsoleGame
import java.util.Scanner;

/**
 *
 */
public class MeinConsoleGame {

    public static void main(String[] args) {

        System.out.println("Hi willkommen zu nie dagewesenem Console-Game");

        System.out.println("Wie ist Dein Name: ");

        //spielerName ist kein guter Name fuer das Scanner-Objekt
        Scanner scanner = new Scanner(System.in);

        System.out.println("Wie ist Dein Name: ");
        String name = scanner.nextLine();

        int spielStufe = wahlSpielStufeBeginn(scanner);
       
        spiel(spielStufe);
       
        while (true) {

            // hier koennte dann eine wahlSpielStufe (nicht Beginn) folgen
            spielStufe = wahlSpielStufe(scanner);
           
            spiel(spielStufe);
        }
    }

    private static int wahlSpielStufeBeginn(Scanner scanner) {

        System.out.println("mit welcher Stufe willst du anfangen ? (mögliche Antworten: 1, 2 oder 3)");

        while (true) {

            int spielStufe = scanner.nextInt();

            if (spielStufe == 1) {
                System.out.println("Stufe  " + spielStufe + ".. dass du ein Loser bist ist dir schon klar : ) ");
                return spielStufe;
            }
            else if (spielStufe == 2) {
                System.out.println("Stufe " + spielStufe + " ist eine kluge Entscheidung ");
                return spielStufe;
            }
            else if (spielStufe == 3) {
                System.out.println("Stufe " + spielStufe + " ich sehe du hast Eier RESPEKT! ");
                return spielStufe;
            }
            else {
                System.out.println("Eingabe unbekannt bitte versuche es nochmal: ");
            }
        }
    }

}
 
Die Verwendung von goto wäre die einfachste und klarste Art, etwas auszudrücken, und daher wäre es zwangsläufig nicht weniger lesbar zu mindest in einigen Fällen, als es in etwas anderes zu zwingen .
Aber als Anfänger will ich nicht zuviel Klugsch........
Naja, wenn überhaupt ist goto nur sehr selten eine gute Alternative oder überhaupt gut.

Eine Sache, die Assembler z.B. relativ kompliziert zu lesen macht, sind die ganzen Sprünge quer durch das Programm, also die Struktur der goto entspräche. Das zerfasert dir den Programmfluß zu jeder Zeit in alle möglichen Richtungen.
Ohne goto wird dein Programm weitgehend von oben nach unten im Quelltext abgearbeitet, und wenn es mal wieder ein paar Zeilen zurückgeht dann wenigstens nur in einem zusammenhängenden Block.
Wenn du weitere Kontrollelemente in einer Schleife brauchst, dann schau dir mal Befehle wie break oder continue an.

Als Anfänger erschließt sich einem die Wichtigkeit von lesbarem Quellcode noch nicht so richtig. Da ist man stolz darauf, sich an die ganze komische Syntax mit den vielen lustigen Klammern gewöhnt zu haben und mag möglichst tippeffizienten Code, d.h. so viele Befehle mit so wenig Zeichen wie möglich. (War jedenfalls bei mir so.)

Und irgendwann kommt der Tag, an dem man nach langer Zeit mal wieder ein altes Projekt öffnen und weiterbearbeiten will und hart daran zu arbeiten hat, sich wieder in sein eigenes Programm reinzufinden.

Und irgendwann kommt der Tag, an dem man fremden Quelltext liest, sich darin sofort und sehr gut zurecht findet obwohl man ihn gar nicht kennt, und sich vornimmt: So will ich das ab jetzt auch machen.
 
Joooo..🙈 Danke Danke da wäre auch ne Lösung.(methode/n woltte ich im einem anderen Fall anwenden)
Im Moment überfordern mich die Lösungen ich melde mich wenn das soweit ist, mein Schädel geht gleich in Flammen auf . 😬
 
Die Verwendung von goto wäre die einfachste und klarste Art, etwas auszudrücken, und daher wäre es zwangsläufig nicht weniger lesbar zu mindest in einigen Fällen, als es in etwas anderes zu zwingen .
Aber als Anfänger will ich nicht zuviel Klugsch........
In der Zeit der Einführung der strukturierten Programmierung haben die Gegner (GOTO-Befürworter) das Argument gebracht, dass strukturierte Programmierung mehr Laufzeit und Speicher benötigt. Das ist wahr, aber schon damals war das kein Problem mehr, weil genug Rechenleistung und Speicher vorhanden ist und Compiler bzw. Laufzeitumgebungen Optimierungen machen.

Ich habe in den 80ern mal ein Buch von Harry Sneed Harry Sneed – Wikipedia über strukturierte Programmierung gelesen. Ein Buch, das mal in der Universitätsbibliothek Halle(Saale) aufgetaucht war. Später (2014 oder so) habe ich Harry mal auf einer Konferenz der Firma Imbus in Nürnberg getroffen, da hat er was mit Tests gemacht, so klein kann die Welt sein.

Wie auch immer, strukturierte Programmierung zwingt Algorithmen in ein Korsett für bessere Verständlichkeit (man verzeihe mir eventuell grobe Vereinfachung).

Bei Deinem Programm geht es aber auch um Benutzerabläufe (vielleicht nicht der ganz korrekte Begriff, aber Begriffe wie Workflow und so sind teilweise anders besetzt.

Ich habe mal ein Konferenzvideo gesehen, in dem sich der Sprecher gewundert hat, das Benutzerabläufe wilde GOTOs enthalten können und nicht richtig saubere strukturierte Programmierung sind. Das ist auch ganz klar, Benutzerabläufe sind keine Algorithmen.

Für Benutzerabläufe sollte man sich eher an Sachen wie BPMN halten.

In Deinem Fall ist der Benutzerablauf in strukturierte Programmierung eingezwängt, das kann klappen, muss aber nicht.

Nimm es einfach so hin.

In deinem Fall (modale Dialoge, also der Benutzer ist an einer Stelle im Ablauf und kann da nicht raus, er kann das Programm höchstens mit Mitteln des Betriebssystems Abbrechen) ist die Lage für den Programmierer(in) recht einfach.

Stell Dir mal die Eclipse oder andere IDE vor. Da kann man überall hin Klicken und was Eingeben und das Programm muss trotzdem den Status im Griff haben.

Ich als Programmierer habe oft mit einem solchen Supersystem Anwendungen geschaffen (müssen), die den Benutzer in einen starren Formularablauf gezwungen haben.

Wenn so ein Benutzer(in) in einem solchen Ablauf steckt und jemand ruft an, gucke mal schnell dort, dann ist Benutzer(in) hilflos, zumindest früher an einem Großrechner-Terminal oder MS-DOS-PC.

Unter grafischen Oberflächen kann Benutzer(in) das Programm eventuell in einer weiteren Instanz starten oder bei Web-App einen neuen Browser oder Tab öffnen, klappt aber auch nicht immer (gut).

Das Betriebssystem (GUI) löst sozusagen die Probleme des Programmes.

Oder denk mal an Web-Apps, in denen man den Back-Button benutzen kann.

Mein Selbstgespräch ist sicher nicht wichtig für Dein Problem, aber denk mal drüber nach, schaffst Du schon.
 
Die Verwendung von goto wäre die einfachste und klarste Art, etwas auszudrücken, und daher wäre es zwangsläufig nicht weniger lesbar, als es in etwas anderes zu zwingen .
Aber als Anfänger will ich nicht zuviel Klugsch........

Danke, ich versuche die Schleife drum herum zu erst .

In der Zeit der Einführung der strukturierten Programmierung haben die Gegner (GOTO-Befürworter) das Argument gebracht, dass strukturierte Programmierung mehr Laufzeit und Speicher benötigt. Das ist wahr, aber schon damals war das kein Problem mehr, weil genug Rechenleistung und Speicher vorhanden ist und Compiler bzw. Laufzeitumgebungen Optimierungen machen.

Ich habe in den 80ern mal ein Buch von Harry Sneed Harry Sneed – Wikipedia über strukturierte Programmierung gelesen. Ein Buch, das mal in der Universitätsbibliothek Halle(Saale) aufgetaucht war. Später (2014 oder so) habe ich Harry mal auf einer Konferenz der Firma Imbus in Nürnberg getroffen, da hat er was mit Tests gemacht, so klein kann die Welt sein.

Wie auch immer, strukturierte Programmierung zwingt Algorithmen in ein Korsett für bessere Verständlichkeit (man verzeihe mir eventuell grobe Vereinfachung).

Bei Deinem Programm geht es aber auch um Benutzerabläufe (vielleicht nicht der ganz korrekte Begriff, aber Begriffe wie Workflow und so sind teilweise anders besetzt.

Ich habe mal ein Konferenzvideo gesehen, in dem sich der Sprecher gewundert hat, das Benutzerabläufe wilde GOTOs enthalten können und nicht richtig saubere strukturierte Programmierung sind. Das ist auch ganz klar, Benutzerabläufe sind keine Algorithmen.

Für Benutzerabläufe sollte man sich eher an Sachen wie BPMN halten.

In Deinem Fall ist der Benutzerablauf in strukturierte Programmierung eingezwängt, das kann klappen, muss aber nicht.

Nimm es einfach so hin.

In deinem Fall (modale Dialoge, also der Benutzer ist an einer Stelle im Ablauf und kann da nicht raus, er kann das Programm höchstens mit Mitteln des Betriebssystems Abbrechen) ist die Lage für den Programmierer(in) recht einfach.

Stell Dir mal die Eclipse oder andere IDE vor. Da kann man überall hin Klicken und was Eingeben und das Programm muss trotzdem den Status im Griff haben.

Ich als Programmierer habe oft mit einem solchen Supersystem Anwendungen geschaffen (müssen), die den Benutzer in einen starren Formularablauf gezwungen haben.

Wenn so ein Benutzer(in) in einem solchen Ablauf steckt und jemand ruft an, gucke mal schnell dort, dann ist Benutzer(in) hilflos, zumindest früher an einem Großrechner-Terminal oder MS-DOS-PC.

Unter grafischen Oberflächen kann Benutzer(in) das Programm eventuell in einer weiteren Instanz starten oder bei Web-App einen neuen Browser oder Tab öffnen, klappt aber auch nicht immer (gut).

Das Betriebssystem (GUI) löst sozusagen die Probleme des Programmes.

Oder denk mal an Web-Apps, in denen man den Back-Button benutzen kann.

Mein Selbstgespräch ist sicher nicht wichtig für Dein Problem, aber denk mal drüber nach, schaffst Du schon.
Danke für die Super Anregung Barista, aber davon verstehe ich Bahnhof.
Als Anfänger versuche ich zu verstehen wie Java funktioniert und mir ist egal was in den 80er passiert ist, aus meiner sicht als Anfänger ist das dumm goto nicht zu benutzen und dabei bleibt es so, so lange ich es nicht verstehe warum ! Mit deinem Wissen kann ich nix anfangen.
Wie du mir das erklären willst weiss ich nicht. Ich verstehen es nicht was du mir deinem Roman sagen willst das ist für mich Beamten Deustch
Menschen und Wissenschalter änderen iher Meinung oft.
Speicherplatz sprünge hin und her äähh..... haben wir heute noch krücken als Rechner wo man auf Speicherplatz achten muss ??
Bitte nur kommentare die für meinen Code nützlich sind DANKE.

Danke an Barista.
 
James Gosling hatte das mal "vorgesehen", aber dann der Übersichtlichkeit wegen wieder entfernt, weil es lesbare Alternativen gibt, heute ist es nur noch ein reserviertes Wort:


Du brauchst einfach noch eine Schleife drum rum
Wieder entfernt? Es heißt zwar nicht GOTO aber Sprungmarken gibt es nach wie vor, zumindest bei Java 8. Bei späteren Versionen habe ich es nicht getestet. Allerdings werde ich das keinem Anfänger zeigen. Ich sehe das mehr als Spielerei als sinnvolles Feature.
 
Danke für die Super Anregung Barista, aber davon verstehe ich Bahnhof.
Schade, eventuell liest Du es noch mal in Ruhe.
Als Anfänger versuche ich zu verstehen wie Java funktioniert und mir ist egal was in den 80er passiert ist, aus meiner sicht als Anfänger ist das dumm goto nicht zu benutzen und dabei bleibt es so, so lange ich es nicht verstehe warum !
Gib mal in eine Suchmaschine Deiner Wahl "strukturierte programmierung warum" ein, Da wirst Du einiges über die Gründe finden.

Eigentlich habe ich in meinem Text die Ansicht ausgedrückt, dass man bei Benutzerabläufen GOTO sinnvoll gebrauchen könnte.

Aber ich habe es scheinbar zu unverständlich formuliert.
 
eine Frage, wie sage ich dieser🤬dämlichen while Schleife, sie soll wieder in Zeile 20 bzw. 22 anfangen ??
Indem Du das while-Statement in die gewünschte Zeile verschiebst. Außerdem musst Du natürlich die Bedingung korrigieren und die break-Anweisungen entfernen, mit denen Du ja die while-Schleife abbrichst. Ich glaube, Du verwechselt if-else mit einem switch-Statement (da wird mit einem break verhindert, dass der nächste Fall ausgeführt wird).

Zusätzlich musst Du natürlich das Schließen des Scanners unterlassen.
 

Zurück
Oben