Global Village BBS Global Village BBS Logo
[ about ] [ gateway ] [ help ] [ links ]


**************************************************
                     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