Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Kniffelspiel: Ermitteln, was geworfen wurde (z.B. Full House), ohne alle Kombinationen abzufragen
D3nNisD3luXe
myCSharp.de - Member



Dabei seit:
Beiträge: 6

Themenstarter:

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

beantworten | zitieren | melden

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 ; )
private Nachricht | Beiträge des Benutzers
Uwe81
myCSharp.de - Member



Dabei seit:
Beiträge: 285
Herkunft: Ludwigshafen

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Schmitzo
myCSharp.de - Member



Dabei seit:
Beiträge: 82
Herkunft: Köln

beantworten | zitieren | melden

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... ;)
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Schmitzo am .
private Nachricht | Beiträge des Benutzers
Lennart
myCSharp.de - Member



Dabei seit:
Beiträge: 429
Herkunft: Bawü

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Lennart,
Zitat
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
private Nachricht | Beiträge des Benutzers
Lennart
myCSharp.de - Member



Dabei seit:
Beiträge: 429
Herkunft: Bawü

beantworten | zitieren | melden

Das muss ich mir nochmal durch den Kopf gehen lassen :D
private Nachricht | Beiträge des Benutzers
F.Z.
myCSharp.de - Member



Dabei seit:
Beiträge: 160

beantworten | zitieren | melden

Hallo,
Zitat von Lennart
Summe bilden und durch die Straßenlänge teilen
entspricht
Zitat von Lennart
mathematischen Mitte der Zahlenfolge


fz
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von F.Z. am .
"We better hurry up and start coding, there are going to be a lot of bugs to fix."
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Lennart
myCSharp.de - Member



Dabei seit:
Beiträge: 429
Herkunft: Bawü

beantworten | zitieren | melden

Zitat von 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.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
D3nNisD3luXe
myCSharp.de - Member



Dabei seit:
Beiträge: 6

Themenstarter:

beantworten | zitieren | melden

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. ;)
private Nachricht | Beiträge des Benutzers
D3nNisD3luXe
myCSharp.de - Member



Dabei seit:
Beiträge: 6

Themenstarter:

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von D3nNisD3luXe am .
private Nachricht | Beiträge des Benutzers
F.Z.
myCSharp.de - Member



Dabei seit:
Beiträge: 160

beantworten | zitieren | melden

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."
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers