# Beispielprogramme des Programmierprojekts

Hier ist der Quellcode für das in der Einarbeitungsphase genutzte Spiel
_Battleships_ zu finden. Die Quellen bestehen aus den folgenden
Gradle-Unterprojekten:

* _:battleship:server_
* _:battleship:client_
* _:battleship:model_
* _:battleship:converter_
* _:common_
* _:jme-common_

_Battleships_ ist ein netzwerkbasiertes Spiel und besteht aus einem Server- und
einem Clientanteil, die in den Unterprojekten _:battleship:server_ und
_:battleship:client_ realisiert sind. Beide nutzen das Unterprojekt
_:battleship:model_, das den gemeinsamen Modellanteil enthält.

Die Unterprojekte _:common_ und _:jme-common_ enthalten Hilfsklassen.

Das Unterprojekt _:battleship:converter_ wird für _Battleships_ selbst nicht
benötigt, sondern enthält lediglich den Code, um ein im Spiel verwendetes
3d-Modell eines Schlachtschiffs in eine _J3O_-Datei umzuwandeln, die von jME
einfacher geladen werden kann.

## 1 Vorbereitung

Für das Programmierprojekt empfehlen wir die Verwendung von Java 20. Unter Linux
sollte [_Eclipse Temurin_](https://adoptium.net/temurin/releases/?version=20)
als JDK verwendet werden, andere JDKs können unter Linux Probleme verursachen.
Auf anderen Betriebssystemen empfehlen wir aber ebenfalls Temurin. Im Folgenden
ist beschrieben, wie Sie Temurin installieren und die Umgebungsvariable
**JAVA_HOME** richtig setzen, damit Sie Gradle (siehe unten) verwenden können.

### 1.1 Installation von Temurin

Laden Sie [_Eclipse Temurin_](https://adoptium.net/temurin/releases/?version=20)
entsprechend Ihrem Betriebssystem und Ihrer Prozessorarchitektur herunter und
entpacken Sie das Archiv in einem Verzeichnis Ihrer Wahl auf Ihrem Rechner.

### 1.2 Setzen von JAVA_HOME

Zur Verwendung mit Gradle muss die Umgebungsvariable **JAVA_HOME** richtig
gesetzt werden. Folgen Sie dazu den nachfolgenden Anweisungen entsprechend Ihrem
Betriebssystem:

* **Windows:**

  Öffnen Sie ihre Powershell (Core) bzw. ihr Windows Terminal mit Powershell
  (Core). Überprüfen Sie, ob die Umgebungsvariable korrekt gesetzt ist:  
  `Get-ChildItem -Path Env:JAVA_HOME`  
  Falls kein oder ein falscher Pfad gesetzt ist, setzen Sie diesen mit dem
  folgenden Kommando (in einer Zeile):  
  `[System.Environment]::SetEnvironmentVariable('JAVA_HOME','<Pfad zum SDK>',[System.EnvironmentVariableTarget]::User)`

  Alternativ können Sie die GUI verwenden. Unter Windows 10 klicken Sie die
  Windows-Taste und dann das Zahnrad um die Einstellungen zu öffnen. Dort wählen
  Sie "System", dann "Info" (links unten) und nun
  "Erweiterte Systemeinstellungen" (rechts) um den Dialog "Systemeigenschaften"
  zu starten. Im Reiter "Erweitert" klicken Sie
  "Umgebungsvariablen..." und klicken dann unter "Benutzervariablen" den Knopf
  "Neu..." um JAVA_HOME anzulegen oder "Bearbeiten" um ihn zu ändern. Geben Sie
  als Name `JAVA_HOME` und als Wert den Pfad ein. Schließen Sie mit "OK".

  > **(!) Beachten Sie, dass Sie die jeweilige Applikation neu starten müssen**,
  > um von der gesetzten Umgebungsvariablen Notiz zu nehmen.
  > Dies betrifft auch die Shell, die Sie gerade verwenden.

* **UNIX (Linux/MacOS):**

  Öffnen oder erstellen Sie die Datei `~/.profile` (wenn Sie die Bash verwenden;
  bei anderen Shells sind es andere Dateien) und ergänzen Sie am Ende der Datei
  die Zeile:

  `export JAVA_HOME="<Pfad zum entpackten Archiv>"`

  Ersetzen Sie dabei `<Pfad zum entpackten Archiv>` mit dem entsprechenden Pfad.
  Zum Beispiel:

  `export JAVA_HOME="/home/user/jdk-20.0.2"`

  Fügen Sie dann die folgende Zeile hinzu:

  `export PATH="$JAVA_HOME/bin:$PATH"`

## 2 Programmstart

Grundsätzlich kann man das gesamte Projekt einfach in IntelliJ öffnen. Details
dazu sind im Aufgabenblatt zur Einarbeitungsaufgabe zu finden. Im Folgenden ist
beschrieben, wie die _Batttleships_ unmittelbar von der Kommandozeile gestartet
werden können.

Um _Battleships_ spielen zu können, muss man zuerst das Server-Programm auf
einem Rechner und dann zweimal das Client-Programm auf beliebigen Rechnern
starten, die TCP/IP-Verbindungen zum Server erlauben. Natürlich ist es auch
möglich, alle drei Programme auf demselben Rechner zu starten.

Es empfiehlt sich der Start von der Kommandozeile. Will man alle drei Programme
auf demselben Rechner starten, sollte man dazu drei Shell-Instanzen öffnen und
in jeder eines der Programme starten. Auf diese Weise können die
Logging-Ausgaben der drei Programme voneinander unterschieden werden.

Das Server-Programm startet man unmittelbar mit Gradle mit

`./gradlew :battleship:server:run`

Unter Windows kann es je nach Shell (Eingabeaufforderung cmd) erforderlich sein,
`/` jeweils durch `\ ` zu ersetzen.

Im Verzeichnis `battleship/server` befindet sich die Datei `config.propeties`,
worüber sich der Server konfigurieren lässt. Mit der Zeile `port=1234` lässt
sich der verwendete Server-Port (hier 1234) einstellen. Außerdem befindet sich
dort die Datei `logging.properties`, womit das Logging des Servers konfiguriert
wird.

Das Client-Programm startet man unmittelbar mit Gradle mit

`./gradlew :battleship:client:run`

Die Datei `logging.properties` im Verzeichnis `battleship/client` konfiguriert
das Logging des Clients.

Alternativ kann man auch die Start-Skripte

* `./battleship/server/build/install/battleship-server/bin/battleship-server`
* `./battleship/client/build/install/battleship/bin/battleship`

direkt in der Kommandozeile starten. Allerdings müssen sie zuvor mittels

`./gradlew installDist`

erzeugt worden sein. Beachten Sie aber, dass nur im **aktuellen
Arbeitsverzeichnis** nach den Dateien `config.properties` und
`logging.properties` gesucht wird und diese geladen werden. Das heißt, dass die
vordefinierten Dateien in den Verzeichnissen `battleship/server` und
`battleship/client` nur dann gelesen werden, wenn Sie diese Verzeichnisse als
aktuelle Arbeitsverzeichnisse nutzen. Wie üblich müssen Sie dazu in der
Kommandozeile

`cd battleship/server`

bzw.

`cd battleship/client`

eingeben.

## 3 Hinweise zu _Battleships_

Der _Battleships_-Client hat ein Menü, in das man immer mit der
Esc-Taste kommt. Aus dem Menü heraus lässt sich das Programm auch schließen.
Beachte, dass sich beim Laden und Speichern eines Spiels kein Dateidialog
öffnet. Vielmehr muss man den Dateipfad in das Dialogfeld eingeben. Da
JSON-Dateien geschrieben werden, empfiehlt sich das Datei-Suffix _.json_.

## 4 Allgemeine Gradle-Tasks:

- `./gradlew clean`

  Entfernt alle `build`-Verzeichnisse und alle erzeugten Dateien.

- `./gradlew classes`

  Übersetzt den Quellcode und legt unter build den Bytecode sowie
  Ressourcen ab.

- `./gradlew javadoc`

  Erzeugt die Dokumentation aus den JavaDoc-Kommentaren im Verzeichnis
  `build/docs/javadoc` des jeweiligen Unterprojekts.

- `./gradlew test`

  Führt die JUnit-Tests durch. Ergebnisse sind im Verzeichnis
  `build/reports/tests` des jeweiligen Unterprojekts zu finden.

- `./gradlew build`

  Führt die JUnit-Tests durch und erstellt in `build/distributions`
  gepackte Distributionsdateien

- `./gradlew installDist`

  Erstellt unter `battleship/client/build/install` und
  `battleship/server/build/install` Verzeichnisse, die jeweils eine ausführbare
  Distribution samt Start-Skripten enthält (siehe oben).

---
Juli 2024
