AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Pokerprojekt realisierung
Thema durchsuchen
Ansicht
Themen-Optionen

Pokerprojekt realisierung

Ein Thema von .chicken · begonnen am 28. Mär 2007 · letzter Beitrag vom 15. Mai 2007
Antwort Antwort
Seite 2 von 7     12 34     Letzte »    
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#11

Re: Pokerprojekt realisierung

  Alt 31. Mär 2007, 16:05
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!
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#12

Re: Pokerprojekt realisierung

  Alt 31. Mär 2007, 17:11
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
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#13

Re: Pokerprojekt realisierung

  Alt 31. Mär 2007, 19:11
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*
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#14

Re: Pokerprojekt realisierung

  Alt 2. Apr 2007, 10:45
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?
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#15

Re: Pokerprojekt realisierung

  Alt 2. Apr 2007, 11:01
Zitat von .chicken:
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?
Na ja, eine Klasse instanziierst Du mit dem Create. Möchtest Du zur Laufzeit eine neue Instanz eine TServer (eine von Dir geschriebene Klasse), dann erstellst Du den durch:
Delphi-Quellcode:
var server: TServer;
begin
  server := TServer.Create(...);
  ...
end;
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).
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
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#16

Re: Pokerprojekt realisierung

  Alt 2. Apr 2007, 11:09
aso...stimmt
danke
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#17

Re: Pokerprojekt realisierung

  Alt 3. Apr 2007, 13:08
Ok, jetzt habe ich dazu aber nochmal ne Frage
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 ^^
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#18

Re: Pokerprojekt realisierung

  Alt 3. Apr 2007, 14:09
Zitat von .chicken:
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 ^^
Dazu musst Du Dir kurz klar machen wie ein Server arbeitet. Ein Server funktioniert eigentlich ganz einfach, Du startest ihn und er lauscht auf einem gewissen Kanal (hier durch IP und Port geg.). Kommt jetzt ein Klient, der was möchte, dann setzt der eine Anfrage auf diesem Kanal ab. Entspricht die Anfrage dem Protokoll, wird der Server natürlich antworten und Du hast Kommunikation.
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.
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#19

Re: Pokerprojekt realisierung

  Alt 3. Apr 2007, 14:17
Ok...versuch ich ma hinzukriegen aber im Moment hab ich eh keine kreative Phase
Dankeschön
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#20

Re: Pokerprojekt realisierung

  Alt 3. Apr 2007, 15:51
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!?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 7     12 34     Letzte »    


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 09:34 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