Laden...

Kniffelspiel: Ermitteln, was geworfen wurde (z.B. Full House), ohne alle Kombinationen abzufragen

Erstellt von D3nNisD3luXe vor 13 Jahren Letzter Beitrag vor 13 Jahren 8.007 Views
Thema geschlossen
D
D3nNisD3luXe Themenstarter:in
6 Beiträge seit 2010
vor 13 Jahren
Kniffelspiel: Ermitteln, was geworfen wurde (z.B. Full House), ohne alle Kombinationen abzufragen

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 ; )

U
282 Beiträge seit 2008
vor 13 Jahren

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.

S
82 Beiträge seit 2008
vor 13 Jahren

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... 😉

L
416 Beiträge seit 2008
vor 13 Jahren

Auf eine Straße kannst du folgendermaßen prüfen:

  • Auf mehrfache gleiche Werte prüfen, bei einem Zwilling ist noch die kleine Straße möglich, dazu einen der doppelten Werte ignorieren.
  • Würfel nach ihrem Wert sortieren
  • Summe bilden und durch die Straßenlänge teilen
  • Ist das Ergebnis gleich der mathematischen Mitte der Zahlenfolge handelt es sich um eine Straße

Bsp:
1 2 3 4 5 = 15 / 5 = 3

1 2 3 4 = 10 / 4 = 2,5

49.485 Beiträge seit 2005
vor 13 Jahren

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

L
416 Beiträge seit 2008
vor 13 Jahren

Das muss ich mir nochmal durch den Kopf gehen lassen 😄

F
155 Beiträge seit 2009
vor 13 Jahren

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."

49.485 Beiträge seit 2005
vor 13 Jahren

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

L
416 Beiträge seit 2008
vor 13 Jahren

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.

49.485 Beiträge seit 2005
vor 13 Jahren

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

D
D3nNisD3luXe Themenstarter:in
6 Beiträge seit 2010
vor 13 Jahren

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. 😉

D
D3nNisD3luXe Themenstarter:in
6 Beiträge seit 2010
vor 13 Jahren

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.

F
155 Beiträge seit 2009
vor 13 Jahren

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."

49.485 Beiträge seit 2005
vor 13 Jahren

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

Thema geschlossen