Software-Projekt: Mensch ärgere Dich nicht Dokumentation – Softwareprojekt: Mensch ärgere Dich nicht Das Programm „Mensch ärgere Dich nicht“ ermöglicht das Spielen des gleichnamigen Spieles über Netzwerke. Jeder Spieler verfügt dabei über einen Clienten, der auch das Spielfeld darstellt. Die Verwaltung und Organisation des Spieles übernimmt dabei der Gameserver. Es findet stets nur eine Kommunikation von Server zu Client und anders herum statt. Ein Client weiß lediglich über die Anzahl der Mitspieler bescheid, nicht aber über deren Bezeichnungen und kann diese auch nicht direkt addressieren und ihnen Daten übermitteln. Der Datenaustausch findet mittels eines festgelegten Formates ([code,[information]], s.u. (Referenz)) statt. Auf diese Weise werden Befehle und Spieldaten übermittelt. Die Kommunikation wird über TCP realisiert. Um eine Verbindung herzustellen, muss im Fenster des Clienten im Login-Eingabefeldes der Hostname oder die IP eines Rechners eingegeben werden. Der Client baut dann TCPVerbindung zum Server, welcher auf dem TCP-Port 50008 lauscht, auf. Befindet sich auf diesem Rechner ein Gameserver, der noch Anmeldungen zulässt, wird verbunden. Der Spieler erhält dann als Login-Bestätigung die Nachricht „Viel Spaß!“ und die Spieleranzeige wird so geändert, dass unter der Spielernummer, die einem selbst zugeordnet ist, „Das bist du. Bitte warten.“ steht. Andernfalls wird eine Fehlermeldung ausgegeben und man kann es mit einer anderen Adresse versuchen. Die maximale Anzahl Clienten, die an einem Server angemeldet sein können, ist vier. Die minimale Anzahl Clienten, die angemeldet sein müssen, um ein Spiel zu starten, ist 1. Dabei wird die Anzahl der teilnehmenden Spieler beim Erstellen eines Servers festgelegt. Das Spiel startet erst, wenn die Anzahl an Teilnehmer erreicht ist. Anstelle eines oder mehreren menschlichen Spielern können auch KIs ausgewählt und gestartet werden. Diese erzeugen dann selbstständig einen Clienten und steuern diesen automatisch nach einem festgelegten Muster. Für andere Spieler erscheinen sie wie normale Spieler. Es könnten theoretisch mehrere Gameserver auf einem Rechner laufen, praktisch treten dabei aber Probleme auf. Es stellt jedoch kein Problem dar, einen Server und einen Clienten auf dem selben Rechner laufen zu lassen. In diesem Fall ist der Server dann außer mit der IP-Adresse noch über „localhost“ oder ein leeres Eingabefeld zugänglich. Sobald das Spiel gestartet ist, sind die Spieler abwechselnd an der Reihe. Der Server wartet, bis er Befehle vom Clienten, der zurzeit an der Reihe ist, erhält, und sendet daraufhin entsprechende Daten bzw. Befehle an diesen oder an alle Clienten (siehe Referenz) zurück. © 2009 LK-Informatik (Inf-2, LK16) Software-Projekt: Mensch ärgere Dich nicht 1. Klassendiagramm • • <<Client>> CustomFeld (feld.py) Definieren der ButtonKommandos (Versenden der Codes) Auslesen und verarbeiten der eingehenden Codes • <<Client>> Buffer (buffer.py) Puffert Daten • <<Server>> Gsgui (gsgui_ui.py) Aufbau der Gameserver-GUI • <<Server>> Brett (gameserver.py) verwaltet Spielstand-Daten • <<Server>> Buffer (buffer.py) Puffert Daten • <<Client>> Feld (feld_ui.py) Aufbau der Spielfeld-GUI • • <<Client>> NetClient (client.py) erzeugt Clienten Empfangen und Versenden von Daten <<Client>> (IntelligenzKIOpt.py, SichereIntelligenzKIOpt.py, SprinterKIOpt.py, UnwahrscheinlichkeitsKIOpt.py) • erzeugen computergesteuerte Clienten (KIs) • • • <<Server>> CustomGsgui (gsgui.py) Definieren der Button-Kommandos Aufrufen einer Gameserver-Instanz Aufrufen von KI-Instanzen • <<Server>> Spiel (gameserver.py) berechnet/überprüft Spieldaten • • • <<Server>> NetServer (server.py) erzeugt Server Empfangen und Verteilen der Daten Verbindungsaufbau zw. Clienten Die Pfeile zeigen, welche Klasse in welche importiert wird. Bei den Buffer-Klassen wird die selbe Klasse importiert, aber verschiedene Instanzen erzeugt. © 2009 LK-Informatik (Inf-2, LK16) Software-Projekt: Mensch ärgere Dich nicht 2. Erklärung der Klassen 2.1. Netzwerk Der Netzwerk-Teil des Programmes ermöglicht die Netztwerkverbindung und –kommunikation zwischen Gameserver und Client (GUI). 2.1.1. Buffer (buffer.py) Der Buffer ist ein Zwischenspeicher nach dem First-In-First-Out-Prinzip. Die Buffer-Klasse enthält Methoden, um Daten an den Buffer anzufügen bzw. auszulesen und entfernen. 2.1.2. NetServer (server.py) Die Klasse NetServer erzeugt einen Server. Die Klasse enthält Methoden, um Verbindungen zu Clienten aufzubauen und zu schließen, sowie Methoden, um Daten zu empfangen und an einen oder mehrere Clienten zu versenden. Die Klasse erzeugt dafür einen Buffer. 2.1.3. NetClient (client.py) Die Klasse NetClient erzeugt einen Clienten. Die Klasse enthält Methoden, um eine Verbindung zu einem Server aufzubauen und zu beenden und Methoden, um Daten an diesen Server zu senden bzw. von diesem zu empfangen. Die Klasse erzeugt dafür einen Buffer. 2.2. Gameserver Der Gameserver erzeugt zusammen mit dem NetServer einen Server. Der Gameserver verwaltet die Spieldaten und organisiert den Ablauf. 2.2.1. Brett (gameserver.py) Die Klasse Brett speichert die Daten des Spielstandes, d.h. auf welchen Feldern sich die Spielfiguren befinden, etc. Im weiteren enthält die Klasse Methoden, um diese Daten zurückzugeben oder zu überschreiben. 2.2.2. Spiel (gameserver.py) Die Klasse Spiel verwaltet den Spielablauf und Daten wie den Würfel und den aktuellen Spieler. Die Klasse enthält Methoden, um die Augenzahl des Würfels zu generieren, Figuren zu setzen (auf dem Feld, in die oder in der Zone, aus dem Haus raus oder hins Haus zurück) und den Spielablauf mit Befehlen (siehe Referenz) zu steuern. Die Klasse ruft dazu Instanzen des NetServers und des Bretts auf. © 2009 LK-Informatik (Inf-2, LK16) Software-Projekt: Mensch ärgere Dich nicht 2.2.3. Gsgui (gsgui_ui.py) Die Klasse Gsgui baut die Benutzeroberfläche zum Starten eines Gameservers auf. In ihr werden die Bauteile wie z.B. die Buttons definiert und konfiguriert und ihre Position festgelegt. 2.2.4. CustomGsgui (gsgui.py) In der Klasse CustomGsgui werden die Kommandos der Buttons der GUI definiert und die GUI gestartet. Mithilfe der Gui wird eine Instanz der Klasse Spiel erzeugt. 2.2.5. KIs (IntelligenzKIOpt.py, SichereIntelligenzKIOpt.py, SprinterKIOpt.py, UnwahrscheinlichkeitsKIOpt.py) Die KIs sind kein eigentlicher Bestandteil des Gameservers, werden aber von diesem gestartet. Die KIs rufen eine Instanz des Clients (ohne GUI) auf und steuern diesen nach einem festgelegten Verhaltensmuster. 2.3. GUI Die GUI erzeugt das Spielfenster. Zusammen mit dem NetClient bildet die GUI einen Clienten. 2.3.2. Feld (feld_ui.py) Die Klasse Gsgui baut die Benutzeroberfläche des Clienten auf. In ihr werden die nötigen Grafiken importiert und die Bauteile wie z.B. Buttons definiert und konfiguriert und ihre Position festgelegt. 2.3.1. CustomFeld (feld.py) Die Klasse CustomFeld enthält Methoden zum Steuern der Hintergrundmusik, zum Anmelden bei einem Server, zum Auslesen der empfangenen Daten, zum Enablen und Disablen mehrerer Buttons, zum Aktualisieren der Spieldaten, definiert die Kommandos der Buttons (siehe Referenz) und führt die GUI aus. Dazu ruft die Klasse eine Instanz des NetClients auf. © 2009 LK-Informatik (Inf-2, LK16) Software-Projekt: Mensch ärgere Dich nicht 3. Referenz Der Server und die Clienten schicken Daten in der Form [code,[informationen]]. Dabei ist code bei Daten, die vom Client an den Server geschickt werden, mit einer Zahl von 0 bis 10 nummeriert und Daten, der der Server an die Clienten schickt, haben eine Zahl von 50 bis 55. Die Daten werden in den Methoden i.d.R. als data übergeben. Daten, deren Bezeichnung in der Tabelle mit einem Sternchen (*) gekennzeichnet sind, werden an alle Clienten gleichzeitig geschickt. Ohne Sternchen erhält nur der Client des aktuellen Spielers diese Daten (betrifft nur Daten, die vom Server geschickt werden. [code,[information]] [0,[]] [1,[]] [2,[augenzahl]] Bezeichnung aus wuerfel_rollen wuerfel_sehen* [3,[spielernummer,[zone0, zone_sehen* zone1, zone2, zone3]] [4,[spielernummer, figurenanzahl]] haus_sehen* [5,[feld0,feld1,...,feld47]] spielfeld* [6,typ,[feldnummer]] zug_falsch [7,[]] hausakt [8,[spielernummer]] beendet* [9,[spielernummer]] dran* [10,[?]] buttonakt [50,[]] [51,[feldnummer]] fertig zug_machen [52,[]] [53,[spielernummer]] wuerfeln haus_setzen © 2009 LK-Informatik (Inf-2, LK16) Effekt/Erklärung Buttons des Spielers werden disbaled. Der Würfel wird enabled. Der Würfel wird aktualisiert. augenzahl entspricht der neuen Augenzahl des Würfels. Die Zone des Spielers mit der spielernummer wird aktualisiert. Für zone0 bis zone4 steht jeweils eine Zahl von 0 is 4 (entsprechend der Referenz, s.u.). Das Haus des Spielers mit der spielernummer wird aktualisiert. Dabei entspricht figurenanzahl der Anzahl der Figuren inm Haus. Aktualisiert das Spielfeld. Für feld0 bis feld47 steht jeweils eine Zahl von 0 bis 4 (entsprechend der Referenz, s.u.). Das Feld mit der Nummer feldnummer wird disabled. Ist typ eine 51, handelt es sich um ein Feld des Spielfeldes, ist typ eine 54, handelt es sich um ein Zonenfeld des aktuellen Spielers. Das Haus wird enabled. alle anderen Felder werden disabled. Die Statusanzeige wird aktualisiert. Die Verbindung zum Server wird getrennt. spielernummer ist die Nummer des Spielers, der gewonnen hat. Die Hintergrundfarbe der Statusanzeige wird auf die Farbe des Spielers mit der spielernummer geändert. Alle Feld-Buttons, die für den Spieler verfügbar sind (d.h. alle Felder außer den Häusern und Zonen der gegnerischen Spieler) werden enabled. Zug beendet, nächster Spieler Prüfen und ggf. Setzen der Figur, die sich auf dem Feld mit der feldnummer befindet. Augenzahl des Würfels wird generiert. Prüfen und ggf. Setzen einer Figur aus dem Software-Projekt: Mensch ärgere Dich nicht [54,[zonenfeldnummer]] zone_setzen [55,[]] neues_spiel Haus des Spielers mit der spielernummer auf den Pott. Prüfen und ggf. Setzen der Figur, die sich auf dem Zonenfeld mit der zonenfeldnummer befindet. Die Farbe der Zone ist die selbe wie die des aktuellen Spieler. Ein neues Spiel mit den selben Spielern und dem selben Server wird gestartet. Die Felder des Spielfeldes sind mit 0 bis 47 nummeriert, die Zonenfelder mit 0 bis 3, wobei 3 nirgends übergeben oder versendet wird, da 3 nicht mehr gesetzt werden kann (letztes Feld). Die Zuordnung der Farben ist folgendermaßen: (leer = 0) Gelb = 1 Grün = 2 Rot =3 Blau = 4 © 2009 LK-Informatik (Inf-2, LK16) Software-Projekt: Mensch ärgere Dich nicht 4. Erklärung der GUI Spielfigur Pott Haus Spieleranzeige Login-Bereich Statusanzeige Würfel Zonenfeld Zone Feld des Spielfeldes (alle Felder außer Häuser und Zonen) © 2009 LK-Informatik (Inf-2, LK16)