- Für den Host ist es uninteressant, ob der Client berechtigt ist auf einem Semester zu spielen. Es existiert demnach keine zentrale "Registry", welche den Fortschritt aller Nutzer trackt. Diese Aufgabe übernimmt jeder Host/Client für sich selbst intern.
- Für den Host ist es uninteressant, ob der Client berechtigt ist auf einem Semester zu spielen. Es existiert demnach keine zentrale "Registry", welche den Fortschritt aller Nutzer trackt. Diese Aufgabe übernimmt jeder Host/Client für sich selbst intern.
- Schiffe mit der Größe `8-Credits <= 0` werden aufgeteilt in einzelne Schiffe der Größe `8-Credits/2`
- Schiffe mit der Größe `8-Credits <= 0` werden aufgeteilt in einzelne Schiffe der Größe `8-Credits/2`
> - <span style="color:orange">***ACHTUNG*** Eine Größe von `1` ist für eine sinnvolle implementierung einer KI ungeeignet. Es ist sinnvoller die Formel `max(8-Credits, 2)` zu verwenden.</span>
> - <span style="color:orange">***ACHTUNG*** Eine Größe von `1` ist für eine sinnvolle implementierung einer KI ungeeignet. Es ist sinnvoller die Formel `max(8-Credits, 2)` zu verwenden.*
Die erste Nachricht der Verbindung und wird nach Herstellung der SocketVerbindung von dem Host an den Client gesendet.
Die erste Nachricht der Verbindung und wird nach Herstellung der SocketVerbindung von dem Host an den Client gesendet.
**Argumente:**
**Argumente:**
*<spanclass="opt">VERSION:</span> Versionsnummer des Programms
**VERSION:* Versionsnummer des Programms
* int: API_VERSION
* int: API_VERSION
*<spanclass="opt">MAX_SEMESTER:</span> Höchstes spielbares Semester des Client
**MAX_SEMESTER:* Höchstes spielbares Semester des Client
* int: Ganzzahl $\in$ [1,6]
* int: Ganzzahl $\in$ [1,6]
*<spanclass="opt">USERNAME:</span> Spielername des *Client*
**USERNAME:* Spielername des *Client*
* String (UTF-8)
* String (UTF-8)
* Maximale Länge: 255 Zeichen
* Maximale Länge: 255 Zeichen
...
@@ -126,12 +128,12 @@ Signalisiert de Start einer Session durch den *Host* an den *Client*.
...
@@ -126,12 +128,12 @@ Signalisiert de Start einer Session durch den *Host* an den *Client*.
*Diese Nachricht wird als Antwort auf eine [HELLO](#v1/api/hello)-Nachricht gesendet.*
*Diese Nachricht wird als Antwort auf eine [HELLO](#v1/api/hello)-Nachricht gesendet.*
**Argumente:**
**Argumente:**
*<spanclass="opt">VERSION:</span> Versionsnummer des Programms
**VERSION:* Versionsnummer des Programms
* int: API_VERSION
* int: API_VERSION
*<spanclass="opt">SEMESTER:</span> Das Semester auf dem die Session gespielt werden wird
**SEMESTER:* Das Semester auf dem die Session gespielt werden wird
***int**: Ganzzahl $\in$ [1,6]
***int**: Ganzzahl $\in$ [1,6]
* berechnet mit `min(hostSemester, clientSemester)`
* berechnet mit `min(hostSemester, clientSemester)`
*<spanclass="opt">USERNAME:</span> Spielername des *Host*
**USERNAME:* Spielername des *Host*
***String**:
***String**:
* Encoding Format: UTF-8
* Encoding Format: UTF-8
* Maximale Länge 255 Zeichen
* Maximale Länge 255 Zeichen
...
@@ -170,7 +172,7 @@ Stellt eine Anfrage an den Client während der Vorbereitungsphase, wie viele Sch
...
@@ -170,7 +172,7 @@ Stellt eine Anfrage an den Client während der Vorbereitungsphase, wie viele Sch
Sind alle Schiffe plaziert, wird stattdessen eine [READY_CHK](#v1/api/ready_chk)-Antwort vom Client gesendet.
Sind alle Schiffe plaziert, wird stattdessen eine [READY_CHK](#v1/api/ready_chk)-Antwort vom Client gesendet.
**Argumente:**
**Argumente:**
*<spanclass="opt">SHIPS_PLACED:</span> Anzahl der noch nicht platzierten Schiffe
**SHIPS_PLACED:* Anzahl der noch nicht platzierten Schiffe
***int**: Ganzzahl $\in$ (0, Anzahl der Schiffe]
***int**: Ganzzahl $\in$ (0, Anzahl der Schiffe]
**Antwort:**
**Antwort:**
...
@@ -197,7 +199,7 @@ BEGIN;<WHO>
...
@@ -197,7 +199,7 @@ BEGIN;<WHO>
Signalisiert dem Client durch den Host, dass die Vorbereitungsphase beendet und das Spiel begonnen wird. Der Host entscheidet durch einen Münzwurf (Zufall), welche Seite beginnt.
Signalisiert dem Client durch den Host, dass die Vorbereitungsphase beendet und das Spiel begonnen wird. Der Host entscheidet durch einen Münzwurf (Zufall), welche Seite beginnt.
**Argumente:**
**Argumente:**
*<spanclass="opt">WHO</span>: Der beginnende Spieler
**WHO*: Der beginnende Spieler
* String ∈ { "host", "client" }
* String ∈ { "host", "client" }
**Antwort**
**Antwort**
...
@@ -226,9 +228,9 @@ FIRE;<ROW>;<COLUMN>
...
@@ -226,9 +228,9 @@ FIRE;<ROW>;<COLUMN>
Greift den Gegenspieler auf einer Koordinate an. Die
Greift den Gegenspieler auf einer Koordinate an. Die
**Argumente:**
**Argumente:**
*<spanclass="opt">ROW:</span> Das Feld im Spielfeld welches beschossen wird
**ROW:* Das Feld im Spielfeld welches beschossen wird
***int**: im Intervall [0, Spielfeldgröße-1]
***int**: im Intervall [0, Spielfeldgröße-1]
*<spanclass="opt">COLUMN:</span> Das Feld im Spielfeld welches beschossen wird
**COLUMN:* Das Feld im Spielfeld welches beschossen wird
***int**: im Intervall [0, Spielfeldgröße-1]
***int**: im Intervall [0, Spielfeldgröße-1]
**Antwort**
**Antwort**
...
@@ -248,9 +250,9 @@ Gibt dem Gegenspieler eine Rückmeldung, ob der Angriff auf ein spezifisches Fel
...
@@ -248,9 +250,9 @@ Gibt dem Gegenspieler eine Rückmeldung, ob der Angriff auf ein spezifisches Fel
*Diese Nachricht wird als Antwort auf eine [FIRE](#v1/api/fire)-Nachricht gesendet.*
*Diese Nachricht wird als Antwort auf eine [FIRE](#v1/api/fire)-Nachricht gesendet.*
**Argumente:**
**Argumente:**
*<spanclass="opt">TYPE:</span> Das Ergebnis des Angriffs
**TYPE:* Das Ergebnis des Angriffs
***String** ∈ {"HIT", "MISS", "SUNK"}
***String** ∈ {"HIT", "MISS", "SUNK"}
*<spanclass="opt">GAME_OVER:</span> Letztes Schiff des Sendenden versenkt
**GAME_OVER:* Letztes Schiff des Sendenden versenkt
***String** $\in$ {"true"}
***String** $\in$ {"true"}
----
----
...
@@ -263,7 +265,7 @@ END;<WINNER>
...
@@ -263,7 +265,7 @@ END;<WINNER>
Bestätigt dem Client das Ende der Partie und teilt diesem das Ergebnis mit.
Bestätigt dem Client das Ende der Partie und teilt diesem das Ergebnis mit.
**Argumente:**
**Argumente:**
*<spanclass="opt">WINNER:</span> Das Ergebnis des Angriffs
**WINNER:* Das Ergebnis des Angriffs
***String** $\in$ {"host", "client"}
***String** $\in$ {"host", "client"}
**Antwort**
**Antwort**
...
@@ -292,9 +294,9 @@ BYE;[<CODE>;<REASON>]
...
@@ -292,9 +294,9 @@ BYE;[<CODE>;<REASON>]
Informiert den Gegenspieler von einer gewollten (graceful) Beendigung der Verbindung.
Informiert den Gegenspieler von einer gewollten (graceful) Beendigung der Verbindung.
**Argumente:**
**Argumente:**
*<spanclass="opt">CODE (optional):</span> Eine Zahl die ein konkretes Ergebnis (keinen Fehler) repräsentiert
**CODE (optional):* Eine Zahl die ein konkretes Ergebnis (keinen Fehler) repräsentiert
***int**: Eine positive Ganzzahl
***int**: Eine positive Ganzzahl
*<spanclass="opt">REASON (optional):</span> Eine Beschreibung warum die Verbindung beendet wurde
**REASON (optional):* Eine Beschreibung warum die Verbindung beendet wurde
***String**:
***String**:
* Encoding Format: UTF-8
* Encoding Format: UTF-8
* Maximale Länge 255 Zeichen
* Maximale Länge 255 Zeichen
...
@@ -309,9 +311,9 @@ ERR;<CODE>;<REASON>
...
@@ -309,9 +311,9 @@ ERR;<CODE>;<REASON>
Informiert den Gegenspieler von einer unerwarteten Beendigung der Verbindung.
Informiert den Gegenspieler von einer unerwarteten Beendigung der Verbindung.
**Argumente:**
**Argumente:**
*<spanclass="opt">CODE:</span> Eine Zahl die ein konkretes Ergebnis (keinen Fehler) repräsentiert
**CODE:* Eine Zahl die ein konkretes Ergebnis (keinen Fehler) repräsentiert
***int**: Eine negative Ganzzahl (siehe *Error Codes*)
***int**: Eine negative Ganzzahl (siehe *Error Codes*)
*<spanclass="opt">REASON:</span> Eine Beschreibung warum die Verbindung beendet wurde
**REASON:* Eine Beschreibung warum die Verbindung beendet wurde