# Battleship Game
## Einleitung
Dies ist ein Auftrag für die Implementierung eines Battleship-Prototypen. Es handelt sich dabei um eine vereinfachte Version des Spieleklassikers "Schiffe versenden".
Da es sich um ein didaktisches Projekt handelt, gibt es einige Einschränkungen, die in den Anforderungskatalog und im vorgegeben Systemdesign liegen. Diese Einschränkungen sollen dabei helfen, die didaktischen Ziele zu erreichen
## Didaktische Ziele
1. Tieferes Verständnis für die prozedurale Programmierung in Java
2. Trainieren von Programmieren als Fertigkeit, können.
3. Erkennen des Mehrwertes der Abstraktion in der Programmierung
4. Erste Erfahrungen im Arbeiten mit einem Software-Entwicklungs-Prozess
5. Entwickeln der Kompetenz, in einem Team das Software-Ziel zu erreichen
6. Erkennen von Teamrollen in einem Softwareprojekt neben der reinen Programmier-Aufgabe
## Systemdesign
### Methodendesign
Es muss ein High-Level PAP (Programmablaufplan) für das Spiel erstellt werden. Auf diesem Plan soll in etwa auf Methodenebene erkennbar sein, welche Methoden es geben kann und wo sich der Spielablauf wiederholt.
### Anforderungskatalog
#### Funktionale Anforderungen
1. Das System MUSS ein quadratisches Schpielfeld für das Spiel verwenden, die über eine Variable verändert werden kann.
2. Das System MUSS die Konsole als Bildschirmausgabe nutzen
3. Ein Schiff KANN mit dem Zeichen "s" dargestellt, Wasser mit dem Zeichen "-", ein Treffer mit "x"
4. Der Benutzer MUSS erst nach der Zeile (row) und dann nach der Spalte (col) gefragt werden.
5. Das System MUSS dann überprüfen, ob an der Stelle Wasser oder ein Schiff liegt. Das System gibt dann "Hit" oder "Miss" aus.
6. Das System KANN dem Spieler auch anzeigen, ob die gewählte Stelle bereits beschossen wurde.
7. Das System KANN dem Nutzer eine Punktzahl anzeigen. Diese MUSS sich aus dem Verhältnis zwischen Treffern und Fehlschlägen zusammensetzen. Die Punktzahl KANN die Zeit mit einrechnen.
8. Das System KANN den Nutzer nach einem erfolgreichem Spiel auffordern, eine weitere Runde zu spielen.
9. Das System KANN den Schwierigkeitsgrad bei einer neuen Runde steigern.
#### Nicht-Funktionale Anforderungen
1. Das System MUSS prozedural in Java programmiert werden. Da es sich um eine didaktische Entwicklung handelt, können keine Objekte eingesetzt werden
2. Das System MUSS ausschließlich "Call-By-Reference" verwenden, "Call-By-Value" Aufrufe sind nicht gewünscht.
3. Das System DARF KEINE globalen Variablen.
4. Die Main-Methode des Programmes MUSS die wichtigsten Variablen und die Spiel-Logik enthalten. Alle Aufgaben neben der Spiellogik, die mehr als eine Zeile Code benötigen, sind ausgelagert in Methoden (Beispiel: createGameBoard())
5. Die Teams MÜSSEN das Modell Scrum im Vorgehen verwenden.
6. Ein Version-Control-System (z.B. Git) wird verwendet.
7. Es KANN ein Framework für Unit-Tests eingesetzt werden (z.B. JUnit).
8. Es MÜSSEN Dokumentationen für jede Methode in Java-Doc vorliegen.
#### Anforderungen als User-Stories
- Grundlegende Spielmechanik:
- - Als Spieler möchte ich ein neues Spiel beginnen können, um gegen meinen Computer-Gegner anzutreten.
- - Der Computergegner sagt mir, wieviele Schiffe noch übrig sind.
- - Ich feuere jede Runde auf eine beliebige x und y Koordinate und bekomme eine Rückmeldung, ob ich ein Schiff getroffen habe
- - Ein Schiff geht mit einem Treffer unter.
- Benutzeroberfläche (UI):
- - Als Spieler möchte ich das Spielbrett grafisch sehen können, um meine Schüsse zu planen.
- - Als Spieler möchte ich visuelle Rückmeldungen über Treffer und Verfehlungen erhalten, um den Spielverlauf zu verstehen.
- Einstellungen
- - Als Spieler möchte ich die Größe des Spielbretts wählen können, um die Spielschwierigkeit anzupassen.
- Spielerinteraktion
- - Als Spieler möchte ich Schusskoordinaten eingeben können, um auf dem Spielbrett zu schießen.
- - Als Spieler möchte ich Statistiken über meinen Spielfortschritt sehen, um meine Leistung zu bewerten.
- Dokumentation:
- - Als Benutzer möchte ich eine Anleitung lesen können, um das Spiel zu verstehen und zu spielen
## Vorgehen

(Quelle: https://www.scrum.org/learning-series/what-is-scrum)
Im Projekt wird eine abgespeckte Variante des agilen Vorgehensmodells "Scrum" verwendent. Geht mit dem Team die folgenden Phasen anhand der Checklisten durch.
### Ziel:
Wenn euer Team alle Quality Gates durchlaufen hat, habt ihr eure erste Release-Version von Battleship erstellt und seit fertig.
Die Quality Gates findet ihr im Dokument "Quality Gates". Jedes dieser Quality Gates muss der Reihenfolge durchlaufen werden und wird vom Lehrer abgenommen. Es kann immer nur ein Quality Gate in einem Termin abgeschlossen werden.