gruppe06-hufflepuff-projekt.../Bewertung_Siedler.md

135 lines
4.7 KiB
Markdown
Raw Normal View History

2021-12-16 15:42:56 +01:00
# Bewertung Catan
## 🥇 27.5 / 17.5 Punkte von 30
👫 brandleo@students.zhaw.ch; fassband@students.zhaw.ch; schrom01@students.zhaw.ch; zieglmic@students.zhaw.ch; amadoste@students.zhaw.ch
## Zusammenarbeit
* Durch untenstehende Probleme verursacht durch die Herren Ziegler und Amador werden pro Person 5 Punkte abgezogen (Total **10 Punkte**)
* Wiederholtes nicht Einhalten von Versprechen und Terminen
* Unverhältnismässiger Beitrag an produktivem Code
* Erinnerung:
* 4 ECTS Credits entsprechen 120 Arbeitsstunden
* Bei 12 Wochen bis zur letzten Abgabe sind das 10 Stunden pro Woche
* Bei zu wenig Zeit oder auch inhaltlicher Überforderung können Sie mögliche Optionen mit Olaf Stern (strf) und Patrick Feisthammel (fame)
* Ausnahme:
* Die Herren Brandenberger, Fassbind und Schenk erhalten **keinen** Abzug, da Sie alles versucht haben die Zusammenarbeit aufrecht und das Team intakt zu erhalten
## Grundfunktionalität
👨‍🏫 15.5 Punkte von 18
### Funktionalität (1.5 Punkte Abzug)
> Sie haben die Funktionalität wie gefordert umgesetzt.
* Strassen bauen:
* Können in das Wasser gehen
* Können durch gegnerische Siedlungen gebaut werden
* Würfeln
* Bei einem Wurf von 7 werden die halbierten Ressourcen aufgerundet, sollten aber abgerundet werden (bei 9 müssen 4 abgegeben werden)
* Problem: `resourceArrayList.size() - (resourceArrayList.size() / 2)` -> `resourceArrayList.size() / 2`
* `throwDice` sollte nur die Ressourcen zurückgeben, welche effektiv verteilt worden sind
* Die Initialen Siedlungen und Strassen werden nicht vom Pool abgezogen
### Clean Code und Konstrukte (0.5 Punkt Abzug)
> * Sie halten die Vorgaben hinsichtlich einsetzbarer Konstrukte ein.
> * Sie halten die Vorgaben hinsichtlich Clean Code ein.
* `SiedlerGameTest`
* Funktionsnamen sollten mit einem Kleinbuchstaben beginnen
* `new ArrayList<>(List.of(/* ... */))` kann direkt `List.of(/* ... */)` sein
### Klassendesign
> * Sie haben eine sinnvolle Aufteilung in Klassen und Klassendefinitionen gefunden.
> * Das Klassendiagramm zeigt die Aufteilung verständlich.
* Gute Klassenaufteilung
* Übersichtliches Diagramm
### Tests (0.5 Punkte Abzug)
> Sie haben sinnvolle Test Cases für die Klasse `SiedlerGame` definiert und diese erfolgreich ausgeführt.
* Es sollten komplette Collections mit equals verglichen werden und nicht nur die einzelnen Elemente:
```java
Assertions.assertEquals(0, resources.get(Config.Resource.BRICK));
Assertions.assertEquals(0, resources.get(Config.Resource.GRAIN));
Assertions.assertEquals(0, resources.get(Config.Resource.LUMBER));
Assertions.assertEquals(0, resources.get(Config.Resource.ORE));
Assertions.assertEquals(0, resources.get(Config.Resource.WOOL));
// should be:
Assertions.assertEquals(Map.of(
Config.Resource.BRICK, 0,
Config.Resource.GRAIN, 0,
Config.Resource.LUMBER, 0,
Config.Resource.ORE, 0,
Config.Resource.WOOL, 0
), resources);
```
* In `startSiedlerGameWithLowerThanMinimumWinPoints` hat es kein assert
### Dokumentation
> Ihr Code ist in `JavaDoc` sauber dokumentiert.
* Sehr gute Dokumentation
* Besonders die exakten Limitationen und Fehlerfälle
## Erweiterung «Städte»
👨‍🏫 5 Punkte von 5
> Die Erweiterung «Städte» ist mit Vererbung umgesetzt.
* Funktioniert wie gewünscht
## Erweiterung «Längste Strasse» oder «Räuber»
👨‍🏫 7 Punkte von 7
* «Längste Strasse» wurde umgesetzt
* Funktioniert wie gewünscht
## Zusätzliche Hinweise (nicht bewertet)
* Wenn `instanceof` verwendet wird, deutet das auf suboptimale Vererbung hin
* Folgendes könnte mit einer `getWinPoints` Funktion in den Structures gelöst werden
* Vorteil: Wenn eine neue Structure dazu kommt, muss nicht anderer Code angepasst werden
* Bei reinen Datenklassen lohnt es sich zu überlegen: Braucht es sie überhaupt? Können sie noch Funktionen brauchen?
```java
int newWinPoints = 0;
if (structure instanceof City) {
newWinPoints = 2;
} else if (structure instanceof Settlement) {
newWinPoints = 1;
}
```
* Der Return-Wert von `SielderGame.subtractResourceFromPlayer` wird nie verwendet
* Die Instanz von `Random` kann als `static final` definiert werden
* Weniger Objekte müssen erzeugt werden
* Vereinfacht das Reproduzieren von Abläufen mit Hilfe von einem Seed
* In `Siedler.gamePhase` sollte `parser.quit()` nach dem Loop ausgeführt werden
* Dies wurde vergessen, wenn der Player gewonnen hat
* Vereinfachung:
```java
boolean successful = false;
do {
if (game.placeInitialSettlement(parser.getPoint(), payout)) {
successful = true;
} else {
parser.errorMessage();
}
} while (!successful);
// can be written as
while (!game.placeInitialSettlement(parser.getPoint(), payout)) {
parser.errorMessage();
}
```