Hallo,
Ich bin gerade dabei ein Kniffelspiel zu programmieren. Ich habe nun folgendes Problem. Ich möchte jetzt gerne dass, das Programm prüft, wenn man z.B. auf Full House klickt, ob man auch wirklich ein Full House hat ohne das man jede einzelne Variation eines Full House's abfragen muss.
Das gleiche dann auch für Drilling Straße usw.
Kniffel hab ich schon gelöst ; )
Du musst zwar nicht alle Varianten prüfen, aber schon die Strukturen.
Full House: Du musst eben schauen, ob eine Zahl zwei mal und eine (andere?) drei mal vorkommt. Aber nicht einzeln ob das 11122 oder 11333 oder 11444 ist.
Hallo D3nNisD3luXe,
du wirst für einen Drilling nicht drumrum kommen, zu prüfen, ob drei Würfel gleich sind...
Für ein Fullhouse kannst du aber abstrahieren in der Form:
if(Drilliling AND "Restwürfel" == Zwilling)
Fullhouse
else
!Fullhouse
Damit kannst du auch andere Dinge bauen, wie
if (Zwilling AND "Restwürfel" == Zwilling AND Zwilling1.Points == Zwilling2.Points)
Vierling
else
!Vierling
Grüße
Schmitzo
P.S.: Nur mal schnell so im Pseudocode angerissen, wie du es umsetzen kannst... Damit ist auch umgesetzt, dass ein Kniffel auch ein FullHouse ist... 😉
Auf eine Straße kannst du folgendermaßen prüfen:
Bsp:
1 2 3 4 5 = 15 / 5 = 3
1 2 3 4 = 10 / 4 = 2,5
Hallo Lennart,
Ist das Ergebnis gleich der mathematischen Mitte der Zahlenfolge handelt es sich um eine Straße
nach deinem Algorithmus ist allerdings auch 1 3 4 6 = 14 / 4 = 3,5 fälschlich eine Straße.
herbivore
Das muss ich mir nochmal durch den Kopf gehen lassen 😄
Hallo,
Summe bilden und durch die Straßenlänge teilen
entspricht
mathematischen Mitte der Zahlenfolge
fz
"We better hurry up and start coding, there are going to be a lot of bugs to fix."
Hallo D3nNisD3luXe,
wenn du aus einem dice-Array der Länge 5, das die geworfenen Werte (minus 1, also Werte zwischen 0 und 5) enthält, ein diceCount-Array der Länge 6 machst, das in jedem Element die Anzahl der Würfel mit diesem Wert als Index enthält, geht alles folgende leichter von der Hand. Außerdem kann man in der Schleife für die Umwandlung gleich die Gesamtaugenzahl ermitteln.
Wenn man aus
int [] dice = new int [5];
for (int i = 0; i < dice.Length; ++i) {
dice [i] = rand.Next (6);
}
folgendes berechnet
int [] diceCounts = new int [6];
int sumOfAllDice = 0;
for (int i = 0; i < dice.Length; ++i) {
++diceCounts [dice [i]];
sumOfAllDice += dice [i] + 1;
}
kann man in einer anschließenden Schleife
for (int i = 0; i < diceCounts.Length; ++i) {
...
}
alles was man braucht sehr leicht berechnen.
herbivore
nach deinem Algorithmus ist allerdings auch 1 3 4 6 = 14 / 4 = 3,5 fälschlich eine Straße.
-> Differenz zwischen pot. Straßenanfang und Ende darf nicht größer als Straßenlänge sein.
Hallo zusammen,
ich habe mir mal erlaubt, aus dem Problem in diesem Thread eine Aufgabe für das Programmier-Spiel zu machen, die korrekt gelöst wurde. Entsprechend finden sich jetzt zwei Lösung des Problems in dem verlinkten Thread.
herbivore
Danke an alle schon mal für die hilfreichen Antworten .
Ich werde mir das alles mal durch den Kopf gehen lassen und dann gucken wie am besten zu der Lösung kommen. 😉
Also irgendwie hab ich schon Probleme mit dem Drilling.
Ich wollte das jetzt wie folgt lösen
private void button8_Click(object sender, EventArgs e)
{
//1er drilling
if (ah == 1)
{
drilling++;
}
if (bh == 1)
{
drilling++;
}
if (ch == 1)
{
drilling++;
}
if (dh == 1)
{
drilling++;
}
if (fh == 1)
{
drilling++;
}
if (drilling >= 3)
{
drilling = 3;
ausgabedrilling = Convert.ToString(drilling);
textBox1.Text = ausgabedrilling;
}
else
{
drilling = 0;
}
//2er drilling
if (ah == 2)
{
drilling++;
}
if (bh == 2)
{
drilling++;
}
if (ch == 2)
{
drilling++;
}
if (dh == 2)
{
drilling++;
}
if (fh == 2)
{
drilling++;
}
if (drilling >= 3)
{
drilling = 6;
ausgabedrilling = Convert.ToString(drilling);
textBox1.Text = ausgabedrilling;
}
else
{
drilling = 0;
}
//3er
if (ah == 3)
{
drilling++;
}
if (bh == 3)
{
drilling++;
}
if (ch == 3)
{
drilling++;
}
if (dh == 3)
{
drilling++;
}
if (fh == 3)
{
drilling++;
}
if (drilling >= 3)
{
drilling = 9;
ausgabedrilling = Convert.ToString(drilling);
textBox1.Text = ausgabedrilling;
}
else
{
drilling = 0;
}
//4er
if (ah == 4)
{
drilling++;
}
if (bh == 4)
{
drilling++;
}
if (ch == 4)
{
drilling++;
}
if (dh == 4)
{
drilling++;
}
if (fh == 4)
{
drilling++;
}
if (drilling >= 3)
{
drilling = 12;
ausgabedrilling = Convert.ToString(drilling);
textBox1.Text = ausgabedrilling;
}
else
{
drilling = 0;
}
//5
if (ah == 5)
{
drilling++;
}
if (bh == 5)
{
drilling++;
}
if (ch == 5)
{
drilling++;
}
if (dh == 5)
{
drilling++;
}
if (fh == 5)
{
drilling++;
}
if (drilling >= 3)
{
drilling = 15;
ausgabedrilling = Convert.ToString(drilling);
textBox1.Text = ausgabedrilling;
}
else
{
drilling = 0;
}
if (ah == 6)
{
drilling++;
}
if (bh == 6)
{
drilling++;
}
if (ch == 6)
{
drilling++;
}
if (dh == 6)
{
drilling++;
}
if (fh == 6)
{
drilling++;
}
if (drilling >= 3)
{
drilling = 18;
ausgabedrilling = Convert.ToString(drilling);
textBox1.Text = ausgabedrilling;
}
else
{
drilling = 0;
}
}
Eigendlich müsste das Programm das ja von oben nach unten ab arbeiten , denk ich mal . Aber irgendwie gibt die Textbox bei jeden Drilling 18 aus : /
Normalerweise würde ich ja mein Lehrer fragen aber wir haben Ferien ...
EDIT: Ach ja. ah ist halt der 1 Würfel , bh der 2. usw.
Hallo,
wie du schon sagst läuft das Programm von oben nach unten ab, aber du hast für jede Drilling Möglichkeit die selbe Prüfung, ohne die Variable Drilling wieder rückzusetzen.
Nehmen wir an du hast einen 1er Drilling:
if(ah - fh ==1) //für alle 1er
{
drilling++
}
if (drilling >= 3) // ist wahr da es sich um einen 1er drilling handelt (d.h. drilling >=3)
{
....
}
if(ah - fh ==2)//für alle 2er
{
drilling++
}
if (drilling >= 3) //hier ist aber drilling immer noch >= 3 auch wenn es sich nicht um einen 2er drilling handelt, da drilling nicht auf 0 gesetzt wurde
{
....
}
.....
if(ah - fh ==6)
{
drilling++
}
if (drilling >= 3)
{
ausgabe = 18;//deshalb wird immer wenn ein Drilling vorhanden ist 18 angezeigt
}
mit dem Debugger hättest du das aber selbst leicht herausgefunden.
Anstatt eine Prüfung für alle Zahlen (1-6) könntest du auch eine Schleife verwenden.
fz
"We better hurry up and start coding, there are going to be a lot of bugs to fix."
Hallo D3nNisD3luXe,
grundsätzlich ist es gut, dass du dich an einer eigenen Lösung versuchst, aber du hattest ja extra gefragt, wie du es schaffst, ohne alle Kombinationen abzufragen und darauf entsprechende Antworten bekommen. Wenn du die dann nicht berücksichtigst, macht es aber wenig Sinn das du gefragt hast. Außerdem gibt es zwei fertige Lösungen, wo du zumindest mal schmulen kannst, wie der Ansatz, ohne alle Kombinationen abzufragen, aussehen kann.
Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1.1.
herbivore