Montagsmaler
Lange hatte ich es bereits vor aber nun ist es endlich so weit, die Neuauflage von Montagsmaler ist endlich fertiggestellt. Bei diesem kleinen Spiel geht es darum, dass einer der Spieler ein Wort vorgegeben bekommt und dieses Wort malen muss. Die anderen Spieler versuchen dann, das gemalte Wort zu erraten. Ein sehr simples Spielprinzip, was sich auch in langweiligen Schulstunden immer bewährt hat.
Was in der ersten Version noch tonnenweise mit AJAX-Requests um sich geworfen hat, basiert nun auf WebSockets. Da diese Technologie leider noch nicht sehr weit verbreitet ist, fiel die Wahl der serverseitigen Software auch nicht sehr schwer aus. Da es für nodejs eine Bibliothek namens socket.io gibt, die den Umgang mit WebSockets sehr komfortabel gestaltet, setzt das neue Montagsmaler auch serverseitig auf Javascript. Damit basiert das Projekt nun komplett auf Javascript und verwendet kein PHP mehr. Zusätzlich zu nodejs selbst kommen die folgenden Bibliotheken zum Einsatz:
- connect - Stellt schnell und einfache Webserverfunktionalität bereit und wird zum Ausliefern von statischen Inhalten verwendet
- connect-compiler - Optimiert die Übertragung von durch connect bereitgestellten Inhalten
- mysql - Ermöglicht es eine Verbindung zu MySQL herzustellen
- socket.io - Stellt API für Websockets und Fallbacks bereit
Das Programm selbst ist dabei grob in drei Teile unterteilt. Der erste Teil ist das Protokoll. Das Protokoll übernimmt die Kommunikation zwischen Server und Client. Es ist als ein Javascript-Objekt realisiert bei dem jede Methode eine Nachricht eines bestimmten Typs verarbeiten kann. Der Nachrichtentyp ist dabei identisch mit dem Methodennamen. Es gibt zwei unterschiedliche Protokoll Objekte. Das eine enthält alle Nachrichten die von Client an den Server gehen und wird dementsprechend auf dem Server ausgeführt. Das andere Objekt enthält alle Nachrichten die vom Server an den Client gehen und wird daher auf dem Client ausgeführt. Beispiele von Nachrichten die so übertragen werden sind:
- Ein User Schreibt eine Nachricht
- Ein neuer User ist dem Chat beigetreten
- Eine neue Spielrunde hat begonnen
- Ein User hat seinen Namen geänder
- Der Maler hat den Bildschirm gelöscht
Zusätzlich zum Typ einer Nachricht werden noch Parameter übertragen. Anzahl und Art der Parameter hängt dabei vom Typ der Nachricht ab. Die Parameter werden dann an die entsprechende Handler-Methode im Protokoll-Objekt übergeben und können so ausgewertet werden.
Der zweite Bestandteil ist das Game selbst. Hier gibt es erhebliche Unterschiede zwischen Server und Client. Die eigentliche Spiellogik liegt auf dem Server. Auf dem Client sind lediglich die zum Malen benötigten Funktionen vorhanden. Die Spiellogik auf dem Server Startet ein Spiel, beendet es wieder und verwaltet die Warteschlange der Maler. Wenn ein Spieler sich als Maler meldet und zur Zeit kein Spiel läuft wird ein neues gestartet. Dazu wird ein zufälliges Wort aus der Datenbank geholt. Anschließend wird ein Maler aus der Warteschlange geholt und der Timer gestartet. Danach wird der Maler über das zu malende Wort informiert und alle anderen Spieler über den Beginn einer neuen Runde und wer der Maler ist. Jedes mal wenn ein Spieler etwas schreibt, wird geprüft ob es mit dem zu erratenden Wort übereinstimmt. Zu beginn des Spiels werden die Punkte auf 250 gesetzt und jede Sekunde mit dem Faktor 0.98 multipliziert und somit verringert. Stimmt das eingegebene Wort mit dem zu erratenden überein, so ist die aktuelle Runde beendet und sowohl der Maler als auch derjenige, der das Wort erraten hat bekommen die verbleibenden Punkte gutgeschrieben. Sollte der Timer ablaufen, so wird das Spiel ohne einen Gewinner beendet. Zu ende des Spiels wird das zu erratene Wort aufgeklärt und ggf. der Gewinner bekanntgegeben. Sollte sich nach einer Runde noch ein Spieler in der Warteschlange befinden, wird eine neue Runde gestartet.
Der dritte Teil ist nun alles was übrig bleibt. Auf dem Server ist dies der Verbindungsaufbau und die Initialisierung der Bibliotheken sowie das bearbeiten neuer eingehender Verbindungen. Auf dem Client kommen noch einige Helper-Funktionen hinzu, die Aufgaben wie das Manipulieren des DOM übernehmen.
Das war es auch schon im Großen und Ganzen. Wessen Interesse ich mit diesem Artikel geweckt habe, der hat nun folgende Möglichkeiten:
