imd2019 / kniffel-server

Serveranwendung für Kniffelspiele auf Basis von Node.js, mit Bibliothek zur Einbindung auf Clientseite
MIT License
0 stars 0 forks source link

Kniffel-Server

Studiengang Interactive Media Design, Sommersemester 2020.

Leander Schmidt, Florian Beck, Garrit Schaap (Betreuung).

Spielablauf

Um dem Server beizutreten, muss ein persönlicher Nutzername angelegt werden. Nutzernamen können mehrfach vorkommen, allerdings empfiehlt es sich der Unterscheidbarkeit halber, einen möglichst eindeutigen und einmaligen Nutzernamen zu wählen.

Nachdem man dem Server beigetreten ist, befindet man sich zunächst in der Lobby, wo einem alle vorhandenen Spiele angezeigt werden, sowie deren Größe und wieviele Spieler bereits beigetreten sind.

Hier kann man nun einem vorhandenen Spiel beitreten oder ein neues Spiel erstellen. Dabei werden der Name des Spiels sowie die maximale Spielerzahl (Größe) festgelegt und ob das Spiel den vollständigen Kniffel-Block spielen soll oder nur die obere Hälfte.

Sind alle Spieler beigetreten, kann das Spiel gestartet werden. Dabei wird ein zufälliger Startspieler festgelegt. Dann wird reihum je bis zu dreimal gewürfelt, wobei jedes Mal Würfel gesperrt werden können, ein Feld gewählt und das Ergebnis darin gespeichert, sofern es noch frei ist.

Verlässt ein Spieler während des Spiels den Raum, wird dies den restlichen Spielern angezeigt, der Spieler wird entfernt und es ist automatisch der nächste Spieler an der Reihe.

Ist das Spiel beendet kann es, sofern gewünscht, neu gestartet werden.

Verlassen alle Spieler ein Spiel, wird es gelöscht.

Einbindung der Client-Bibliothek

Ablegen der Dateien im Ordnerpfad

Die Client-Bibliothek besteht aus der Klasse Client und einer eingebundenen Verschlüsselungsmethode. Sie liegt in folgender Ordnerstruktur vor:

Diese Ordnerstruktur muss im Ordnerpfad der Javascript-Anwendung abgelegt werden.

Einbinden der Klasse Client

Die Klasse Client wird wie folgt in den Javascript-Code eingebunden:

import Client from "./path/client.js";

let client = new Client();

path wird dabei durch den Ordnerpfad entsprechend der tatsächlichen Ordnerstruktur ersetzt.

Außerdem muss die Einbindung in den head-Bereich der HTML-Datei erfolgen:

<head>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.0/socket.io.js"></script>
  <!-- ... -->
</head>

Verbindung zum Server herstellen

Die Verbindung zum Server wird durch Aufruf der Methode client.connect() hergestellt. Ein Aufruf kann wie folgt aussehen:

client.connect("user", "ILoveIMD2020", "https://www.beispielserver.de/");

Verwenden der Methoden und Eventhandler

Spiel anlegen oder vorhandenem Spiel beitreten

Ist man mit dem Server verbunden, kann man einem Spiel beitreten oder selbst ein Spiel anlegen. Hierzu kann man eine Liste der vorhandenen Spiele abrufen:

client.getGamesList();

Den Rückgabewert des Servers kann man über den zugehörigen Eventhandler abrufen:

client.addEventListener(client.eventNames.GAMES_LIST_RETURNED, (e) => {
    myFunction(e.detail);
})

wobei mit e.detail im Funktionsaufruf an das Event angeheftete Parameter übergeben werden können (siehe hierzu auch in der Eventhandler-Übersicht).

Um einem Spiel beizutreten, ruft man

client.joinGame(name);

auf, wobei man den Namen des Spiels als Parameter übergibt. Der analog zu oben eingesetzte Eventhandler für den Rückgabewert ist GAME_JOINED. Tritt ein Fehler auf, wird das Event GAME_NOT_JOINED aufgerufen. Zudem wird bei den anderen im Raum befindlichen Clients das Event PLAYER_JOINED aufgerufen.

Ein neues Spiel erstellt man wie folgt:

client.createGame("IMD-Club", 5, true);

wobei man den Namen des Spiels und die maximale Spielerzahl übergibt. Der dritte Parameter legt fest, ob ein einfaches (false) oder vollständiges (true) Kniffel-Spiel erstellt werden soll. Auch hier wird im Anschluss analog zu oben ein Event GAME_CREATED bzw. GAME_NOT_CREATED aufgerufen.

Spielablauf

Spielstart

Ein Spiel kann gestartet werden, sobald ihm Spieler beigetreten sind. Hierzu wird die Methode startGame() aufgerufen:

client.startGame();

Es wird dabei stets das Spiel gestartet, dem der Spieler beigetreten ist, der die Methode aufruft. Der Spielstart triggert GAME_STARTED.

Spielzüge

Ein Spielzug besteht aus bis zu dreimal Würfeln, ggf. Sperren von Würfeln, Wählen eines Feldes und Speichern. Nachfolgend ist ein beispielhafter Spielzug dargestellt:

client.roll();
client.roll([1, 4]);
client.roll([0, 1, 4]);
client.saveResult(client.fields.THREES);

Dabei werden die gesperrten Würfel roll() in Form ihrer Indizes in einem Array übergeben. Das gewählte Feld wird beim Speichern in Form eines Werts aus dem Enumerable client.fields übergeben. Für eine Übersicht aller möglichen Werte siehe unten in der Methodenübersicht. Der Aufruf der Methode triggert das Event DICE_ROLLED oder ROLL_NOT_ALLOWED. Nach jedem Spielzug wird zudem bei allen Clients das Event UPDATE_PLAYERS aufgerufen, um die aktualisierten Daten zu den Spielern zu übergeben.

Spielende oder Verlassen eines Spiels

Nach Spielende kann ein Spiel neu gestartet werden. Dabei verbleiben alle Spieler im Spiel, die Würfel und alle gespeicherten Felder werden zurückgesetzt:

client.restartGame();

Ein Spiel kann zu jedem Zeitpunkt durch Aufrufen der leaveGame()-Methode verlassen werden:

client.leaveGame();

Dabei wird das zugehörige Spielerobjekt gelöscht und der nächste Spieler kommt automatisch an die Reihe. Selbiges gilt, wenn die Verbindung zum Server durch einen Reload oder fehlende Internetverbindung unterbrochen wird. Dies triggert das Event PLAYER_LEFT

Verlassen alle Spieler ein Spiel, wird dieses gelöscht.

Methodenübersicht

Nachfolgend sind noch einmal alle Methoden von Client aufgeführt:

Eventhandler-Übersicht

Nachfolgend sind noch einmal alle Eventhandler von Client aufgeführt:

wobei bei den eingetragenen Würfelergebnissen null für ein leeres Feld (also noch kein Wert eingetragen) steht.

Exception Handling

Nachfolgend ist eine Liste aller möglichen Fehlermeldungen auf Client-Seite dargestellt: