Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • main
  • update_api_v1
2 results

Target

Select target project
  • tcm-ss5-u1/progpr22-23-api
  • cly-wwp-u1/progpr22-23-api
2 results
Select Git revision
  • cly-wwp-u1-main-patch-86269
  • main
  • update_api_v1
3 results
Show changes
Commits on Source (8)
......@@ -19,10 +19,13 @@
### Standardport
* 42069
### Java
- v.18
### Andere Festlegungen:
- 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`
> - <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.*
......@@ -64,27 +67,36 @@
### [Struktur einer Nachricht](#v1/general/msg_structure)<a id="v1/general/msg_structure"></a>
Nachrichten sind aufgebaut nach dem Schema:
```
COMMAND;<ARGUMENT>[;[<OPTIONAL_ARG1>][;OPTIONAL_ARG2]]
COMMAND;<ARGUMENT>[;[<OPTIONAL_ARG1>][;OPTIONAL_ARG2]]\n
```
Jeder Teil der Nachricht ist mit einem `;` getrennt.
Die Daten können in Java mithilfe von `String.split(";");` ausgelesen werden.
<span class="opt">COMMAND:</span>
*COMMAND:*
Am Anfang steht immer der auszührende Befehl (*COMMAND*). Dieser gibt an, was ein Netzwerkteilnehmer tun soll.
<span class="opt"><ARGUMENT>:</span>
*\<ARGUMENT\>:*
Auf den *COMMAND* folgen jegliche Argumente, die zwingend erforderlich sind.
```
COMMAND;ARGUMENT1;ARGUMENT2;...
```
<span class="opt">[OPTIONAL_ARG]</span>:
*[OPTIONAL_ARG]:*
Auf das letzte *ARGUMENT* folgen alle optionalen Argumente.
Sollte bspw. nur *OPTIONAL_ARG2* übergeben werden kann die Nachricht wie folgt übermittelt werden:
```
COMMAND;ARGUMENT;;OPTIONAL_ARG2
```
*Ende der Nachricht (\n):*
Nachrichten werden durch einen Zeilenumbruch beendet (in Java "\n").
Wenn zum Lesen und Schreiben von Nachrichten über Sockets Hilfsklassen wie BufferedReader oder PrintWriter benutzt werden,
dann gibt es häufig Methoden wie readLine() oder println(), die praktischerweise bis zum nächsten Zeilenumbruch lesen oder
automatisch einen Zeilenumbruch hinten anfügen.
### [Ablauf der Verbindung](#v1/general/connection_timeline)<a id="v1/general/connection_timeline"></a>
![](Ablauf_Sequenzdiagramm.svg)
......@@ -101,11 +113,11 @@ HELLO;<VERSION>;<MAX_SEMESTER>;<USERNAME>
Die erste Nachricht der Verbindung und wird nach Herstellung der SocketVerbindung von dem Host an den Client gesendet.
**Argumente:**
* <span class="opt">VERSION:</span> Versionsnummer des Programms
* *VERSION:* Versionsnummer des Programms
* int: API_VERSION
* <span class="opt">MAX_SEMESTER:</span> Höchstes spielbares Semester des Client
* *MAX_SEMESTER:* Höchstes spielbares Semester des Client
* int: Ganzzahl $\in$ [1,6]
* <span class="opt">USERNAME:</span> Spielername des *Client*
* *USERNAME:* Spielername des *Client*
* String (UTF-8)
* Maximale Länge: 255 Zeichen
......@@ -118,7 +130,7 @@ Die erste Nachricht der Verbindung und wird nach Herstellung der SocketVerbindun
**Synopsis:**
```
HELLO_ACK;<VERSION>;<USERNAME>;<SEMESTER>
HELLO_ACK;<VERSION>;<SEMESTER>;<USERNAME>
```
**Beschreibung:**
Signalisiert de Start einer Session durch den *Host* an den *Client*.
......@@ -126,12 +138,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.*
**Argumente:**
* <span class="opt">VERSION:</span> Versionsnummer des Programms
* *VERSION:* Versionsnummer des Programms
* int: API_VERSION
* <span class="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]
* berechnet mit `min(hostSemester, clientSemester)`
* <span class="opt">USERNAME:</span> Spielername des *Host*
* *USERNAME:* Spielername des *Host*
* **String**:
* Encoding Format: UTF-8
* Maximale Länge 255 Zeichen
......@@ -170,7 +182,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.
**Argumente:**
* <span class="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]
**Antwort:**
......@@ -197,7 +209,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.
**Argumente:**
* <span class="opt">WHO</span>: Der beginnende Spieler
* *WHO*: Der beginnende Spieler
* String ∈ { "host", "client" }
**Antwort**
......@@ -226,9 +238,9 @@ FIRE;<ROW>;<COLUMN>
Greift den Gegenspieler auf einer Koordinate an. Die
**Argumente:**
* <span class="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]
* <span class="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]
**Antwort**
......@@ -248,9 +260,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.*
**Argumente:**
* <span class="opt">TYPE:</span> Das Ergebnis des Angriffs
* *TYPE:* Das Ergebnis des Angriffs
* **String** ∈ {"HIT", "MISS", "SUNK"}
* <span class="opt">GAME_OVER:</span> Letztes Schiff des Sendenden versenkt
* *GAME_OVER:* Letztes Schiff des Sendenden versenkt
* **String** $\in$ {"true"}
----
......@@ -263,7 +275,7 @@ END;<WINNER>
Bestätigt dem Client das Ende der Partie und teilt diesem das Ergebnis mit.
**Argumente:**
* <span class="opt">WINNER:</span> Das Ergebnis des Angriffs
* *WINNER:* Das Ergebnis des Angriffs
* **String** $\in$ {"host", "client"}
**Antwort**
......@@ -292,9 +304,9 @@ BYE;[<CODE>;<REASON>]
Informiert den Gegenspieler von einer gewollten (graceful) Beendigung der Verbindung.
**Argumente:**
* <span class="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
* <span class="opt">REASON (optional):</span> Eine Beschreibung warum die Verbindung beendet wurde
* *REASON (optional):* Eine Beschreibung warum die Verbindung beendet wurde
* **String**:
* Encoding Format: UTF-8
* Maximale Länge 255 Zeichen
......@@ -309,9 +321,9 @@ ERR;<CODE>;<REASON>
Informiert den Gegenspieler von einer unerwarteten Beendigung der Verbindung.
**Argumente:**
* <span class="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*)
* <span class="opt">REASON:</span> Eine Beschreibung warum die Verbindung beendet wurde
* *REASON:* Eine Beschreibung warum die Verbindung beendet wurde
* **String**:
* Encoding Format: UTF-8
* Maximale Länge 255 Zeichen
......