Problem WIE ohne Goto-Befehl lösbar?

JL51

Aktives Mitglied
Hallo, folgendes Programm mischt Karten. Die Kartenmischmethode wäre mit Sicherheit eleganter hinzukriegen, aber ich bin ja Anfänger in Java. Der Code selber funktioniert aber und nachdem die Karten gemischt wurden, soll es drei Möglichkeiten geben:

1. Taste 1 drücken plus Enter: nochmal
2. Taste 2 drücken plus Enter: beenden
3. Ansonsten Fehlerausgabe "Eingabefehler".

Der Haken entsteht dann nach einem Eingabefehler, denn dort bräuchte man einen Sprungbefehl zurück zu Zeile 95, um nochmal die Chance haben zu können, die Tasten 1 oder 0 bedienen zu können. Ich bin gespannt, wie man in Java aus dem Dilemma raus kommen soll. Gegen Sprungmarken hatte ich auch noch nie was. Danke für Info.

Java:
import Prog1Tools.IOTools;
import java.util.Random;
public class KartenMischen
{
    public static void main (String[] args)
    {
       int i = 0;
       int var,z0,z1,z2,z3,z4,z5,z6,z7;
       var = 8;//Anzahl Karten
       z0 = 0;
       z1 = 0;
       z2 = 0;
       z3 = 0;
       z4 = 0;
       z5 = 0;
       z6 = 0;
       z7 = 0;
    
       String[] bild = {"Tisch","Tisch","Stuhl","Stuhl","Couch","Couch","Schrank","Schrank"};
       String[] karte = new String[var];
       for (i=0; i<var; i++)
       karte[i] = "";
       i = 0;
      
       boolean nochmal = true;
       
       while (nochmal == true)
       {
           i = 0;
           z0 = zufall();
           z1 = zufall();
           while (z1 == z0)
           {
               z1 = zufall();
           }
           z2 = zufall();
           while (z2 == z0 | z2 == z1)
           {
               z2 = zufall();
           }
           z3 = zufall();
           while (z3 == z0 | z3 == z1 | z3 == z2)
           {
               z3 = zufall();
           }
           z4 = zufall();
           while (z4 == z0 | z4 == z1 | z4 == z2 | z4 == z3)
           {
               z4 = zufall();
           }
           z5 = zufall(); 
           while (z5 == z0 | z5 == z1 | z5 == z2 | z5 == z3 | z5 == z4)
           {
               z5 = zufall();
           }
           z6 = zufall();
           while (z6 == z0 | z6 == z1 | z6 == z2 | z6 == z3 | z6 == z4 | z6 == z5)
           {
               z6 = zufall();
           }
           z7 = zufall();
           while (z7 == z0 | z7 == z1 | z7 == z2 | z7 == z3 | z7 == z4 | z7 == z5 | z7 == z6)
           {
               z7 = zufall();
           }
          
           karte[i] = bild[z0]; i += 1;//zufällige Bilderreihenfolge Karten 1-var zuweisen
           karte[i] = bild[z1]; i += 1;
           karte[i] = bild[z2]; i += 1;
           karte[i] = bild[z3]; i += 1;
           karte[i] = bild[z4]; i += 1;
           karte[i] = bild[z5]; i += 1;
           karte[i] = bild[z6]; i += 1;
           karte[i] = bild[z7]; i += 1;
                  
           if (i == var)
           {
               i = 0;
               for (i=0; i<var; i++)
               System.out.println("Karte " + (i+1) + " = " + karte[i]);
           }
           
           /*String agt0 = karte[0];
           String agt1 = karte[1];
           
           if (agt0 == agt1)
           {
               System.out.println("Karten 1 und 2 sind gleich");
           }
           else
           {
               System.out.println("Karten 1 und 2 sind unterschiedlich");
           }*/
          
           System.out.println('\n' + "Eingabe 1 plus Enter = nochmal");
           System.out.println("Eingabe 0 plus Enter = beenden");
           int oncemore = IOTools.readInteger("");
           
           switch(oncemore)
           {
              case 0:
              nochmal = false;
              System.out.println("Programm beendet");
              break;
              
              case 1:
              break;
              
              default:
              System.out.println("Eingabefehler");
              break;
           }
       }   
    }
    
       public static int zufall()
       {
           Random rand = new Random();
           int zuf = rand.nextInt(8);
           return zuf;
       }
}
 
Zuletzt bearbeitet:
While oder Do-While-Schleifen sind meistens ein recht guter GOTO-Ersatz:

Java:
boolean inputValid = false;
		do {

			System.out.println('\n' + "Eingabe 1 plus Enter = nochmal");
			System.out.println("Eingabe 0 plus Enter = beenden");
			// int oncemore = IOTools.readInteger("");
			int oncemore = -1;
			switch (oncemore) {
			case 0:
				// nochmal = false;
				System.out.println("Programm beendet");
				break;

			case 1:
				inputValid = true;
				break;

			default:
				System.out.println("Eingabefehler");
				inputValid = false;
				break;
			}
		} while (!inputValid);

Noch ein Tipp:
Deine main-Methode ist viel zu lang. Bastel dir lieber mehrere kleine Methoden, als alles in einer abhandeln zu wollen.
 
Klasse, daß um diese Uhrzeit noch Hilfe kam, Danke! Ich werde das morgen früh mal in aller Ruhe ausprobieren. Gute Nacht.
 
Zuletzt bearbeitet:
Leider ist das Problem nicht gelöst, auch wenn die do-while-Schleife von Saheeda schon einiges verbessert hat. Wie gesagt soll das Programm bei folgenden Eingaben folgendes machen:

Taste 1 plus Enter: nochmal die Karten mischen
Taste 0 plus Enter: Programm beenden, ohne daß dann nochmal die Eingabeeinforderungen erscheinen
Default: Zurück führen zu den Eingabeaufforderungen
 
Zuletzt bearbeitet:
Problem gelöst! @Saheeda Nochmals Danke für den Anschub🙂

[Java]boolean weiter = false;
do
{
System.out.println('\n' + "Eingabe 1 plus Enter = nochmal");
System.out.println("Eingabe 0 plus Enter = beenden");
int oncemore = IOTools.readInteger("");
switch (oncemore)
{
case 0:
weiter = false;
nochmal = false;
System.out.println("Programm beendet");
break;

case 1:
weiter = false;
break;

default:
System.out.println("Eingabefehler");
weiter = true;
break;
}
} while (weiter == true);[/Java]
 
Zuletzt bearbeitet:
Danke für den Tipp mit den Collections, werde ich mir mal ansehen. Die Methode zufall() hatte ich dazu gemacht, damit in der Ausgabe jede Karte jeweils nur 2mal vorkommen soll.
 

Zurück
Oben