Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Full House - Wie effizient programmieren? (https://www.delphipraxis.net/191123-full-house-wie-effizient-programmieren.html)

t1mm 11. Dez 2016 14:45

Full House - Wie effizient programmieren?
 
Hallo,

beim Herumspielen mit Delphi kam mir die Idee, das Würfelspiel Kniffel zu programmieren. Man muss dazu sagen, dass ich sicherlich kein Experte bin, dieses Programm zu erstellen gelingt mir jedoch bis jetzt recht gut.

Auf Knopfdruck werden 5 Zufallszahlen erstellt.
Code:
z1 := random(6)+1;
Wenn der Spieler sich nun entscheidet, dass er gerne die Einser eintragen lassen möchte, geschieht das mit einem weiteren Button.
Code:
var
  einser1 : integer;
begin
einser1 := 0;
if z1 = 1 then
  einser1 := einser1 + 1;
if z2 = 1 then
  einser1 := einser1 + 1;
if z3 = 1 then
  einser1 := einser1 + 1;
if z4 = 1 then
  einser1 := einser1 + 1;
if z5 = 1 then
  einser1 := einser1 + 1;
Button3.Caption := inttostr(einser1);
Nun stehe ich aber vor dem Problem, dass das Programm einen Full House (also drei gleiche Zahlen sowie zwei gleiche, andere Zahlen) erkennen soll. Natürlich kann ich mich mit if durch jede Kombination durchfragen, dies ist aber sehr mühselig, ineffizient und unübersichtlich.
Code:
if (z1 = 1) and (z2 = 1) and (z3 = 1) and (z4 = 2) and (z5 = 2) then begin
[...]
if (z1 = 1) and (z2 = 1) and (z3 = 1) and (z4 = 3) and (z5 = 3) then begin
Hat ein schlauer Mensch eine Idee, wie ich das einfacher und ohne so viel Schreibarbeit lösen kann?

zeras 11. Dez 2016 14:56

AW: Full House - Wie effizient programmieren?
 
Schreibe doch alle Werte in ein Array und gehe dann mit einer For Schleife durch. Dann merkst du dir, wie oft jeder Wert kam.

DeddyH 11. Dez 2016 16:04

AW: Full House - Wie effizient programmieren?
 
So habe ich das damals in meiner Version auch gemacht. Da habe ich mir ein Byte-Array der Länge 6 (für die Würfelseiten) erstellt und mit Nullen gefüllt. Anschließend bin ich meine 5 Würfel in einer Schleife durchlaufen und habe den Array-Werte an Index Punktzahl des aktuellen Würfels um 1 erhöht. Für die weiteren Auswertungen musste dann nur noch das Punkte-Array analysiert werden (im Fall Full House bedeutet dies: es dürfen im Array nur die Werte 0, 2 und 3 vorkommen).

[edit] Nach nochmaligem Durchlesen bin ich zu dem Schluss gekommen, dass das vielleicht etwas schwer zu verstehen ist, daher eine anschaulichere Erläuterung:
Stellen wir uns das genannte Array einfach als 6 Kartons vor, die von mit Zahlen von 1 bis 6 beschriftet sind. Am Anfang leeren wir alle Kartons, dann würfeln wir. Jeden Würfel legen wir nun in den Karton, dessen Beschriftung dem Würfelwert entspricht. Haben wir also z.B. die Folge 2, 3, 3, 5, 6 gewürfelt, so enthalten anschließend die Kartons 2, 5, und 6 je 1 Würfel, der Karton 3 2 Würfel, die übrigen Kartons (also 1 und 4) sind leer. Mit diesen Kartons können wir nun alle möglichen Punktzahlen errechnen, die Punktzahlen der einzelnen Würfel interessieren uns hier nicht mehr. Will der Spieler also das "3er"-Feld ausfüllen, ergibt sich die Punktzahl aus Kartonbeschriftung (also 3) multipliziert mit Inhalt (im Beispielwurf 2, das Ergebnis beträgt dann also 6). Für ein Full House muss ein Karton 2 und einer 3 Würfel enthalten, für eine kleine Straße müssen 4 aufeinanderfolgende Kartons befüllt sein, etc. [/edit]

haentschman 11. Dez 2016 18:17

AW: Full House - Wie effizient programmieren?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallöle...:P
Das ich auf meine alten Tage mein allererstes Programm hervorholen muß... :P Zu Friedenszeiten im Osten habe ich das Programm auf einem IBM (KSchießMichTot) Ersatz gesehen. Da mit Sicherheit keine Lizengebühren abgedrückt wurden hieß es damals JAZZY. Das habe ich als Übung, ich weiß nicht wieviele Wochen das gedauert hat, programmiert. :P So hat es noch einen Sinn.

@TE: Für die Berechnung gibt es mehrere Varianten. Wichtig ist das du sie verstehst. :thumb:


PS:
Damit es nicht so häßlich wird, habe ich noch mal den Formatter drüberlaufen lassen. :thumb:
- mit with sollte man nicht mehr machen
- keine vernüftigen Komponentenbezeichnungen
... also seit nett. :P

BUG 11. Dez 2016 18:52

AW: Full House - Wie effizient programmieren?
 
So würde ich vorgehen:
  • Sortiere die Karten nach Wert. Das erleichtert praktisch viele der Erkennungen.
  • Trenne die Werte in Einzelkarten, Zwillinge, Drillinge und Vierlinge. Behalte sortiere die Kategorien nach Größe.
  • Überprüfe auf Flush.
  • Überprüfe auf Straße.
  • Gehe die Kombinationen von der höchsten durch, und breche ab wenn du eine gefunden halt.

Also etwa so:
  1. if karten.istFlush() und karten.istStraße() und karten.höchsteKarte().wert() = ASS then return ROYAL_FLUSH;
  2. if karten.istFlush() und karten.istStraße() then return STRAIGHT_FLUSH;
  3. if karten.hatVierling() then return FOUR_OF_A_KIND;
  4. if karten.hatZwilling() und karten.hatDrilling() then return FULL_HOUSE;
  5. if karten.istFlush() then return FLUSH;
  6. if karten.istStraße() then return STREET;
  7. ...

Die Zwischenergebnisse kannst du dann auch verwenden, um festzustellen, wer bei Ergebnis gewonnen hat: zum Beispiel das höhere Pärchen.


EDIT: Kniffel! ... wie bin ich denn bei Poker gelandet :roll:
Der Trick mit dem Einteilen der Würfelwerte in Kategorien (zweier, dreier, ...) klappt trotzdem. Sortieren macht bestimmt auch vieles leichter.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz