Java Würfelspiel problem?
Habe eine Aufgabe in Java bei der Ich an einem Punkt komplett hängen bleibe
Das ist die Angabe
Das ist was ich bisher geschrieben habe ich hätte den letzten case jetzt gerne in eine eigene Schleife gegeben die dann wiederholt wird bis eben das letzte Ergebnis oder 7 herauskommt, was aber nicht geht (uns wurde switch noch nicht erklärt haben aber trotzdem diese Aufgabe bekommen also habe ich alles was ich bisher gemacht habe von Google). Hat jemand eine Idee wie das richtig ginge?
1 Antwort
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.
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.
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;
}
}
}
}
}