![]() |
Re: Pokerprojekt realisierung
Boah jetzt hab ich grade extreme Probleme in der Umsetzung...
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?? Wär sau nett, danke! |
Re: Pokerprojekt realisierung
Zitat:
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 |
Re: Pokerprojekt realisierung
Ok, super für deine ausfürliche Antwort! Also ja, wird Texas Hold'em NoLimit!
Ja also die Sache mit dem Mischen und so hab ich ja schon alles, das stellt nicht mein Problem dar, sondern eher dieses rundenbasierte Setzen und alles aber ich versuch das nun mal umzusetzen! Werde die Blinds zB anfangs einfach automatisch setzen lassen, das vereinfacht die Sache und ich kann es hinterher ja immernoch ändern! Du bist echt ne große Hilfe!!! *Thumbs up* |
Re: Pokerprojekt realisierung
Also bin jetzt schon echt weiter gekommen.
Jetzt weiss ich nur nicht, wie ich den Server und Client zur Laufzeit erstellen soll? Also wollt dazu ja uach ne eigene Klasse machen, und dann die Indy-Komponenten verwenden! Wie erstell ich den jetzt zur Laufzeit? |
Re: Pokerprojekt realisierung
Zitat:
Delphi-Quellcode:
Was genau passiert, wenn ein solches Objekt erstellt wird, legt dann eben der Konstruktor Create fest. Wie man einen erzeugt wurde ja schon in einem anderen Thread behandelt (wenn ich mich richtig erinnere, sorry, link gerade nicht parat).
var server: TServer;
begin server := TServer.Create(...); ... end; Jedenfalls musst Du in diesem Konstruktor dann einfach die Initialisierung vornehmen. Diese kann dann z.B. darin bestehen, dass Du eine TIdTcpServer-Instanz erzeugst (ebenfalls durch Aufruf von Create) und diese in einer privaten Instanz-Variablen von TServer speicherst (von außen muss ja niemand sehen, dass TServer einen Indy-TCP-Server verwendet). Gruß Der Unwissende |
Re: Pokerprojekt realisierung
aso...stimmt ;-)
danke |
Re: Pokerprojekt realisierung
Ok, jetzt habe ich dazu aber nochmal ne Frage :D
Also wenn jetzt einer einen Server erstellt (dh er klickt zB auf Neues Spiel), wie mach ich das dann? Ruf ich dann als externes Programm den Server auf oder wie? Da Blick ich grad net ganz durch ^^ |
Re: Pokerprojekt realisierung
Zitat:
Die Funktionalität des Servers packst Du nun in eine eigene Klasse und gut ist. Was Du dann hast ist die Funktionalität in einer Klasse, mehr nicht. Das heißt, dass so noch kein Server läuft. Möchte jmd. ein neues (Netzwerk-)Spiel erstellen, so musst Du erst eine Instanz der Klasse erstellen und ggf. zusätzlich noch den Server aktivieren (erst dann lauscht der wirklich auf dem Kanal). Sehr direkt zu Deiner Frage, es macht hier mehr Sinn, dass Dein Programm gleichzeitig als Client und Server agieren kann. Ein Server kann aktiv oder inaktiv sein. Solange der Server inaktiv ist, ist der Kanal nicht belegt und keiner beantwortet Anfragen, die dort abgesetzt werden. Erst wenn Du denn aktivierst wird er Anfragen entgegen nehmen. Ähnlich sieht es mit der Clientfunktion aus, erst wenn Du ihm sagst, dass er sich mit einem bestimmten Server verbinden soll, wird der eine Nachricht abschicken. Deswegen kannst Du Beides ohne Probleme ins gleiche Programm packen und auf die entsprechende Funktionalität dort zurückgreifen, wo Du sie wirklich brauchst. |
Re: Pokerprojekt realisierung
Ok...versuch ich ma hinzukriegen aber im Moment hab ich eh keine kreative Phase :D
Dankeschön |
Re: Pokerprojekt realisierung
Ok, Fragen über Fragen und hier is schon wieder eine ;-)
Also wie schreibe ich ein Event für meinen Server, wenn ich ihn zur Laufzeit erstelle? Hab hier im Forum ganz viel zu TMyNotifyEvent gefunden aber daraus bin ich echt nicht schlau geworden! Also ich möchte das OnClientRead-Event definieren, aber ich weiss nicht wie ich das machen soll!? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz