Drei Zahlen eines Würfelspiels auswerten

prog6d

Mitglied
Hallo zusammen,

ich versuche meinem Sohn bei der Lösung einer in der Schule gestellten Programmieraufgabe zu helfen. Leider sind meine Programmierkenntnisse bereits etwas in die Jahre gekommen und hoffe auf Eure Hilfe. :)

Und zwar programmieren sie gerade ein Würfelspiel. Das meiste davon hat er lösen können, jedoch noch nicht folgendes.

Gegeben sind drei int-Werte (vorher generierte Zufallszahl), die nun wie folgt ausgewertet werden müssen:
  1. Paar: Wenn zwei Würfelzahlen übereinstimmen, multipliziert man die übereinstimmende Augenzahl mal 10.
  2. Straße: Wenn die Augenzahlen der Würfel aufeinander folgen (z.B. [1, 2, 3], [4, 5, 6] usw.), ist die Punktzahl immer 100.
  3. Pasch: Wenn alle Würfel im Becher die gleiche Zahl haben, wird diese Zahl mit 100 multipliziert.
  4. Nichts: In allen anderen Fällen werden die Augenzahlen einfach summiert.

Das Problem sind nicht die einzelnen Rechnungen, sondern die grundsätzliche Struktur.

Wir haben wie folgt angefangen...

[CODE lang="java" title="Code"]public int werteAus(int w1, int w2, int w3) {
if (getPaar(w1, w2, w3) != 0) {
return getPaar(w1, w2, w3);
}
// ... usw.
}

private int getPaar(int w1, int w2, int w3) {
if (w1 == w2 || w1 == w3) {
return w1 * 10;
} else if (w2 == w3) {
return w2 * 10;
} else {
return 0;
}
}[/CODE]

... dann aber festgestellt, dass dieser Weg vermutlich einen zu komplexen Spaghetticode ergeben würde, würde man das so für die anderen Auswertungen fortsetzen. Das lässt sich doch bestimmt eleganter lösen. ;)

Wie würdet Ihr logisch vorgehen? Erst mal überprüfen (boolean) und dann, in separaten Methoden rechnen oder alles in einem? Über etwas Beispielcode würden wir uns auch sehr freuen. Wie gesagt, ich bitte um Nachsicht, da mein Wissen etwas eingerostet ist und ich die Aufgabe für einen Schüler doch recht anspruchsvoll finde.

Wir bedanken uns im Voraus! 👍
 

Barista

Top Contributor
Zuerst würde ich daruaf achten, dass Pasch (3) Paar (2) impliziert.

Ansonsten sehe ich nicht viele Möglichkeiten zur Verbesserung.

Eventuell könnte man die Prüfung der Bedingungen in einzelne Methoden auslagern, was diesen einen Namen (Selbstdokumentation) und eine Abgrenzung vom restlichen Code gibt.

Die im Code vorhandene Verbindung von Prüfung und Berechnung über tricky != 0 halte ich für nicht so gut.
 

Blender3D

Top Contributor
Das Problem sind nicht die einzelnen Rechnungen, sondern die grundsätzliche Struktur.
Hier ein Beispiel für eine Würfelbecherklasse mit fünf Würfeln.

1624549701490.png
Die verwendete Struktur ......
[CODE lang="java" title="Teste die Klasse Würfelbecher" highlight="2-8"]public class start {
public static void main(String[] args) {
DiceCup cup = new DiceCup();
for (int i = 0; i < 10; i++) {
cup.rollDice();
printResult(cup);
}
}

private static void printResult(DiceCup cup) {
System.out.println(cup + "\t" + cup.getResult());
}
}[/CODE]
[CODE lang="java" title="DiceCup"]import java.util.Random;

