Surface 2 Poker
Menu
Beim Starten des Surface Poker Spiels erscheint ein Menü mit folgenden Funktionalitäten:
- Spieleranzahl auswählen und Spiel starten (Byte Tags auf dem Tisch platzieren)
- Wechseln des Hintergrunds, also der Tischfarbe (Blau, Grün, Rot, Schwarz, Grau) möglich
- Sounds die im Spiel vorhanden sind ein- oder ausschalten
- Neue Spieler hinzufügen
- Spiel pausieren (während des Spiels)
- Anleitung, in der die Spieler sich die Regeln, etc. anschauen können
Chips
Am Anfang der Runde bekommen alle Spieler die gleiche Anzahl an Chips zugeteilt. Diese dienen als Währung und können in den einzelnen Wettrunden gesetzt werden.
Design:
Ziel war, diese möglichst realistisch wirken zu lassen. Sie wurden in einer Größe von ca. 4 cm Durchmesser entworfen, um dadurch die beste Bildqualität zu erreichen.
Mit Hilfe von Schattierungen wurde der dreidimensionale Effekt erzeugt. Das gleiche gilt für den Dealer-, Small Blind- und Big Blind- Button.
Um unseren entworfenen Pokerchips ein individuelles Aussehen zu verleihen wurde unser „Surface Poker“ – Logo eingearbeitet.
Karten
Im Surface Poker stehen zwei verschiedene Kartendecks zur Auswahl. Zum einen das klassische Kartendeck, wie es auch beim Original Poker verwendet wird und zum anderen ein eigen kreiertes Kartendeck, das zu dem Surface Poker Design passt. Das heißt die Farbe rosa wird bewahrt um den Bezug auf Surface zu behalten und die Grafiken sind in einem Stil gehalten.
Die Rückseite der Pokerkarten enthält das Surface Poker Symbol sowie ein Design, das die Zugehörigkeit zum Microsoft Surface Logo assoziiert.
Die Vorderseite wurde ebenso mit einem eigenen Design versehen. Die Bilder der Karten unterscheiden sich von den normalen Kreuz-, Karo-, Herz- und Piksymbolen. Ebenso ist die Farbe der Karten neu entworfen worden. Für die Farbe König dient ein Kronensymbol, den Buben repräsentiert ein Federhut und die Dame wird durch einen Damenhut dargestellt.
Ein Set einer Kartenfarbe hat wie folgt das Design:
Spieler Menu
Der Spieler hat auf seinem Platz während des Spiels verschiedene funktionale Buttons und auch Anzeigeelemente zur Verfügung.
Die Buttons um in einer Wettrunde eine Aktion auszulösen sind:
- Bet/ Raise
- um in einer Runde mitzugehen oder den Einsatz zu erhöhen
- Fold
- um aus einer Runde auszusteigen
- Check
- um zu schauen, welche Funktionen andere Spieler tätigen würden, also seinen Zug weiterschieben
Die Anzeigeelemente bestehen aus:
- Guthaben
- zeigt dem Spieler an, welchen Wert an Chips dieser noch besitzt
- Name des Spielers
- zeigt den Spielern am Anfang des Spiels welcher Spieler auf welchem Platz sitzt
Pot
Der aktuelle Gesamtpot wird allen Spielern durch Anzeigeelemente sichtbar dargestellt, damit auch sichergestellt ist, dass jeder Spieler aus jeder Position eine gute Sicht auf den aktuellen Pot hat.
Falls Split Pots auftreten, also neben dem Hauptpot ein kleiner Nebenpot wird dessen Guthaben ebenso in Anzeigeelementen ausgegeben, sodass jeder Spieler weiß welche Beträge in welchen Pots vorhanden sind.
Table Cards
Table Cards sind die Karten die nach und nach in der Mitte des Tisches aufgedeckt werden.
Nach der ersten Wettrunde, wenn alle Spieler mitgegangen oder ausgestiegen sind wird der „Flop“ aufgedeckt, dies sind die ersten drei Gemeinschaftskarten.
Nach der zweiten Wettrunde wird dann die vierte Karte, „Turn Card“ genannt aufgedeckt.
Auf das Ende der dritten Wettrunde folgt dann nur noch das Aufdecken der fünften Karte, die als „River Card“ bezeichnet wird.
Daraufhin folgt die letzte Wettrunde, in der die Spieler noch einmal bieten, checken oder aussteigen können, nachdem sie gesehen haben welche fünf Karten auf dem Tisch liegen.
Hilfetext
Der Hilfetext, der sich im Spiel öffnet falls er benötigt wird, wurde durch ein ScatterViewItem realisiert, das man auf dem Tisch hin und her ziehen kann wie man möchte.
Es soll dem Spieler als Hilfe dienen um benötigte Regeln nachzuschlagen oder auch Informationen darstellen wie die einzelnen Hände zusammengesetzt sind und welche höher als andere ist.
Allgemein
Alle Elemente sind ScatterViewItems und können somit bequem von Spieler zu Spieler weitergeschoben werden z.B. die Spielregeln.
Spieler anlegen
Spieler können direkt auf dem Surface angelegt werden und werden in einer XML-Datei gespeichert.
Somit können auch während es Spiels, ohne etwas am Programm zu ändern, neue Spieler hinzugefügt werden.
Dieser stellt dann seinen Namen, Netzwerkpasswort und seine ByteID (die nocht nicht vergeben ist) ein.
Danach bekommt er seinen SpielerTag, mit dem er sich dann im Spiel anmelden kann.
Eine Datenbank fanden wir aufgrund der geringen Datenmengen und zu speichernden Daten nicht als notwendig.
Bedingt durch die Surface Größe können maximal 6 Spieler an einem Pokerspiel teilnehmen.
Spielerplatzierung
Damit nicht alle Spieler an einer Seite des Surface sitzen falls weniger als sechs Spieler teilnehmen, wird die Plazierung der Spieler vom Surface übernommen. Dieser bestimmt den optimalen Platz der Spieler je nach Anzahl wieviele mitspielen.
Auf der unteren Grafik sieht man welcher Spieler auf welchem Platz sitzt je nach Spieleranzahl.
Sounds
Diese dienen dazu dem Spiel ein “echtes” Gefühle zu geben und somit die Interaktionen mit dem Surface abzurunden, sowie auch das Spiel lebhafter zu gestalten.
Es gibt 3 Interaktionsfälle des Spiels mit dem Benutzer, bei denen Sounds erscheinen:
- Ein Spieler zieht einen Chip in die Mitte des Tisches
- Ein Spieler drückt auf „Bet“ um mitzugehen und somit fließen dessen Chips in den Gesamtpot mit ein
- Ein Spieler hat gewonnen und bekommt alle Chips aus dem Pot zu seinem Guthaben und seinen Chips gutgeschrieben
Wie auch bei den Hintergründen können die Sounds jederzeit an- oder ausgeschalten werden.
Hintergründe
Es stehen 5 verschiedene Hintergründe (FullHD Auflösung) zur Verfügung:
- Schwarz
- Grau
- Blau
- Rot
- Grün
Diese können sowohl vor dem Spiel als auch während dessen gewechselt werden.
Byte Tags
Die Spieler Tags werden aus den zwei runden Stäben hergestellt. Diese besitzen eine hohe Leuchtkraft um das vom Surface ausgehende Licht direkt in das Plexiglas-Tag weiterzuleiten und somit einen tollen Effekt zu erzeugen.
Aufgrund er Länge der Stäbe ergeben sich genau 6 Spieler- Tags, dies ist genau die Spieleranzahl die wir für unser Projekt vorgesehen haben.
Jedes Spieler-Tag hat genau eine sich nicht wiederholende ByteID anhand der dann die im System gespeicherten Spielerinformationen ausgelesen werden können.
Diese Informationen beeinhalten den Spielernamen.
Algorithmen / Code Behind
Um die Abbildung der Realität in die Softwarewelt einfacher zu halten, haben wir für die realen Objekte Klassen verwendet (Übersicht):
Player.cs
- Verwaltung des Spielers mit dessen Attributen
Blind.cs
- Anfangsspieler bestimmen
- Small und Blind bestimmen
- Blinds switchen
- Blinds raisen
Chip.cs
- Ein Chip besteht aus einem ScatterViewItem, welches Koordinaten besitzt, die für die Position des Chips sowie die Erkennung ob dieser Chip gesetzt wurde verantworlich ist
Deck.cs
- Ein Deck besteht aus 52 Karten, welche per [modul] Funktionen dynamisch ermittelt werden
- Eine Methode zum Shufflen des Decks
- Methode um die Karten, die bereits auf dem Tisch liegen, aus dem Deck zu nehmen
Hand.cs
- Eine Hand besteht aus 2 Karten
- Es existieren verschiedene Methoden, die Karten als [Obj], [String] oder als [Integer] zurückgeben
Pips.cs
- Pip ist eine Repräsentation des Wertes einer Karte, intern als Integer von 2 – 14 wobei 2 als 2 zählt und die 14 als As
- Die Repräsentation in Integer Werten macht die Berechnung der Hände deutlich einfacher
Suits.cs
- Suit ist eine Repräsentation des Bildes einer Karte, also Kreuz, Pik, Karo und Herz
- Intern wird dies auch wieder als Integer Wert behandelt
RecognitionHand.cs
Die aufwändigste und auch komplexeste Klasse ist diese, welche die „eigentlichen“ Poker- Algorithmen enthält.
Da wir auf keine geeignete API zurückgreifen konnten, wurden diese Algorithmen von uns erstellt.
Obwohl wir zwischen den Berechnungen der Hände genügend Zeit zur Berechnung hätten, haben wir Wert darauf gelegt das die Algorithmen so performance- optimiert laufen wie möglich.
Die Methodik zum Erkennen und Berechnen der Hand besteht aus zwei Teilen:
- Erkennen der Hand
- Berechnen der HandDas Erkennen der Hand ist wichtig um die potentiellen Gewinner zu bestimmen. In einem weiteren Vergleich der Werte der Hand wird der Gewinner nach dem Showdown bestimmt.
Code Auszug:
Timers.packaged
Der gesamte Prozess des Spiels läuft in einer Game Loop ab. Damit das Pokerspiel jedoch noch auf Interaktionen auf dem Surface reagieren kann (ohne Freeze), wurde die Game Loop mit Hilfe von einem Dispatcher gelöst. Dieser funktioniert auf Basis eines Ticks und dessen TimeIntervall.
Die Game Loop hat folgende Zustände
- start
- stop,
es ist also möglich das Spiel zu pausieren.
SoundManager.cs
Diese Klasse dient zur Verwaltung der Sounds die im Spiel vorhanden sind und bei bestimmten Interaktionen zwischen Spieler und Table erscheinen.
XmlHandler.cs
Auslesen und Speichern der Spielerdaten in einer XML Datei.
Anbindung mobiler Endgeräte
Die Serverseite der Netzwerkkommunikation wurde mittels UDP realisiert/implementiert.
Um sicherzustellen dass der Spieler sich nicht als ein fremder Spieler auf dem System anmeldet, ist die Eingabe eines Connection Passworts erforderlich.
Das Passwort ist anhand der Tags eindeutig zuzuordnen.
Die Anbindung der Clients an den Surface und somit den Server erfolgt über WLAN.
Fazit
Da es keine fertigen Pokeralgorithmen oder auch einzelne Methoden zu finden gibt, oder diese falsch waren, wurden sowohl die Handerkennung als auch die Rundenlogik oder auch die gesamte Spielelogik von uns selbst entwickelt und implementiert.
Letzendlich sind folgende Anzahlen an Codezeilen zusammen gekommen:
- C# → ca. 6900 Zeilen
- XAML → ca. 6300 Zeilen
Das Entwickeln der Algorithmen für die Handerkennung und die Spielelogik hat am meisten Zeit gekostet und war das Komplizierteste an allem.
Im folgenden ein Auflistung der Funktionen, welche erfolgreich implementiert wurden und welche zu Problemen führten beziehungsweise nicht implementiert werden konnten.
| Funktionsfähig | Teilweise oder nicht funktionsfähig |
| Erkennung der Spielertags auf dem Surface und richtige Platzierung auf dem Tisch | Sidepots fehlen. Falls ein Spieler All- In geht und sich der Gesamtpot noch in einzelne Pots aufteilt |
| Verteilung des gleichen Guthabens und der Karten an die Spieler | Raise- Erkennung funktioniert teilweise |
| Ziehen der Chips auf die Mittelfläche (Pot), Ziehen der Karten | Check- Erkennung ebenso teilweise(Erste Runde wenn der Big Blind checken muss damit sich die ersten drei Karten aufdecken funktioniert) |
| Aufdecken der Karten, die verdeckt vor dem Spieler liegen | Spieler hinzufügen funktioniert soweit, dass die Spieler in eine XML Datei eingefügt werden |
| Subtraktion der gesetzten Chips eines Spielers von seinem Guthaben | |
| Rundenlogik, dass der Small Blind anfängt und die Spieler weiterswitchen um setzen zu können | |
| Pausieren und Fortsetzen des Spiels möglich (über das Menü) | |
| 4 eigen aufgenommene Sounds (von 29 zur Verfügung stehenden) für Chips reinlegen, Bet’en etc. vorhanden | |
| Fold Funktion, sodass Spieler aussteigen können während einer Runde | |
| Erkennung ob Chips über eine Grenze in den Pot gezogen werden und in der Mitte liegen bleiben | |
| Hintergrund und Sound lassen sich verändern bzw. aus- und anschalten | |
| Karten werden richtig aufgedeckt wenn alle Spieler die gleiche Anzahl an Chips gelegt haben | |
| Algorithmen für Handerkennung (Straight, Flush, etc.) funktionieren soweit getestet, Royal Flush evtl. nicht ganz | |
| Eine Spielrunde bis jemand gewonnen hat wenn alle normal mitgehen (ohne Raise) funktioniert | |
| Android App verbindet sich per WLAN, zeigt Karten auf, Einstellungen möglich | |
| All- In wurde als Tag, das man auf den Tisch legt realisiert, somit wird das gesamte Guthaben des Spielers dem Pot gutgeschrieben | |
| Welcher Spieler der Gewinner ist, wird erkannt und in der Schlussgrafik (Pokal) ausgegeben | |
| Nur die Chips setzbar, je nachdem welches Guthaben der Spieler noch besitzt | |
| Spielhilfe vorhanden, auch schließbar | |
| Small-, Big-, Dealer- Anzeige an den auf dem Tisch liegenden Spielertags (auch verschiebbar oder wegnehmbar wenn einmal auf den Tisch gelegt) | |
| Kartendeck ist auswählbar, auch während des Spiels ohne dass sich die Karten verändern | |
| Big Blind und Small Blind können in der ersten Runde nicht Fold’en, weil sie ihre Blinds setzen müssen | |
| Blinds werden geraised (nach jeder Runde) |