************************************************** PoKeR ************************************************** Inhalt 0. Rechtliches 1. Einleitung 2. Eine Anleitung zum Spiel 3. Pokerregeln in Global Village BBS 4. Verhalten beim Spiel 5. Interne Funktionsweise und Problematik beim Erstellen des Quelltexts 6. Zahlen und Erwaehnungen Kapitel 0. Rechtliches Wie jede Software, kann auch das Pokerspiel Programmierfehler enthalten, auch wenn es fuer korrekte Funktionsweise programmiert, und mit der hoechsten Sorgfalt getestet wurde. Daher kann Global Village BBS NICHT fuer den Verlust von CUBES verantwortlich gemacht werden, die durch Fehler im Programm verursacht wurden, oder fuer aendere Unannehmlichkeiten, die ein Fehler im Spiel fuer dessen Spieler verursachen koennte. Es gibt keine Moeglichkeit, verlorene CUBES zurueckzuverlangen! Gluecksspiele koennen Abhaengigkeit verursachen. Global Village BBS kann nicht fuer negative Einfluesse auf die Pokerspieler oder Menschen in deren Umgebung verantwortlich gemacht werden. Durch den Eintritt in das Spiel akzeptiert der User vorgenannte Bedingungen, genauso wie die Regeln (Kapitel 3.) und die Verhaltensregeln im Spiel gemaess Kapitel 4. Pokerspieler akzeptieren, dass sie das Spiel auf ihr eigenes Risiko hin verwenden. Verstoesse gegen die Verhaltensregeln im Spiel werden gemaess Kapitel 4 und der BBS Policy geahndet. Dieses Dokument kann Fehler enthalten. Global Village BBS garantiert nicht, dass die hier vermittelte Information korrekt ist, und kann nicht fuer Unannehmlichkeiten verantwortlich gemacht werden, die durch Fehler in diesem Dokument entstanden sind. Kapitel 1. Einleitung Lange Zeit war es das Ziel des Programmierers, ein Pokerspiel fuer oeffent- lichen Gebrauch zu programmieren. Doch die Freizeit war sehr oft nicht ausreichend, und zugegebenermassen waren auch die Programmierfaehigkeiten ueber lange Zeit nicht genuegend, um ein Spiel dieses Massstabs zu pro- grammieren. Doch schlussendlich kam die Programmentwicklung zu einem Ende, und das Resultat kann durch Druecken von <SHIFT>-<S> <2> oder <SHIFT>-<M> <S> <2> vom BBS-Prompt aus betrachtet werden. Poker ist ein Spiel mit Vergangenheit: Zu Beginn entstand es in Europa im 16. Jahrhundert, aber zu dieser Zeit wurde es noch mit drei Karten gespielt. Spaeter, zu Beginn des 18. Jahrhunderts, wurde es bereits standardmaessig mit fuenf Karten gespielt. Im 19. Jahrhundert wurde das Spiel dann nach Amerika gebracht, wo es schon bald seine hoechste Popularitaet erreichte. Seit 1834 wird das Spiel mit dem aus 52 Karten bestehenden Stapel gespielt. Es gibt unzaehlige Varianten zu dem Spiel, mit den grundlegenden Formen von "Draw Poker" und "Stud Poker" (verdeckte bzw. offene Spiele). An jedem Ort, wo man hingeht, wird dieses Spiel in einer anderen Form gespielt, manchmal sogar abhaengig von den Menschen, mit denen man spielt. Fuer die Programmierung dieses Spiels mussten bestimmte Regeln festgelegt und in den Computer eingegeben werden, damit keine Diskussion ueber die Regeln jemals auftreten kann. Sehr oft gibt es eine Regeldiskussion, wenn der Sieger unter Spielern mit demselben Blatt ermittelt werden soll. Das Pokerspiel in Global Village BBS verwendet seitenlange mathematische Vergleichsbedingungen, um den Sieger in diesen Faellen zu ermitteln. Das hier eingebaute Spiel repraesentiert am ehesten die "Europaeische Form von Draw Poker". Die Europaeische Form von Poker definiert sich durch die Tatsache, dass die niedrigen Karten (2er, 3er, 4er) aus dem Stapel genom- men werden, daher kann eine Strasse durch 8-7-6-5-A gebildet werden, indem das As als niederwertige Karte verwendet wird, und dass Flushes hoeher- wertiger sind als Full Houses. Die erste Bedingung wurde programmiert; wir verwenden einen Stapel von 40 Karten, ohne 2er, 3er und 4er, aber die zweite nicht: Full House wird als hoeher angesehen als ein Flush. Es gibt noch einige weitere Ausnahmen, diese koennen in Kapitel 3 nachge- lesen werden. Eine Diskussion ueber die Spielregeln ist nicht erwuenscht. Die Regeln sind klar definiert und in das Programm eingebaut, sodass keine Fragen offen bleiben muessen. Die Regeln wurden unter Zuhilfenahme einer Beschreibung des Pokerspiels aus der Encyclopaedia Britannica, Macropaedia, 15. Ausgabe, Jahr 1974, Band 14, Seiten 623ff, zusammen mit der persoenli- chen Erfahrung des Programmierers, sowie programmtechnischer Erfordernisse, zusammengestellt. Kapitel 2. Eine Anleitung zum Spiel Das Spiel kann aufgerufen werden, wie im ersten Absatz von Kapitel 1 beschrieben. Nach dem Aufruf wird - entweder eine Meldung erscheinen, dass niemand derzeit das Spiel verwendet - oder eine Auflistung der Namen aller Personen erscheinen, die derzeit am Pokertisch sitzen. Wenn die Anzahl von Personen am Pokertisch die Maximalanzahl an Spielern (FUENF) erreicht hat, ist es fuer neue Mitspieler nicht moeglich, sich an den Pokertisch zu setzen. Falls weniger als fuenf Spieler am Tisch sitzen, wird eine ja/nein-Abfrage erscheinen, mit der Frage, ob man sich an den Tisch dazusetzen moechte, oder warten moechte, bis andere User sich ebenfalls dazusetzen (im Fall, dass noch niemand am Tisch sitzt). Allgemein sollte gesagt werden, dass ein einzelner User, der eine Partie Poker spielen moechte, entweder versuchen sollte, sich einer bestehenden Pokerrunde anzuschliessen, oder Mitspieler zu finden (durch X-Messages), BEVOR er das Spiel startet. Nachdem das Spiel gestartet wurde, erscheint der Spielbildschirm. Achtung: Das gesamte Pokerspiel verwendet Terminal-Escape-Sequenzen, um einen besseren Spieleindruck zu erzeugen (und das Spiel als solches ueberhaupt moeglich zu machen). Diese Terminal-Escape-Sequenzen koennen Probleme mit inkompatiblen Terminalprogrammen oder CLients erzeugen! Auf diesen Umstand wird auch in einem Satz hingewiesen, der beim Eintritt ins Casino-Menue angezeigt wird. Wenn bei dir Probleme am Bildschirm auf- treten, dann gibt es nur eine Loesung: Besorge dir ein anderes Terminal- programm oder einen anderen CLient: 95% davon funktionieren korrekt. Hinweis: Wenn dein Terminalprogramm die Bildschirmdarstellung einfriert, sobald du in das Spiel eingetreten bist, kann die Ursache dafuer ebenfalls eine etwaige Inkompatibilitaet sein. --- Der Spielbildschirm: Der Schirm ist in 8 verschiedene Bereiche geteilt. Diese sind in Reihen- folge und Position: (1) Gegner-Bereich [obere linke Ecke] (2) Spielinformationsbereich [obere rechte Ecke] (3) Spielerbereich [mitte links] (4) Kommandobereich [mitte rechts] (5) Statuszeile [unter dem Spieler- und Kommandobereich, eine einzelne Zeile] (6) Messagebereich [untere Haelfte des Bildschirms] (7) Message-Eingabebereich [die letzte Zeile des Bildschirms] (8) X-Message Zaehler [die Zeile zwischen (1) und (3)] Diese Bereiche werden fuer die folgenden Anzeigen verwendet: 2.1. Gegner-Bereich In diesem Bereich werden die Namen von allen Mitspielern angezeigt. Wenn der Mitspieler aktiv ist, z.B. wenn ein Spiel im Gange ist, und der Mitspieler immer noch im Rennen um den Gesamteinsatz dabei ist, zeigt dieser Bereich die Karten des Gegners, versteckt und durch ein "[?]" Zeichen symbolisiert. Wenn das Spiel vorbei ist, und ein Show- down zuvor aufgerufen wurde, wird der Name des Spielers und dessen offenen Karten hier angezeigt. Wenn ein User den Tisch verlaesst, wird sein Eintrag in diesem Bereich des Schirms entfernt, und der Sitz am Pokertisch ist wieder frei. 2.2. Spielinformationsbereich Hier werden vier verschiedene Informationen angezeigt: Erstens, der Name des sogenannten "Master". Dies ist die Person, die der erste Spieler in jeder gespielten Runde ist, und waehrend eines Spiels muss ein Game-Master IMMER ein aktiver Spieler sein. Wenn der gegenwaer- tige Game-Master waehrend eines Spieles passt, wird das Privileg an den naechsten Spieler in der Reihenfolge weitergegeben. Andere Bedingungen fuer die Weitergabe dieses Privilegs sind: - Der Game-Master wird nach jedem beendeten Spiel weitergegeben - Ein Timeout von drei Minuten ist aktiv, wenn kein Spiel im Gange ist und der Game-Master kein neues gestartet hat. Das Privileg wird nach Ablauf dieser drei Minuten an den naechsten Spieler weitergegeben. Aufgrund der Art und Weise der "Weitergabe" ist es moeglich, dass eine Person der Game-Master von zwei aufeinanderfolgenden Spielen ist, z.B. wenn er waehrend des Spiels passt, dann wird das Privileg weitergegeben, und nach dem Spiel wieder an ihn zurueckgegeben (immer unter der Bedin- gung, dass keine neuen Mitspieler sich in der Zwischenzeit an den Tisch gesetzt haben). Der Game-Master ist die einzige Person, die ein neues Spiel starten darf! Zweitens kann der Name des Spielers, der gegenwaertig am Zug ist, in diesem Bereich des Bildschirms gesehen werden. Wenn kein Spiel im Gange ist, zeigt diese Zeile den Text "KEIN SPIEL" an. Drittens wird die Summe aller Einsaetze angezeigt. Das ist die Summe von allen Geldern, die von den Mitspielern in das Spiel seit dessen Beginn eingebracht wurden. Wenn kein Spiel im Gange ist, zeigt diese Zeile den Text "KEIN SPIEL". Und letztens zeigt dieser Bereich des Bildschirms die aktuelle Runde. Die moeglichen Variationen sind: 1 ................. die erste Runde (mit Einsaetzen) KARTEN TAUSCHEN ... waehrend dieser Runde darf ein User eine Anzahl von null bis maximal drei Karten gegen neue tauschen 3, 4, ... 32699 ... die n.te Runde. Der Showdown beginnt nicht, bevor nicht einer der Spieler "Karten sehen" verlangt hat, oder bevor die Runde 32700 erreicht wurde, wenn der Showdown automatisch beginnt SHOWDOWN .......... jeder User, der gewinnen moechte, muss seine Karten den anderen Spielern zeigen 2.3. Spielerbereich Dieser Bereich erlaubt drei grundlegende Anzeigemoeglichkeiten: - Fuenf Karten, alle umgedreht: derzeit findet kein Spiel statt - Ein Informationstext mit dem Inhalt, dass du im naechsten Spiel mitspielen kannst. Dieser Text erscheint, sobald du im Spiel wegen eines von mehreren Gruenden passt, oder wenn du dich an den Pokertisch setzt, waehrend gerade ein Spiel im Gange ist. In diesem letzten Fall kannst du alles sehen, was am Pokertisch vorgeht, aber nicht am Spiel teilnehmen, solange nicht das aktuelle Spiel vorbei ist, und ein neues gestartet wurde. - Fuenf Karten, alle offen: derzeit findet ein Spiel statt; DAS SIND DEINE KARTEN! 2.4. Kommandobereich Dieser Bereich zeigt die Kommandos, die zu einem bestimmten Zeitpunkt fuer den Spieler verfuegbar sind. Es gibt zwei Kommandos, die jederzeit verfuegbar sind: [.] Chat-Nachricht senden [X] Spieltisch verlassen Andere Kommandos, die zu einem anderen Zeitpunkt verfuegbar sein koennen: [S] Spiel eroeffnen [ausschliesslich Game-Master] [B] Einsatz [P] Passen [1] - [5] Karten austauschen [D] Erledigt, weiter [H] Karten sehen! [R] Karten zeigen Kommandos koennen nur dann verwendet werden, wenn sie als verfuegbare Option angezeigt werden. Der Kommandobereich wird auch verwendet, um zusaetzliche Informationen anzu- zeigen. j/n-Abfagen erscheinen dort, genauso wie Fehlermeldungen, die dem Spieler mitteilen, warum etwas Bestimmtes gegenwaertig stattfindet. 2.5. Statuszeile Der linke Teil dieser Zeile zeigt den Namen des Spielers (=dein Name), zusammen mit der gegenwaertigen Anzahl CUBES, die du besitzt. Der CUBES- Wert wird jedesmal upgedatet, sobald sich die Anzahl CUBES innerhalb des Spiels aendert. Daher kann es vorkommen, dass sich diese Anzeige manchmal um mehr als die Anzahl CUBES veraendert, die im Pokerspiel verwendet wurde, einfach weil zum Beispiel CUBES fuer die Onlinezeit in der BBS hinzuge- zaehlt, oder die Aktienwerte upgedatet wurden. Der rechte Teil dieser Zeile kann eine Uhr enthalten. Wenn du der Game- Master bist, und noch kein neues Spiel gestartet hast, zaehlt diese Uhr von 3:00 Minuten hinunter bis auf 0:00, und gibt danach das Game-Master Privileg an einen anderen Spieler weiter, sofern ein solcher vorhanden ist. Wenn du der Spieler bist, der gerade am Zug ist, zaehlt diese Uhr von 1:00 Minuten hinunter bis auf 0:00, und fuehrt danach "automatisches Passen" aus, falls du einen Einsatz haettest machen sollen (in diesem Fall bist du aus dem Spiel!), oder gibt einfach nur die Spiel-Kontrolle an den naechsten Spieler weiter, falls es sich um die "Karten tauschen"-Runde oder den Showdown handelt. 2.6. Messagebereich Der Messagebereich ist ein kreisfoermig angesteuertes System, nach Vorlage des guten alten UNIX "talk" Programmes. Ein Maximum von zehn Meldungen kann dort gleichzeitig angezeigt werden, einschliesslich System-Meldungen (durch [SYSTEM] gekennzeichnet), Informations-Meldungen (durch [INFO] gekennzeich- net), und User-Meldungen (durch den Usernamen in eckigen Klammern [] gekenn- zeichnet). Die aktuellste Meldung ist mit einem Pfeil "->" gekennzeichnet, und zusaetz- lich wird die aelteste Meldung vom Schirm geloescht (falls mehr als 10 Mel- dungen angezeigt werden), um die Ausgabe leichter lesbar zu machen. 2.7. Message-Eingabebereich Wenn die [.] Taste gedrueckt wird, was zu jedem Zeitpunkt moeglich ist, waehrend man am Poker-Tisch sitzt, erscheint der Username in dieser Zeile, und eine Message kann dort eingegeben werden. Manchmal kann aufgrund von Timeouts das System nicht sofort reagieren, und eine kurze Wartezeit zwischen einer und vier Sekunden kann stattfinden. Das ist kein Programmier- fehler. 2.8. X-Message Zaehler In diesem Bereich siehst du einen Zaehler, falls du X-Messages bekommst, waehrend du dich im Spiel befindest. Login- und Logout-Meldungen, Meldungen, die dir mitteilen, dass soeben jemand dein Profile angeschaut hat oder im Begriff ist, dir eine X-Message zu senden, werden waehrend des Spiels nicht empfangen. Aber du kannst alle anderen Meldungen lesen, sobald du den Pokertisch ver- laesst. Jeder, der dir eine X-Message senden moechte, wird davon in Kennt- nis gesetzt, dass du gerade Poker spielst, und dass es moeglicherweise laenger dauert, bis du antworten wirst. --- Spielstart und Runden mit Einsatz: Der Game-Master ist die einzige Person, die ein neues Spiel starten darf, und das auch nur, wenn derzeit nicht schon gerade ein Spiel stattfindet. Wenn ein neues Spiel mit [S] gestartet wird, wird der Game-Master der aktuelle Spieler, und dessen einminuetiges Timeout wird gestartet. Zur selben Zeit wird jeder, der genau dann am Pokertisch sitzt, ein aktiver Spieler, und 10 CUBES werden von seinem Bargeld abgezogen, was zum Grundeinsatz hinzuaddiert wird. Wenn ein User in dieser Spielphase nicht die erforderlichen 10 CUBES besitzt (und dies kann sogar der Game-Master selbst sein!), wird er wieder inaktiv - und zwar ohne weitere Meldung des Systems. Daher ist es absolut sinnlos, am Pokertisch zu sitzen, wenn man weniger als 10 CUBES besitzt: Du blockierst nur einen Sitz! Wenn du der Spieler bist, der gerade am Zug ist, darfst du einen Einsatz machen, indem du die [B] Taste drueckst. Die Maximal- und Minimalwerte fuer Einsaetze werden auf folgende Weise bestimmt: - Der Maximaleinsatz ist 200 CUBES, oder wenn ein User nicht so viel besitzt, seine Maximalanzahl von CUBES in Bargeld - Der Minimaleinsatz ist immer der vorhergehende Einsatz, oder 1, falls es keinen vorhergehenden Einsatz gegeben hat. Aufgrund dieser Bedingungen koennte es sein, dass der Maximaleinsatz niedriger ist als der Minimaleinsatz. In diesem Fall wird der User vom System aus dem Spiel genommen, als ob er von sich aus gepasst haette. Der User wird davon durch eine Meldung im Kommandobereich informiert, und gleichzeitig wird eine Meldung an die anderen Mitspieler gesendet, die im Message-Bereich erscheint. Dasselbe passiert, wenn das Timeout von einer Minute ueberschritten wurde, ohne einen gueltigen Einsatz zu machen. Einsaetze werden gemacht, indem Zahlen eingegeben werden. Wenn man nur den aktuellen Einsatz setzen moechte, und ihn nicht erhoehen, ist es ausreichend, einfach die [ENTER] Taste zu druecken, sobald der Eingabe- prompt fuer Eingaben erscheint. Ab Runde 3 kann ein User, der die Karten der anderen Spieler sehen moechte, seinem Wunsch dadurch Ausdruck verleihen, dass er die [H] Taste anstelle der [B] Taste drueckt. Jedenfalls muss aber dem Druck der [H] Taste ein gueltiger Einsatz innerhalb der Timeout-Begrenzung folgen, damit er vom System akzeptiert wird. Einsaetze werden immer sofort vom Bargeld des Spielers abgezogen, sobald deren Gueltigkeit bestaetigt wurde. Das bedeutet, dass du einem Verlust von CUBES nicht dadurch entgehen kannst, dass du zu einem spaeteren Zeit- punkt [X] drueckst! Wenn du der gegenwaertig am Zug befindliche Spieler bist, ist auch [P] eine verfuegbare Option. Das veranlasst das System, zu passen (Karten hinzulegen und nicht laenger um den Sieg mitzuspielen), und die Kontrolle an den naechsten Spieler weiterzugeben. Die [P] Option ist mit einem j/n-Prompt versehen, um sicherzugehen, dass die Taste nicht versehentlich gedrueckt wurde. --- Karten tauschen: Waehrend dieser Runde hat ein User eine Minute Zeit, um keine, eine, zwei oder drei seiner urspruenglichen Karten zu verwerfen, und dafuer neue Karten aus dem noch nicht verwendeten Kartenstapel zu erhalten. Falls es gewuenscht ist, Karten zu tauschen, kannst du dir die Karten, die du tauschen moechtest, mit den Tasten [1] bis [5] auswaehlen. Eine zum Tausch bestimmte Karte wird umgedreht. Falls du deine Meinung aendern moechtest, kannst du sie wieder aufdecken, indem du dieselbe Taste ein zweites Mal drueckst. Wenn du sicher bist, die richtige Auswahl getroffen zu haben, kannst du alle ausgewaehlten Karten mit der [D] Taste bestaetigen. Karten werden immer automatisch nach ihrer Wertigkeit sortiert, die hoechste rechts, die niedrigste links. Diese Sortierung von Karten findet auch dann statt, sobald dein Zug beim Karten tauschen vorbei ist, was eventuell fuer Verwirrung sorgen kann, aber fuer das Spiel selbst unerlaesslich ist. Sobald die [D] Taste gedrueckt wurde, um deinen Zug zu beenden, werden alle Karten wieder aufgedeckt angezeigt. Dasselbe passiert, sobald das Timeout ueberschritten wurde. --- Showdown: Der Showdown wird nur gestartet, falls: - entweder der entsprechende Wunsch von einem User durch Druecken der [H] Taste ausgedrueckt wurde, gefolgt von einem gueltigen Einsatz - oder wenn nur mehr ein Spieler uebrig ist, zusammen mit wenigstens einem inaktiven Spieler; in diesem Fall muss der aktive Spieler seine Karten zeigen, um zu gewinnen und die Einsaetze zu kassieren (falls er dies moechte). Waehrend des Showdowns ist [R] neben den zwei Standardoptionen die einzige verfuegbare Option. Mit [R] zeigst du deine Karten allen anderen Spielern am Tisch. Wenn das einminuetige Timeout ueberschritten ist, werden deine Karten automatisch gezeigt, aber du bleibst trotzdem aktiver Spieler. --- Ende des Spiels: Das Spiel endet, wenn: - es keinen aktiven Spieler mehr gibt - nur mehr ein aktiver Spieler und keine inaktiven Spieler uebrig sind - nach dem Showdown Sobald es keinen aktiven Spieler mehr gibt, wird das Spiel vom System fuer beendet erklaert. Alles Geld geht an das System und kann nicht zurueckverlangt werden. Wenn es nur mehr einen aktiven Spieler gibt, wird das System dieses ver- melden, und diesen Spieler zum Sieger erklaeren. Aber: Damit das stattfin- det, darf kein einziger inaktiver Spieler am Tisch sitzen. Sobald inaktive Spieler vorhanden sind, kann das Spiel nur nach dem Showdown enden, oder moeglicherweise erst nach einem gueltigen Einsatz in der letzten Runde, gefolgt von einem Showdown. Das ist kein Programmierfehler! Nur User, die wenigstens den Einsatz in der letzten Runde setzen und ihre Karten zeigen, duerfen um den Sieg mitspielen. Darum beschwere dich bitte nicht darueber, dass du einen Einsatz machen musst, oder darueber, dass du deine Karten zeigen musst: das ist normal in diesem Spiel, und alles andere waere unlogisch. Nach dem Showdown, wird der Sieger unter den aktiven Spielern ermittelt, falls es nur einen aktiven Spieler gibt, ist dieser der Sieger. In allen anderen Faellen wird der Spieler automatisch ermittelt, gemaess Kapitel 3. Der Sieger erhaelt alles Geld, das im Spiel war. Danach wird dieser "Geldtopf" auf null gesetzt, ein neuer Game-Master be- stimmt, und nach einer Wartezeit von 30 Sekunden kann ein neues Spiel vom neuen Game-Master gestartet werden. Diese Wartezeit ist erforderlich, um allen Spielern die Zeit zu geben, die offenen Karten ihrer Mitspieler mit den eigenen zu vergleichen, und darueberhinaus, um Usern, die im folgenden Spiel nicht mitspielen moechten, das Verlassen des Tisches zu ermoeglichen. Wenn der neue Game-Master ein neues Spiel starten moechte, bevor diese Wartezeit abgelaufen ist, wird ihm angezeigt, wie viele Sekunden er noch warten muss, bis dies moeglich ist. Im Fall, dass er versucht, ein Spiel mit nur einem Spieler am Tisch zu starten, wird eine Fehlermeldung ausge- geben. --- Entfernung vom Tisch: Ein Spieler wird automatisch vom Tisch entfernt, falls - er nicht mehr online ist - das System feststellt, dass ein User mit demselben Namen bereits am Tisch sitzt (ja, das ist eine Bedingung, die auftreten kann) - ein Systemprozess eines Users eine andere ID besitzt, als jene, die im Speicherbereich des Pokerspiels gespeichert ist. Eine Ueberpruefung auf diese Bedingungen wird periodisch von ALLEN System- prozessen von Usern, die am Pokertisch sitzen, durchgefuehrt. Dies bedeutet, dass im schlimmsten Fall von nur einem User am Tisch, diese Ueberpruefung alle 60 Sekunden stattfindet, wenn es mehr Spieler gibt, findet die Ueber- pruefung statistisch oefter statt. Zusaetzlich wird jedesmal, wenn ein User sich zum Tisch setzt, eine Ueber- pruefung eingeleitet. Wenn ein User automatisch vom Tisch entfernt wird, werden alle seine Spiel- Eintraege entfernt (sein Geld bleibt im "Topf"), und die anderen Spieler werden von der Entfernung informiert. Hinweis: Die Entfernung vom Tisch besteht *NICHT* darin, den User vom Pokertisch zum normalen BBS-Prompt zu- rueckzuwerfen, sondern ist vielmehr die "Bereinigung" einer Speicherstruktur, in der jemand aufgelistet wird, der in der Tat nicht mehr dort (im Spiel) ist. Hinweis: Das Schliessen deiner Telnet-Sitzung oder des Terminal- fensters fuehrt ebenfalls zu deiner automatischen Entfernung vom Tisch. Kapitel 3. Pokerregeln in Global Village BBS Es kommt kein Geld vom System. Das gesamte im Spiel befindliche Geld kommt von den Usern, die Poker spielen. Daher ist es auch erlaubt, "zusammenzuar- beiten", oder mit anderen Spielern zu "schummeln". Wie im wirklichen Poker koennen zwei oder mehr Spieler ein Team bilden, um die anderen Spieler zu besiegen. Jedenfalls bedeutet das nicht, dass unfaire Mittel verwendet werden duerfen, die gegen die Policy verstossen. Kapitel 4 gibt dazu zusaetzliche Detail- informationen. Das Spiel nimmt den folgenden Lauf : (0) Grundeinsatz (a) Erste Runde mit Einsaetzen (b) Karten tauschen (c) Zusaetzliche Runden mit Einsaetzen (eine oder mehrere!) (d) Showdown Waehrend und nach dem Showdown wird der Spieler mit dem hoechsten Blatt ermittelt: Alle Farben sind per Definition gleich. Falls jedoch zwei Blaetter komplett gleichwertig sind, wird die Farbe als entscheidender Faktor herangezogen, um zu ermitteln, wer gewonnen hat. In diesem Fall, und ausschliesslich in diesem Fall, haben die Farben die folgende Reihenfolge (hoechste zuerst, niedrigste zuletzt): '+', '*', '#', '-'. Diese Reihenfolge der Farben wird nur sehr selten verwendet. Eine Diskussion ueber die Verwendung von Farben fuer die Ermittlung des Siegers ist nicht erwuenscht. Die Einleitung einer solchen Diskussion kann der Grund fuer eine Degradierung innerhalb der BBS sein. Die Kartenreihenfolge ist: A-K-Q-J-10-9-8-7-6-5 Die folgenden Regeln in bezug auf Reihung (je niedriger die Zahl, umso besser) und Gleichheit (in den Texten beschrieben), werden angewendet: (1) Royal Flush Fuenf Karten in derselben Farbe und in Reihenfolge, die genau A-K-Q-J-10 sind. Zwischen zwei Royal Flushes gewinnt die "hoehere" Farbe. (2) Straight Flush Fuenf Karten in derselben Farbe und in Reihenfolge, niedriger als Royal Flush. Der Spieler mit der hoeheren Karte in seiner Strasse gewinnt. Wenn beide Strassen gleich sind, entscheidet die Farbe. (3) Vier gleiche Karten Vier gleiche Karten, unabhaengig von der Farbe. Zwischen zwei Spielern mit vier gleichen Karten, gewinnt derjenige mit den vier hoeherwertigen Karten. (4) Full House Drei gleiche Karten und ein Paar. Zwischen zwei Full Houses gewinnt derjenige mit den drei hoeher- wertigen Karten. (5) Flush Fuenf Karten in derselben Farbe, unabhaengig von einer Reihenfolge. Zwischen zwei Flushes gewinnt die hoehere Karte. Falls diese identisch ist, die zweithoechste Karte, und so weiter. Wenn sogar die niedrigsten Karten identisch sind, entscheidet die Farbe der hoechsten Karte. (6) Straight ("Strasse") Fuenf Karten in Reihenfolge, unabhaengig der Farbe. Zwischen zwei Strassen gewinnt diejenige mit der hoechsten Karte. Hinweis: eine Strasse kann auch mit 8-7-6-5-A gebildet werden, in diesem Fall wird das As als niederwertige Karte verwendet; diese Strasse verliert immer gegenueber anderen Strassen. (7) Drei gleiche Karten Drei gleiche Karten und zwei weitere, die kein Paar sind. Zwischen zwei Spielern mit dieser Konstellation gewinnt derjenige mit den hoeherwertigen drei Karten. (8) Zwei Paare Zwei Paare, und eine fuenfte Karte. Zwischen zwei Spielern, die jeweils zwei Paare haben, entscheidet das hoehere Paar, beziehungsweise falls dieses identisch ist, das zweite Paar. Wenn dieses identisch ist, entscheidet die fuenfte Karte. Falls auch diese gleich ist, gewinnt der Spieler, der die Karte mit der Farbe '+' unter seinem hoeherwertigen Paar hat. (9) Ein Paar Ein Paar und drei zusaetzliche Karten. Zwischen zwei Spielern, die ein Paar haben, gewinnt das hoeherwertige Paar, falls dieses identisch ist, die hoechste der drei weiteren Karten. Falls auch diese identisch ist, entscheidet die Farbe der hoeherwertigsten der drei Zusatzkarten. Hinweis: Die zweite und dritte Zusatzkarte sind nicht Bestandteil der Ermittlung des Siegers! (10) Hohe Karte und kein Paar Das ist ein Blatt ohne Paar, in der Hoehe bestimmt durch seine hoechste Karte oder Karten. Der Sieger wird analog zu den Regeln fuer Flushes bestimmt. Siehe dazu Punkt (5) fuer weitere Details. Kapitel 4. Verhalten beim Spiel Die Anzahl von Sitzen am Pokertisch ist auf fuenf limitiert. Daher ist es wesentlich, dass Spieler nicht den Tisch BLOCKIEREN, wenn andere User spielen moechten. Es ist in Ordnung, den Pokertisch nicht zum Spielen zu verwenden, sondern die dort enthaltene Chat-Funktion als einen Quasi- Chatmode heranzuziehen. Aber: Wenn User spielen moechten, ist es ein Regelverstoss, immer noch dort zu bleiben und zu chatten. Um es zusammenzufassen: Chatten JA, aber bitte verlasse den Tisch wenn User spielen moechten, und das fuer dich nicht gilt. Zusaetzlich ist es verboten, fuer die Zeitdauer von zwei vollstaendigen aufeinanderfolgenden Pokerspielen idle zu bleiben. Im schlimmsten Fall wird folgendes passieren: Unter der Voraussetzung, dass du der Game-Master bist, muessen andere User drei Minuten warten, bis dein Privileg an jemand anderen weitergegeben wird. Dann wird dein erster Zug im Spiel eine weitere Verzoegerung von einer Minute fuer die anderen Mitspieler verursachen. Solche Dinge sind absolut unnoetig und werden definitiv als ernster Verstoss erachtet. Sei niemals beleidigend zu anderen Spielern. Verwende keine beleidigende Sprache oder eine sehr aggressive Spielweise. Sei nett zu anderen und handle anderen gegenueber nicht so, wie du selber nicht behandelt werden moechtest! Zusammenarbeit, z.B. "Schummeln" mit anderen Usern am Tisch, ist erlaubt, da kein Geld vom System kommt. Aber geschummelt darf nur insofern werden, dass zwei (oder mehr) User innerhalb der Regeln zusammenarbeiten. Sobald ein bekannter Bug ausgenuetzt wird, ist das Schummeln ein ernster Regel- verstoss. Wenn ein User einen Programmierfehler (Bug) entdeckt, der den Lauf des Spiels beeinflusst, und diesen nicht unverzueglich berichtet, stellt dies ebenfalls einen Verstoss gegen die Policy dar. Verstoesse gegen die Regeln werden gemaess der normalen BBS Policy geahndet. Sanktionen reichen von Warnungen ueber TWITs bis hin zur Loeschung von der BBS! Kapitel 5. Interne Funktionsweise und Problematik beim Erstellen des Quelltexts Dieses Kapitel duerfte nur fuer Programmierer oder wirklich interessierte User interessant sein. Normale Leser moegen bitte in Kapitel 6 weiterlesen. Features dieses Spiels: - Ein Kommandosystem, das mit Broadcast-Technik arbeitet - Semaphoren (Locking) fuer Multi-Express-Messages (Broadcasting) - Terminal Escape Zeichen - Umleitung des alarm() Handlers zu einer eigenen Spielfunktion und neuerlicher Aufruf des urspruenglichen alarm() Handlers nach Beendigung des Spiels - Dezentrale Spielverwaltung - Vermeidung reentranter Funktionen Kommandos zwischen den Prozessen werden ausgetauscht, indem die Broadcast- Technik verwendet wird. Der Broadcast-Speicherbereich wird mit den notwen- digen Kommandodaten ausgefuellt, und danach wird das Signal an alle Pro- zesse gesendet. Das Problem dabei ist allerdings, dass die Broadcast-Area zur selben Zeit auch von einer Menge von anderen Systemmeldungen verwendet wird, z.B. die Login-Information ("ABC logget sich gerade ein"), und wirklich fuer eine Menge von anderem Zeug. Daher musste dafuer Sorge getra- gen werden, dass diese Meldungen in keinem Fall die Kommandodaten des Poker-Spiels ueberschreiben. Das wurde durch Einfuehrung von Sempahoren (Locking) ermoeglicht. Der YAWC- Code enthaelt eine lock_function(), die Teil des ISCA Codes (!) war. Diese Funktion wurde veraendert, um auch die Broadcast-Area sperren zu koennen, sobald eine Funktion dieses Speichergebiet benoetigt. Aber da Multi-Express Messages niemals ein Feedback Signal zurueckgeben, muss der sendende Prozess herausfinden, wann der richtige Zeitpunkt ist, um das Speicherge- biet wieder "aufzusperren". Das ist (zugegebenermassen) der Schwachpunkt des Spiels. Es ist _unmoeglich_, das herauszufinden. Daher wird fuer nor- male Broadcasts das "Aufsperren" sofort erledigt, nachem die Daten in das Speichergebiet geladen wurden, aber fuer Poker-Kommandomessages, entweder mit wichtiger Spiel-Information, mit Chat-Daten, oder auch der essentiellen Information, wer der naechste Spieler am Zug sein wird, wird die Speicher- struktur nach einem Timeout von 350 Millisekunden wieder "aufgesperrt". Das erzeugt das folgende Verhalten: Die Prozesse von Leuten, die das Spiel spielen, haben genug Zeit, um die Daten aus der Struktur zu lesen, und ausserdem kann die Struktur in der Zwischenzeit nicht mit einer anderen Poker-Message oder eine Broadcast-aehnlichen Message von der BBS ueber- schrieben werden. Auf diese Weise ist sichergestellt, dass die Message dort ankommt, wo sie es soll, auf Kosten eines geringen Timeouts von 1/3 Sekunde. Aber es ist moeglich, dass die Message nicht in 100% aller Faelle ankommt. Falls diese Message zufaellig aus wichtiger Spielinformation besteht, wird das Spiel nicht mehr weitergehen, moeglicherweise sogar nicht einmal mehr in der Lage sein, sich selbst zu reaktivieren, indem die Auto-Purge-Funkti- on in Kraft gesetzt wird. User wuerden dies feststellen und den Pokertisch verlassen, um sich dann neuerlich dazuzusetzen. Ausser unter speziellen Testbedingungen, ist jedoch die essentielle Spielinformation (Kommandos und Meldungen) immer bei allen Poker-Prozessen angekommen, was dem Programmierer genuegend Zuversicht gibt, zu glauben, dass solche automa- tischen Deaktivierungen des Spiels entweder gar nicht oder nur sehr selten stattfinden. Es wurde eine Variante ausprobiert, in der der aktuell am Zug befindliche Prozess ein Signal (eine direkte X-Message, sozusagen!) an den Spieler sendet, der als naechster am Zug ist. Das hat jedoch nicht so gut funkti- oniert, wie die Broadcast-Methode. Es war instabil und erzeugte Crashes aufgrund nicht vermeidbarer reentranter Aufrufe der sendx() und catchx() Funktionen. Hinweis: der vorige Absatz entspricht nicht mehr dem aktuellen Inhalt des Sourcecodes. Die erwaehnten Probleme konnten durch eine revolutionaere Veraenderung einiger fundamentaler Funktionen zur Gaenze geloest werden. Bis auf weiteres bleibt diese neue Funktionalitaet jedoch geheim. Terminal Escape Sequenzen werden fuer einen besseren Spieleindruck verwendet. Im Programm sind gerade eine Handvoll enthalten: - Bildschirm loeschen - Loesche zum Ende der Zeile - Gehe zur Cursorposition X,Y am Schirm - Speichere Cursorposition - Stelle Cursorposition wieder her Problematisch ist die Verwendung dieser Sequenzen nur in den Faellen, wenn das Terminal des Users absolut nicht ANSI-kompatibel ist. Aber die meisten Terminals sind das, gottseidank. Manche sind es nicht, doch sollte es nicht die Zielsetzung sein, den Spieleindruck fuer 99% aller User zu beschraenken, nur um den Beduerfnissen einer Minderheit zu genuegen. Umleitung des alarm() Handlers: Normalerweise wird waehrend einer BBS- Session alle 60 Sekunden eine Funktion aufgerufen, die z.B. checkt, ob man idle ist, und andere wichtige Dinge. Es darf aber nur EIN alarm() Handler pro Zeiteinheit aktiv sein. Nun wurde der alarm() Handler benoetigt, um die Timeouts waehrend des Spiels zu realisieren, und um Uhren anzuzeigen. Die Loesung war wie folgt: Bei jedem Aufruf der normalen sleeping() Funktion innerhalb der BBS wird die aktuelle Zeit in einer globalen Systemvariable gespeichert. Waehrend des Pokerspiels zeigt der alarm() Handler zu einer eigenen Funktion, die bei jedem Aufruf ueberprueft, ob es wieder Zeit ist, die sleeping() Funktion der BBS aufzurufen. Die Funktion im Pokerspiel arbeitet mit einer Anzahl aufeinanderfolgender Aufrufe, und jeder Aufruf findet alle fuenf Sekunden statt. Wenn der User das Pokerspiel verlaesst, wird der letzte Aufruf der Funktion feststellen, dass der User nicht mehr innerhalb des Spiels ist, und den normalen Aufruf der sleeping() Funktion wiederherstellen, und zwar genau nach dem noch verbleibenden Zeitraum bis zum naechsten erforderlichen Aufruf (was sehr leicht berechnet werden kann). Daher wird der normale Aufrufzyklus der sleeping() Funktion keinesfalls um mehr als 4 Sekunden verschoben! Dezentrale Spielverwaltung: Alle Prozesse beinhalten die volle Information, um alles zu tun. Aber nur bestimmte Prozesse (z.B. der Game-Master) sind in der Tat berechtigt, etwas zu tun. Der Game-Master und der Spieler, der sich momentan am Zug befindet, werden im Shared Memory gespeichert, und jeder Prozess ueberprueft, ob er Funktionen ausfuehren darf, durch vorheri- ge Analyse des Shared Memory. Dadurch ist sichergestellt, dass kein Prozess tut, was er nicht tun sollte! Die einzige Funktion, die von allen Prozessen aufgerufen wird, ist die Ueberpruefung der Online-Spieler (ob sie noch alle da und eingeloggt sind). In diesem Fall kann die "Entfernung" eines Users vom Tisch unter gewissen Bedingungen zweimal stattfinden. Das gefaehrdet aber niemanden, ausser dass evtl. die Informationsmeldung zweimal an alle Spieler gesendet wird. Daher ist es kein grosses Problem. Waehrend des Testens, auch unter Extrembedin- gungen, ist dies nie aufgetreten. Vermeidung reentranter Funktionen: Es ist klar, dass ein Prozess, der eine Kommandomeldung sendet, nicht zur selben Zeit dieses Signal empfangen und eine neuerliche Meldung senden darf. Das wuerde reentrante Funktionen verursachen, und mir ist dies waehrend meiner Experimente sehr oft passiert. Insbesondere die Funktion, die das Ende des Spiels feststellt, wird von nicht-privilegierten Prozessen aufgerufen (nicht Game-Master, sondern aktueller Spieler!). Da ich keinen Ausweg gesehen habe, habe ich den folgenden Weg gewaehlt: Eine "override"-Variable wird im Shared Memory gespeichert, und sobald die Spiel-Ende-Funktion aufgerufen wird, schreibt der Prozess, der diese Funktion aufruft, seine ID in den Shared Memory. Wenn das Informations-Signal daraufhin an alle Prozesse gesendet wird, wird rueckgecheckt, ob der empfangende Prozess gleichzeitig der sendende Prozess ist. Falls dies der Fall ist, wartet er, bis die Sendefunktion beendet ist, und daraufhin wird die Empfangsfunktion neuerlich eingelei- tet. Das war ein besonderes Problem in Zusammenhang mit dem vorher erwaehn- ten Semaphoren-Locking, aber durch die beschriebenen Funktionen konnte das mehr oder weniger "ordentlich" programmiert werden, auch wenn es *eventuell* elegantere Methoden gibt, so etwas zu entwerfen. Es gab eine ganze Menge anderer technischer Probleme, doch die Erwaehnten scheinen mir diejenigen zu sein, die hauptsaechlich von Interesse sein duerften. Kapitel 6. Zahlen und Erwaehnungen Zahlen: 70 000 ... Groesse aller Quelltexte des Pokerspiels, gemeinsam, in Bytes 2 500 ... Anzahl Zeilen in allen Quelltexten des Pokerspiels, gemeinsam 165 ... Benoetigte Anzahl an Stunden fuer die Programmentwicklung Erwaehnungen: Idee ............. Michael Tritthart Programmierer .... Michael Tritthart Layout ........... Romain Lheritier / Michael Tritthart Testarbeit ....... Alle Sysops und Supervisors von Global Village BBS Dt. Uebersetzung . Michael Tritthart Widmung .......... Dieses Programm ist in erster Linie M.H. gewidmet, und ausserdem allen Usern von Global Village BBS! Ich wuensche jedem viel Spass mit diesem Spiel! Hoffentlich habt ihr genauso viel Spass dabei, es zu spielen, wie ich es hatte, als ich es programmiert habe (auch wenn es manchmal leidvoll war :)! |
Last Updated