public class DiceCup {
private static Random rnd = new Random(System.currentTimeMillis());

public enum RESULT {
NONE, FOUR_OF_KIND, FIVE_OF_KIND, THREE_OF_KIND, STREET_SMALL, STREET_BIG, FULLHOUSE
}

private int[] cntResult = new int[5]; // counts resulted eyes of dice
private final int NUM_DICES = cntResult.length;
private RESULT result = RESULT.NONE;
private int cntRoll = NUM_DICES; // counts number of rolled dice

public void checkEyeRange(int eyes) {
if (eyes < 1 || eyes > NUM_DICES)
throw new IllegalArgumentException("Eyes not withing allowed range [1-" + NUM_DICES + "]");
}

public void clear() {
cntRoll = NUM_DICES;
for (int i = 0; i < cntResult.length; i++)
cntResult = 0;
}

public boolean containsEyes(int eyes) throws IllegalAccessError {
checkEyeRange(eyes);
return cntResult[eyes - 1] != 0;
}

public int getEyeValue(int eyes) throws IllegalAccessError {
checkEyeRange(eyes);
return cntResult[eyes - 1] * eyes;
}

private RESULT getNewResult() {
if (hasDiceFactor(5))
return RESULT.FIVE_OF_KIND;
if (hasDiceFactor(4))
return RESULT.FOUR_OF_KIND;
if (hasDiceFactor(3) && hasDiceFactor(2))
return RESULT.FULLHOUSE;
if (hasDiceFactor(3))
return RESULT.THREE_OF_KIND;
if (isConnectedCount(5))
return RESULT.STREET_BIG;
if (isConnectedCount(4))
return RESULT.STREET_SMALL;
return RESULT.NONE;
}

public RESULT getResult() {
return result;
}

private boolean hasDiceFactor(int num) {
for (int i = 0; i < cntResult.length; i++) {
if (cntResult == num)
return true;
}
return false;
}

private boolean isConnectedCount(int num) {
int cnt = 0;
for (int i = 0; i < cntResult.length; i++) {
cnt = (cntResult == 0) ? 0 : cnt + 1;
if (cnt == num)
return true;
}
return false;
}

/**
* Puts a dice back into the cup.
*
* @param eyes
* @throws IllegalAccessError
*/
public void putEyesBack(int eyes) throws IllegalAccessError {
checkEyeRange(eyes);
int id = eyes - 1;
if (cntResult[id] == 0)
throw new IllegalAccessError("Cant' put back non occured eyes result |" + eyes + "|");
if (cntRoll < NUM_DICES) {
cntResult[id]--;
cntRoll++;
}
}

public void rollDice() {
if (cntRoll == 0)
clear();
while (cntRoll > 0) {
cntResult[Math.abs(rnd.nextInt() % NUM_DICES)]++;
cntRoll--;
}
result = getNewResult();
}

@Override
public String toString() {
StringBuffer tmp = new StringBuffer();
for (int i = 0; i < cntResult.length; i++) {
int cnt = cntResult;
while (cnt > 0) {
tmp.append("[" + (i + 1) + "] ");
cnt--;
}
}
return tmp.toString();
}
}[/CODE]
 

berndoa

Top Contributor
Du wirst um mehrere Verkettete if Bedingungen nicht herum kommen.
Wobei du für die Prüfung von pasch und paar etwas intelligent vorgehen kannst, ich hätte es wohl so gelöst:

Java:
if((a==b)||(b==c)||(c==a)){
//mind. ein Paar vorhanden
  if ((a==b)&&(b==c)){
  //Code für Pasch
  //wegen Transitivität muss (a==c) nicht auch mit getestet werden
  }
  else{
  //Code für nur Paar
  }
}
else if {
  //Code um aufsteigende Reihe zu testn
  // am sinnvollsten die zahlen aufsteigend sortieren und dann auf aufsteigende Folge testen
}
else{
  //Code für Nichts
}
 

mihe7

Top Contributor
Naja, Spaghetti-Code... kann man auch so machen:
Java:
public int werteAus(int w1, int w2, int w3) {
    return istPasch(w1, w2, w3) ? w1 * 100
        : istPaar(w1, w2, w3) ? 10 * (w1 == w3 ? w1 : w2)
        : istStrasse(w1, w2, w3) ? 100
        : w1 + w2 + w3;
}

