AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Full House - Wie effizient programmieren?

Ein Thema von t1mm · begonnen am 11. Dez 2016 · letzter Beitrag vom 11. Dez 2016
Antwort Antwort
t1mm

Registriert seit: 11. Dez 2016
1 Beiträge
 
#1

Full House - Wie effizient programmieren?

  Alt 11. Dez 2016, 14:45
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?
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#2

AW: Full House - Wie effizient programmieren?

  Alt 11. Dez 2016, 14:56
Schreibe doch alle Werte in ein Array und gehe dann mit einer For Schleife durch. Dann merkst du dir, wie oft jeder Wert kam.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Full House - Wie effizient programmieren?

  Alt 11. Dez 2016, 16:04
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]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (11. Dez 2016 um 17:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.292 Beiträge
 
Delphi 12 Athens
 
#4

AW: Full House - Wie effizient programmieren?

  Alt 11. Dez 2016, 18:17
Hallöle...
Das ich auf meine alten Tage mein allererstes Programm hervorholen muß... 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. So hat es noch einen Sinn.

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


PS:
Damit es nicht so häßlich wird, habe ich noch mal den Formatter drüberlaufen lassen.
- mit with sollte man nicht mehr machen
- keine vernüftigen Komponentenbezeichnungen
... also seit nett.
Angehängte Dateien
Dateityp: zip Jazzy.zip (93,2 KB, 16x aufgerufen)

Geändert von haentschman (11. Dez 2016 um 18:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#5

AW: Full House - Wie effizient programmieren?

  Alt 11. Dez 2016, 18:52
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
Der Trick mit dem Einteilen der Würfelwerte in Kategorien (zweier, dreier, ...) klappt trotzdem. Sortieren macht bestimmt auch vieles leichter.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.

Geändert von BUG (11. Dez 2016 um 19:19 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:41 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