Sascha Heyer

blueFLAGdev.de | saschaheyer.de

Surface Poker Projekt

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:

  1. Ein Spieler zieht einen Chip in die Mitte des Tisches
  2. Ein Spieler drückt auf „Bet“ um mitzugehen und somit fließen dessen Chips in den Gesamtpot mit ein
  3. 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)
Powered by Google Talk Widget