Java Erkennungsalgorithmus für Straßen in Kniffel
Hallo Community,
ich programmiere gerade das Würfelspiel "Kniffel" oder auch "Yahtzee" in Java nach. Um Punkte in den Zettel (JTable) einzutragen, muss das Programm erst erkennen, dass die gewürfelten Augen das gewünschte Objekt (Dreierpasch, Kniffel, Full House, ...) bilden, und dann die Punktzahl berechnen. Das ist mit bei allen Figuren gelungen, außer bei der kleinen und großen Straße.
Das hier ist der Algorithmus, der die Straßen erkennen können soll:
public boolean isStreet(int amount, Dice dice1, Dice dice2, Dice dice3,
Dice dice4, Dice dice5) {
int count = 1;
int lastValue = dice1.calcvalue;
int[] diceValues = new int[] { dice2.calcvalue, dice3.calcvalue,
dice4.calcvalue, dice5.calcvalue };
for (int i : diceValues) {
if (i == (lastValue + 1))
count++;
else
count = 1;
if (count >= amount)
return true;
}
return false;
}
Zum Code:
der int "amount" ist die Zahl der Würfel in einer Reihe. Bei einer kleinen Straße also 4 und bei einer großen 5.
dice1.calcvalue, dice2.calcvalue, ... sind die Würfelwerte in aufsteigender Reihenfolge.
Ist also dice1.value=4, dice2.value=2, dice3.value=5, dice4.value=5 und dice5.value=4, dann ist dice1.calcvalue=2, dice2.calcvalue=4, dice3.calcvalue=4, dice4.calcvalue=5 und dice5.calcvalue=5.
In der if.Bedingung ganz unten, wo das return true; druntersteht, hat GF aus dem >-Zeichen irgendwie dieses >-Zeug gemacht. Ein > kann man wohl nicht in ein GF-Codebeispiel schreiben.
Das Problem: Mein Programm liefert sowohl bei amount = 4 (kl. Str.) als auch amount = 5 (gr. Str.) ein false. Das Feld ist nicht mehr editierbar, aber die Punktzahl = 0. Kommt also einem "Streichen" gleich. Wo liegt der Fehler und wie muss der Algorithmus richtig lauten?
Sorry wegen des langen Textes und Danke an alle Coder die es besser können. ;)
2 Antworten
Deine lastValue Variable wird in der Schleife nie aktualisiert. Somit wird immer nur gegen den niedrigsten (ersten) Wert überprüft.
hab jetzt noch ein bisschen rumprobiert und nun funktioniert es doch! danke
Ich hätte die Würfel in ne Liste gepackt, die Liste sortiert und geprüft, ob jeder Nachbarswürfel die Augenzahl+1 hat. Allerding bekommst du so nicht raus, ob es ne große oder kleine Straße ist. Dazu musst es zweimal durchlaufen lassen, oder Flags setzen.
Ich hab doch oben erläutert dass die ".calcvalues" die Würfelwerte in aufsteigender Reihenfolge sind??
Typischer Fall von nicht alles gelesen ...
O...k? oO Ich muss ehrlich sagen, dass dich den vierzeiligen Part mit "diceX.value=2" übersprungen habe.. Sprich, du hast einen Algorhytmus, der zB Dice 1 den Wert 2 gibt, obwohl dieser Würfel eigentlich ne 5 würfelte? Hört sich gefährlich an. Aber wenns klappt ist ja gut. Wie gesagt, meine Antwort steht ja im Kommentar zur anderen Antwort ;)
Ja das funktioniert prächtig. Schon mit System.out´s ausgiebig getestet. Auch der Kumpel, der den Algo geschrieben hat, war skeptisch, aber es funktioniert ja problemlos. :)
Das heißt, was soll ich schreiben? Muss dazu sagen dass der Algo den man hier sieht komplett von nem Kumpel kommt, der jetzt aber wegen Urlaub nicht erreichbar ist.