private boolean istPasch(int w1, int w2, int w3) {
    return w1 == w2 && w2 == w3;
}
private boolean istPaar(int w1, int w2, int w3) {
    return w1 == w2 || w2 == w3 || w1 == w3;
}
private boolean istStrasse(int w1, int w2, int w3) {
    if (w1 > w2) { int tmp = w1; w1 = w2; w2 = tmp; }
    if (w1 > w3) { int tmp = w1; w1 = w3; w3 = tmp; }
    if (w2 > w3) { int tmp = w2; w2 = w3; w3 = tmp; }
    return w1+1 == w2 && w2+1 == w3;
}
 

prog6d

Mitglied
Habt vielen, herzlichen Dank für die Beiträge! Die Codebeispiele haben tatsächlich sehr geholfen und wir waren nun in der Lage es zu lösen. Wir haben uns dabei an der Struktur von @mihe7 orientiert, die Auswertung der Straße jedoch mit einem sortierten Array implementiert.

Ich finde leider keine Möglichkeit das Thema als gelöst zu markieren. Sofern die Admins das können, kann das Thema abgehakt werden. ;)

Nochmals vielen Dank! :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Drei zahlen sortieren und in richtiger Reihenfolde ausgeben. Java Basics - Anfänger-Themen 15
S Drei Zahlen sortieren Java Basics - Anfänger-Themen 4
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
milan123 das ist meine aufgabe ich hab das problem das bei mir Wenn ich die Richtung der Linien verändern will und drei davon sind richtig, verändere ich die 4 Java Basics - Anfänger-Themen 3
K Wie String prüfen ob drei mal das gleiche Zeichen vorkommt? Java Basics - Anfänger-Themen 7
C alle möglichen Kombinationen zweier Ziffern auf drei / vier / und 'n" Stellen Java Basics - Anfänger-Themen 11
A Liste aus drei Strings erstellen Java Basics - Anfänger-Themen 5
L Methoden Methode mit drei Rückgabewerten realisieren Java Basics - Anfänger-Themen 3
K drei eindimensionale Arrays in ein zweidimensionales Array Java Basics - Anfänger-Themen 10
H Dreimal die Drei im Array Java Basics - Anfänger-Themen 5
U assertEquals mit drei Parametern? Java Basics - Anfänger-Themen 4
M Was bedeuten die Drei Punkte in einem Methodenkopf? Java Basics - Anfänger-Themen 3
I Drei booleans abfragen Java Basics - Anfänger-Themen 2
N Compiler-Fehler Drei Exceptions in GUIHack für Dreiecke auf MoveButtons Java Basics - Anfänger-Themen 36
M Die drei größten Werte eines Arrays Java Basics - Anfänger-Themen 6
W String von hinten alle drei Zeichen abschneiden und in umgekehrter Reihenfolge ausgeben. Java Basics - Anfänger-Themen 9
P Hintergrundfarbe aus drei Scrollbars Java Basics - Anfänger-Themen 5
J Drei Errors sind drei zuviel! Java Basics - Anfänger-Themen 25
C Mit if Überprüfung von drei Werten durchführen Java Basics - Anfänger-Themen 6
Joy drei- und mehrdimensionales Array deklarieren Java Basics - Anfänger-Themen 9
S drei objekte um 1 Wert erhöhen Java Basics - Anfänger-Themen 15
F Immer nur drei Werte lesen Java Basics - Anfänger-Themen 9
T Probleme bei einen Stack der über drei Dateien funktionieren soll Java Basics - Anfänger-Themen 5
B Problem mit Drei-Gewinnt-Spiel Java Basics - Anfänger-Themen 24
N die ersten drei buchstaben eines Strings ausgeben Java Basics - Anfänger-Themen 2
G 523 in Worten fünf zwei drei Java Basics - Anfänger-Themen 10
onlyxlia Anzahl Random Zahlen mit Scanner abfragen und in Array speichern Java Basics - Anfänger-Themen 10
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
P Aus Text Datei nur Zahlen übernehmen Java Basics - Anfänger-Themen 13
K Warum werden immer noch doppelte Zahlen ausgegeben ? Java Basics - Anfänger-Themen 13
M negative Zahlen bei Intervallen Java Basics - Anfänger-Themen 10
XWing Doppelte Zahlen im Array Java Basics - Anfänger-Themen 8
M 3 Zahlen miteinander vergleichen Java Basics - Anfänger-Themen 18
J Taschenrechner mit mehr als 2 Zahlen. Java Basics - Anfänger-Themen 18
O Zahlen aus einem char-array per char + Zeichen addieren Java Basics - Anfänger-Themen 2
B Alle Zahlen finden, die 3 bestimmte Ziffern enthalten? Java Basics - Anfänger-Themen 9
K Java gleicher Wert von Zahlen? Java Basics - Anfänger-Themen 5
I aus 2 random zahlen soll nur die ungerade summe der beiden genommen werden. Java Basics - Anfänger-Themen 13
J Operatoren Zahlen addieren Java Basics - Anfänger-Themen 13
B Threads Counter mit ungeraden Zahlen Java Basics - Anfänger-Themen 32
JavaBeginner22 Java 2 Zufalls zahlen generieren. Java Basics - Anfänger-Themen 11
X Wie kann man ein Regex erstellen, die 8-Bit-Binär-Zahlen darstellen. Java Basics - Anfänger-Themen 1
M Stream mit den ersten n natürlichen Zahlen Java Basics - Anfänger-Themen 4
D Größtes Palindrom Produkt aus zwei dreistelligen Zahlen Java Basics - Anfänger-Themen 60
T Methode, die prüft ob in einem Int-Array maximal 2 Zahlen enthalten sind, die größer als ihr Vorgänger sind Java Basics - Anfänger-Themen 5
sserio Befreundete Zahlen Java Basics - Anfänger-Themen 7
AhmadSlack Verzweigungen zahlen multiplizieren Java Basics - Anfänger-Themen 4
padde479 Array Multiplikation der ersten n Zahlen Java Basics - Anfänger-Themen 7
U Lotto-Zahlen App Java Basics - Anfänger-Themen 34
berserkerdq2 Wie würde man einen regulären Ausdruck in Java schreiben, der prüft, dass zwei bestimtme Zahlen nicht nebeneinadner sind? Java Basics - Anfänger-Themen 3
H Arrays: Größten Zahlen Unterschied herausfinden Java Basics - Anfänger-Themen 20
bluetrix Programmieren eines Bots für Zahlen-Brettspiel Java Basics - Anfänger-Themen 9
J Zahlen bis zu einem bestimmten Grenzwert ausgeben Java Basics - Anfänger-Themen 11
00111010101 Objektorientiertes Programmieren mit Vererbung (Zahlen in Array verschwinden) Java Basics - Anfänger-Themen 3
P Zweidimensionales Array als Tabelle mit befüllten Zahlen Java Basics - Anfänger-Themen 10
W Wie ziehe ich von einer bestimmten Zahl, Zahlen ab, bis mein Ergebnis null beträgt? Java Basics - Anfänger-Themen 10
emx-zee Erste Schritte NullPointerException, Array mit zufälligen Zahlen füllen Java Basics - Anfänger-Themen 2
W Bestimmte Zahlen bei Math.random ausschließen? Java Basics - Anfänger-Themen 31
K Erste Schritte "Taschenrechner" zeigt keine Komma Zahlen an. Java Basics - Anfänger-Themen 8
H Häufigkeit von Zahlen ermitteln Java Basics - Anfänger-Themen 23
sashady Zahlen rekursiv zerlegen und Ziffern addieren Java Basics - Anfänger-Themen 38
H Zahlen kürzen Java Basics - Anfänger-Themen 2
ansystin Teilerfremde Zahlen ausgeben + Zahlenausgabe speichern Java Basics - Anfänger-Themen 3
B Häufigkeit einzelner Zahlen in einem Array Java Basics - Anfänger-Themen 6
nevel Programm für die Summer der Zahlen 1- 1ß Java Basics - Anfänger-Themen 12
jhCDtGVjcZGcfzug Fibonacci Zahlen rekursiv und iterativ Java Basics - Anfänger-Themen 21
H Eingegebene Zahlen mit Array ausgeben Java Basics - Anfänger-Themen 18
I 12 Spalten von jeweils 30 Zahlen in Konsole ausgeben Java Basics - Anfänger-Themen 6
R Array mit Unter- und Obergrenze ganze Zahlen dazwischen erscheinen nicht Java Basics - Anfänger-Themen 1
OZAN86 For Schleife von 1-50 die Zahlen werden durch ein Komma getrennt Java Basics - Anfänger-Themen 10
Bademeister007 Operatoren Alle Zahlen einer ArrayList die durch 5 teilbar ist Java Basics - Anfänger-Themen 2
mhmt_03 dafür sorgen, dass im JTextfield nur zahlen eingebbar sind Java Basics - Anfänger-Themen 9
Ianatrix Zahlen von a bis b berechnen Java Basics - Anfänger-Themen 7
P Wie kann ich die Zahlen dieses Arrays dividieren? Java Basics - Anfänger-Themen 2
P Nutzer entscheiden lassen, wie viele Zahlen dieser in ein Array eingeben möchte. Java Basics - Anfänger-Themen 6
T Bestimmte Zahlen ausgeben mit einer whilfe Schleife Java Basics - Anfänger-Themen 21
H Alle Geraden zahlen bis 10 ausgeben Java Basics - Anfänger-Themen 11
java3690 Liste mit zufälligen zahlen füllen Java Basics - Anfänger-Themen 27
macle Rekursive String Methode, Gerade Zahlen rausfiltern Java Basics - Anfänger-Themen 10
M Regex nur Zahlen und Punkt zulassen, Keine Eingabe(Leeres TextFeld) nicht zulassen Java Basics - Anfänger-Themen 6
L Mit Zahlen im String rechnen Java Basics - Anfänger-Themen 19
G Java eingelesene Zahlen Java Basics - Anfänger-Themen 2
D Zahlen werden falsch gekürzt :? Java Basics - Anfänger-Themen 27
H Ungerade Zahlen ausgeben von 1 bis 1000 Java Basics - Anfänger-Themen 8
C Positive und negative Zahlen mit Regex extrahieren Java Basics - Anfänger-Themen 8
N Wörter und Zahlen nach speziellen Wörtern ausgeben Java Basics - Anfänger-Themen 11
F Komplexe Zahlen auf verschiedene Weise addieren Java Basics - Anfänger-Themen 18
L Java Int-Array, Zahlen sortieren Java Basics - Anfänger-Themen 8
B Fibonacci Zahlen dynamische Programmierung Java Basics - Anfänger-Themen 7
V Erste Schritte Taschenrechner mit beliebig vielen Zahlen Java Basics - Anfänger-Themen 5
X Wie kann ich Zahlen in einzelne Zifferne zerlegen? Java Basics - Anfänger-Themen 3
J 10 positive Zahlen eingeben Java Basics - Anfänger-Themen 10
K Rechtsbündige Ausgabe von Zahlen Java Basics - Anfänger-Themen 6
A Wie zwei zahlen in einer Variable speichern? Java Basics - Anfänger-Themen 7
M Zahlen erraten Java Basics - Anfänger-Themen 7
E Zahlen von einem Array mit zahlen von zweitem Array vergleichen Java Basics - Anfänger-Themen 27
S Mit nextGaussian() positive Zahlen erzeugen? Java Basics - Anfänger-Themen 39
D auch negative Zahlen sotieren Java Basics - Anfänger-Themen 18
M Warum berechnet mein Primzahlenprog zu hohe Zahlen nicht? Java Basics - Anfänger-Themen 20
W Bell Zahlen Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben