Java Würfelspiel problem?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Bau dir einen Lösungsweg doch erst einmal in Pseudocode/Struktogrammen/o.ä. auf, anstatt direkt drauflos zu hacken. Von einem unendlich laufenden Spiel steht in der Aufgabenstellung beispielsweise nichts, weshalb deine äußere Schleife an der Stelle auch gar nicht hineinpasst.

Im ersten Schritt sollte nur der Ablauf für eine erste (normale) Spielrunde im Fokus stehen. Die weiteren Spielrunden werden deshalb vorerst nur (z.B. als weitere Funktion) angedeutet.

dice1 = random(6)
dice2 = random(6)
sum = dice1 + dice2

switch sum:
  case 7, 11:
    print("Gewonnen")
    break
  case 2, 3, 12:
    print("Verloren")
    break
  case 4, 5, 6, 8, 9, 10:
    startNextRounds(sum)
    break

Das soweit in Java zu übersetzen, dürfte nicht schwerfallen, zumal deine switch-case-Struktur dahingehend schon richtig ist.

Für die Speicherung der Würfelwerte genügen allerdings lokale Variablen (im UML-Diagramm sind schließlich auch keine aufgeführt) und die Implementation der Folgerunden ist nicht richtig.

Da es sich bei diesen diesmal wirklich um mehrere mögliche Runden handelt, brauchst du eine Schleife, in der je Iterationsschritt zwei völlig neue Zahlen gewürfelt und miteinander addiert werden. Nun gibt es drei mögliche Fälle:

  • Die Augenzahl 7 wurde gewürfelt, woraufhin der Spieler verliert. Nach der Ausgabe kannst du mittels return-Befehl die Funktion vorzeitig verlassen.
  • Die erste Augenzahl wurde gewürfelt. Es muss sich um eine Zahl aus der Menge 4, 5, 6, 8, 9, 10 handeln, andernfalls wärst du nicht in Runde 1+n gelandet. Die erste und zweite Augenzahl stimmen überein, wenn ihre Summe geteilt durch 2 der ersten/zweiten Augenzahl entspricht. Diese Logik ermöglicht eine Codeverkürzung, indem man erneut ein switch in einem anderen verschachtelt.
switch newSum:
  case 7:
    print("Verloren")
    return
  default:
    switch (sum + newSum) / 2:
      case 4, 5, ...:
        print("Gewonnen")
        return

Das lässt sich mit einer if-else-Verzweigung zwar noch kürzer formulieren, würde dann aber wohl nicht mehr die Anforderungen der Aufgabenstellung erfüllen.

Ebenso würde man bei so einer tiefen Verschachtelung von Kontrollstrukturen eigentlich eine Auslagerung in Hilfsmethoden vornehmen.

Bezüglich der Würfelhistorie kannst du eine Liste verwenden und die für die Ausgabe mittels String.join-Methode verbinden. Wenn dir bisher nur Arrays bekannt sind, musst du bei Vergrößerung jedesmal ein neues Array erstellen und die Werte des alten Arrays in dieses kopieren.


ggh3003 
Fragesteller
 15.03.2024, 14:01

Habe ehrlich gesagt nicht zu 100% verstanden was du geschrieben hast habe aber trotzdem versucht weiter zu schreiben Jetzt habe ich noch das Problem dass ich nicht weis wie ich einen ganzen array in einer Ausgabe ausgeben kann und ich auch nicht weis wie man mit case eine Variable überprüfen kann. Meinen Code schicke ich in einer weiteren Nachricht da ich nicht weiss wie und ob man screenshots kommentieren kann.

0
ggh3003 
Fragesteller
 15.03.2024, 14:01
import java.util.Random;
public class Spiel
{
    public static void main(String[] args)
    {
        spielen();
    }
   private static int wuerfel1;
   private static int wuerfel2;
   static int j = 1;
   private static int[] zaehler = new int[j];
   public static void spielen()
   {
       int ergebnis = 0;
       int i = 0;
       Random myRandom = new Random();
       wuerfel1 = myRandom.nextInt(1, 7);
       wuerfel2 = myRandom.nextInt(1, 7);
       zaehler[i] = wuerfel1 + wuerfel2;
       switch (wuerfel1 + wuerfel2)
       {
           case 7, 11:
               System.out.println("Du hast " + zaehler[i] + " gewürfelt und gewonnen!");
               return;
           case 2, 3, 12:
               System.out.println("Du hast " + zaehler[i] + " gewürfelt und verloren!");
               return;
           case 4, 5, 6, 8, 9, 10:
               ergebnis = zaehler[i];
               j++;
               zaehler = new int[j];
               i++;
               break;
       }
       while(true)
       {
           wuerfel1 = myRandom.nextInt(1, 7);
           wuerfel2 = myRandom.nextInt(1, 7);
           switch (wuerfel1 + wuerfel2)
           {
               case 7:
                   zaehler[i] = 7;
                   System.out.println("Du hast " + zaehler[i] + " gewürfelt und verloren!");
                   return;
               case 11, 2, 3, 12:
                   zaehler[i] = 11;
                   j++;
                   zaehler = new int [j];
                   i++;
                   continue;
               default:
                   switch ((ergebnis + wuerfel1 + wuerfel2) /2)
                   {
                       case ergebnis:
                           zaehler[i] = wuerfel1 + wuerfel2;
                           j++;
                           zaehler = new int[j];
                           i++;
                           System.out.println("Du hast " + zaehler[i] + " gewürfelt und gewonnen!");
                           return;
                       default:
                           zaehler[i] = 11;
                           j++;
                           zaehler = new int [j];
                           i++;
                           continue;
                   }
           }

       }
   }
}
0
ggh3003 
Fragesteller
 16.03.2024, 10:45

Habe es jetzt geschafft danke für deine Hilfe

0