Zitat von
.chicken:
Also ich weiss nich ganz wie ich das nun alles Umsetzung soll mit dem Setzen und so...also die Runden zu "organisieren". Wer is wann dran und so...
Dachte vielleicht an vier Phasen pro Runde, also vor dem Flop, vor dem Turn, vor dem River und nach dem River!
Hat vielleicht er n paar Denkanstöße wie ich das gut umsetzen kann??
Hi,
woran genau hängst Du denn gerade? An sich klingt das doch schon gut! Allerdings glaube ich musst Du noch das Setzen der Blinds berücksichtigen (glaube mich zu erinnern, dass Du mit Blinds spielst?). Jedenfalls müssen erst die Blinds gesetzt werden, bevor es überhaupt Karten gibt, dann erst folgt die Phase vor dem Flop.
Wie gesagt, an sich ist die Idee aber
imho ganz gut. Was Du Dir noch überlegen solltest ist, was die Phasen gemeinsam haben und was sie wirklich unterscheidet. Das meiste erfolgt schließlich nach dem gleichen Prinzip, es gibt eine festgelegte Reihenfolge, jeder hat ein paar Optionen (hängen teilweise vom Vorgänger ab), z.B. ein Call, ein Bet/Raise, ein Pass, ... Zudem kann jeder immer wenn gesetzt wurde weiter erhöhen (abgesehen von Limits), jeder hat aber nur max. einmal die Chance darauf als erstes zu erhöhen (hoffe ist grob klar was ich meine, zeigt der erste in der Runde ein Check an und checken alle anderen, dann kann der erste nicht mehr in der gleichen Runde erhöhen, erhöht aber der zweite, so kann der erste noch ein reraise ansetzen, sobald er callen müsste um drin zu bleiben).
Hier gilt es also, dass Du Dir die Regeln überlegst und das erstmal so einfach wie möglich (ohne Programmierung, nur verbal überlegen!). Wenn Dir klar ist, was Du gerade umsetzen möchtest, dann ist es sehr viel leichter das zu programmieren als einfach mal los zu legen und dann mal zu schauen.
Für diesen Fall denke ich, dass das Setzen immer nach einem festen Prinzip abläuft. Dazu muss nur die Reihenfolge der Leute festgelegt werden, wer erster war und wer gerade dran ist, sowie die Höhe des aktuellen Einsatzes (in einer Runde in der keiner setzt null, zu Beginn der Big-Blind, ...).
Aufgrund der Differenz von aktuellem Einsatz und dem, was ein Spieler bereits gesetzt hat, kannst Du die Optionen auswählen. So ist ein Check natürlich nur möglich, wenn man den aktuellen Einsatz schon gebracht hat (z.B. weil man den Big-Blind setzen musste), ein Raise nur wenn der aktuelle Einsatz kleiner als ein bestimmtes Limit (wenn vorhanden) und natürlich auch nur, wenn man selbst nicht schon für ein Call all-in ist.
Eine Runde besteht also wieder aus mehr als einem Problem. Du musst schaun, was für eine Runde gerade gespielt wird. Je nachdem müssen nur zwei Spieler die Blinds setzen (da gibt es keine anderen Optionen) oder es läuft ein "normales" Setzen ab. Auch das Ende einer Runde läuft unterschiedlich ab. Nach dem ersten bekommt jeder Spieler zwei Karten (wenn ich Flop, River und Turn richtig deute soll es ein Texas-Hold'em werden?), nach der nächsten Runde gibt es den Flop, nach den zwei folgenden Runden gibt es je eine Karte und zu guter Letzt keine mehr (dafür folgt ggf. das Aufdecken).
Auch das Geben von Karten ist dabei auch ein Problem, dass sich in mehrere Teile gliedern lässt. So ist einer der Schritte das Mischen der Karten (vor Beginn eines Spiels). Ein anderes Problem ist dann das abheben von Karten (die dann aufgedeckt oder gegeben werden). Das ganze kannst Du z.B. in einer Klasse Kartenstapel kapseln. Die Eigenschaften eines solchen Stapels sind dann ebenhalt, dass Du ihn erzeugen, mischen und Karten von oben (/unten) entnehmen kannst. Natürlich musst Du nicht wirklich etwas entnehmen oder ihn echt mischen, das sind nur die Eigenschaften, die er nach außen anbieten muss.
So kannst Du auch ein festes Array erstellen, in dem die Karten immer an der gleichen Stelle stecken. Beim entnehmen greifst Du dann einfach auf eine Zufallszahl zurück und entnimmst die Karte indem Du Dir das im Array merkst (sonst wären auch 4 Herz-Asse möglich).
Genauso kannst Du auf eine Liste zurückgreifen, die Du füllst, aus der Du ebenfalls per Zufall ein Element entnimmst (hier echt entnimmst) und die Zufallszahl eben den aktuellen Füllstand der Liste berücksichtigt (dort kann dann keine Karte doppelt entnommen werden).
Natürlich kannst Du aber auch ein Array echt mischen und von oben/unten abheben!
Ja, was noch ein wenig fehlt ist die "Spielsteuerung". Damit meine ich den Teil, der alles zusammen bringt. Diese sollte dann z.B. beim Start einer Runde die zwei Spieler auffordern die Blinds zu setzen. Danach greift sie einfach auf den Kartenstapel zurück, mischt ihn (soweit nötig) und entnimmt hier Karten und teilt diese aus.
Nach dem Austeilen weiß die Spielsteuerung, wer gerade dran ist und was gesetzt wurde (der Big-Blind) und kann auf das Setzen zurückgreifen. Das Setzen ist wie gesagt ein eigenes Problem, dass Du unabhängig davon lösen kannst. Hier musst Du nur wissen, wann das setzen beendet ist. Ist dies der Fall, ändert die Spielsteuerung den Modus, verwendet den Kartenstapel um den Flop zu ziehen und startet ein neues Setzen (mit Startwert 0 und dem dann Ersten), usw.
Ich denke das Prinzip sollte klar sein. Das was ich vorgeschlagen habe ist keineswegs der einzigste, beste oder schönste Weg, sondern nur ein möglicher. Es sollte auch nur nochmal gezeigt werden, dass Du hier mit möglichst einfachen Problemen arbeiten solltest, die Du alle einfach löst und dann zusammensetzt.
Dabei kannst Du auch eine andere Partionierung der Probleme in Teilprobleme wählen und diese natürlich auch noch weiter zerlegen!
Gruß Der Unwissende