add necessary classes to project
main
dustineversmann 2024-04-30 11:45:01 +02:00
parent 5af379f615
commit 1c016874ec
10 changed files with 143 additions and 34 deletions

View File

@ -1,2 +0,0 @@
public class Main {
}

View File

@ -1,41 +1,52 @@
# Kniffel # Kniffel
# Aufgabenstellung Heimarbeit für 07.05. ### Aufgabenstellung Heimarbeit für 07.05.
Um für eine wenig Entspannung zu sorgen, wollen wir in diesem Testat ein Kniffel-Spiel (auch bekannt als Yatzee) entwickeln. Dabei handelt es sich um eine Art Poker, das allerdings mit fünf Würfeln gespielt wird. Ziel ist es mit 3 Würfen pro Spielrunde in verschiedenen Kategorien möglichst viele Punkte zu erzielen. Um für eine wenig Entspannung zu sorgen, wollen wir in diesem Testat ein Kniffel-Spiel (auch bekannt als Yatzee) entwickeln. Dabei handelt es sich um eine Art Poker, das allerdings mit fünf Würfeln gespielt wird. Ziel ist es mit 3 Würfen pro Spielrunde in verschiedenen Kategorien möglichst viele Punkte zu erzielen.
Folgende Funktionalität ist dafür gefordert: ### Funktionalität
Da gerade der Star-Wars-Tag (May, the Fourth...) vor der Türe steht, soll unser Kniffel eine Special-Edition werden und mit optional mit Würfeln bis zu 8 Augen gespielt werden können (vgl. unten). Achten Sie daher darauf, die Augenzahl (also 6 oder 8) an genau einer Stelle im Programm zu setzen. Da gerade der Star-Wars-Tag (May, the Fourth...) vor der Türe steht, soll unser Kniffel eine Special-Edition werden
Es soll möglich sein, dass das Spiel von 1 bis 6 Personen gespielt wird. - optional mit Würfeln bis zu 8 Augen gespielt werden können (vgl. unten). Achten Sie daher darauf, die Augenzahl (also 6 oder 8) an genau einer Stelle im Programm zu setzen.
Diese sollen zu Beginn alle ihren Namen eingeben können. - Es soll möglich sein, dass das Spiel von 1 bis 6 Personen gespielt wird.
Am Ende eines Spiels sollen die erzielten Punktzahlen in einer textuellen Highscore-Liste (mit Name, Punktzahl und Datum) gespeichert werden, die beim Start des Programms wieder geladen wird. - Diese sollen zu Beginn alle ihren Namen eingeben können.
Die Highscore-Liste soll vom Hauptmenü aus erreichbar und auf Wunsch nach einer Sicherheitsabfrage löschbar sein. - Am Ende eines Spiels sollen die erzielten Punktzahlen in einer textuellen Highscore-Liste (mit Name, Punktzahl und Datum) gespeichert werden, die beim Start des Programms wieder geladen wird.
Unsere Special Edition soll eine spezielle Kategorie "Star Wars Day" bekommen, in der nur die Punkte von Vieren und Fünfen in beliebiger Kombination zählen. - Die Highscore-Liste soll vom Hauptmenü aus erreichbar und auf Wunsch nach einer Sicherheitsabfrage löschbar sein.
Ferner soll es in dieser Spielvariante mit bis zu 8 Augen noch die Kategorie "R2D2" geben, in der die Kombination 1 8 2 4 2 mit 42 Punkten bewertet wird. (R = 18. Buchstabe im Alphabet, 2, D = 4. Buchstabe + nochmal 2) Unsere Special Edition soll eine spezielle Kategorie "Star Wars Day" bekommen:
Diese Variante soll zusätzlich noch über die Kategorien Siebener und Achter verfügen. - nur die Punkte von Vieren und Fünfen in beliebiger Kombination zählen.
Ferner soll der Bonus dort erst ab 108 Punkten "ausgeschüttet" werden. - Kategorie "R2D2"
Bitte achten Sie auf folgende nicht-funktionale Anforderungen bzw. Entwurfsvorgaben: - in der die Kombination 1 8 2 4 2 mit 42 Punkten bewertet wird. (R = 18. Buchstabe im Alphabet, 2, D = 4. Buchstabe + nochmal 2)
- Diese Variante soll zusätzlich noch über die Kategorien Siebener und Achter verfügen.
- Ferner soll der Bonus dort erst ab 108 Punkten "ausgeschüttet" werden.
Die Verwendung einer Layered Architecture inkl. eines sauber objektorientierten Domain-Layers, wie in der Vorlesung vorgestellt, ist obligatorisch.
Entscheiden Sie selbst, ob Sie das Spiel lieber mit einer TUI oder einer GUI implementieren möchten.
Erstellen Sie eine textuelle und nummerierte Beschreibung mindestens des Gameflows (alias User Goal Use Case "Kniffel spielen") und laden Sie diese als gameflow.txt in das Hauptverzeichnis Ihres Gitty hoch. Sie dürfen/sollen dort "Schleifenkonstrukte" (z.B. "weiter bei Schritt 4 bis alle Spieler diesen Schritt ausgeführt haben"), verwenden. Achten Sie auf das "Ping-Pong-Spiel" zwischen User und System.
Achten Sie darauf, dass Fehler beim Laden oder Speichern der Highscore-Liste nicht zum Abbruch des Programms führen und fangen Sie evtl. auftretende Exceptions (s. VL für den 02.05.).
Für die Bewertung der Punktzahlen für die jeweilige Kategorie bietet sich eine Vererbung an.
Folgende administrative Rahmenbedingungen gelten:
Die Abgabe erfolgt individuell und ausschließlich über das Gitty der Hochschule. Deadline dafür ist das Ende der Übung am 07.05.24. ### nicht-funktionale Anforderungen bzw. Entwurfsvorgaben:
Es sind mindestens 12 Commits mit sinnvollen Code-Fortschritten im Gitty vorzuweisen.
Die Besprechung der Abgabe mit den Betreuern (Abnahme) soll möglichst in der Übung am 07.05.24 erfolgen, die Entscheidung über Nachtermine liegt im Ermessen der Betreuer und setzt das Erreichen eines sinnvollen Stands am 07.05. voraus.
Bei der Abnahme ist ein klares Verständnis des vorgelegten Codes nachzuweisen, wir behalten uns vor, Sie Code-Teile live neu schreiben zu lassen, wenn wir daran Zweifel haben sollten.
Eine Nicht-Teilnahme am 07.05. ist mit einem entsprechenden Nachweis zu entschuldigen.
Sofern Sie Code-Teile > 2 Zeilen aus dem Internet oder von einer KI übernehmen, ist die Quelle anzugeben (in einer Datei quellen. txt im Hauptverzeichnis Ihres Gitty). Bei Nutzung einer KI geben Sie zusätzlich den verwendeten Prompt an. Sie sind dafür verantwortlich auch übernommene Code-Teile vollständig erklären zu können. Achten Sie ferner darauf, dass Ihre Abgabe eine eigenständige Leistung bleibt, das würde ich ab ca. 20 % übernommener Code-Teile zu bezweifeln beginnen.
Tauschen Sie keinen Code untereinander aus!
Nutzen Sie "Schmierzettel" für Diagramme, Skizzen u.ä., um ein besseres Verständnis für das System zu entwickeln, tauschen Sie sich hier auch gerne mit anderen Studierenden aus dem Kurs aus. Heben Sie diese Skizzen auf, um bei der Abnahme Ihre Überlegungen ggf. vorstellen zu können.
Optionale Ideen zum weiteren Ausbauen des Systems:
Erstellen Sie JUnit-Tests für die Domänenklassen sowie geeignete UML-Diagramme. - Layered Architecture inkl. eines sauber objektorientierten Domain-Layers, wie in der Vorlesung vorgestellt
Bauen Sie eine GUI ein, wenn Sie das vorher noch nicht gemacht haben sollten. - TUI oder einer GUI implementieren
Versuchen Sie sich an einer graphischen Darstellung der Würfel in Ihrer GUI. - textuelle und nummerierte Beschreibung mindestens des Gameflows (alias User Goal Use Case "Kniffel spielen") und laden Sie diese als gameflow.txt in das Hauptverzeichnis Ihres Gitty hoch
Erstellen Sie einen Computergegner, der versucht, halbwegs sinnvolle Entscheidungen für seine Würfel zu treffen. - dort "Schleifenkonstrukte" (z.B. "weiter bei Schritt 4 bis alle Spieler diesen Schritt ausgeführt haben"), verwenden
Überlegen sie sich weitere Sonderkategorien wie bspw. für Leia (1 2 5 9 1) oder denken Sie sich etwas weiteres Lustiges aus, das gerne auch zufällig im Spiel auftauchen kann. So könnte der Todesstern gelegentlich eingetragene Punktzahlen "vernichten" o.ä. - Achten Sie auf das "Ping-Pong-Spiel" zwischen User und System.
- Fehler beim Laden oder Speichern der Highscore-Liste nicht zum Abbruch des Programms führen
- fangen Sie evtl. auftretende Exceptions ab
- Bewertung der Punktzahlen für die jeweilige Kategorie bietet sich eine Vererbung an
### administrative Rahmenbedingungen gelten:
- Die Abgabe erfolgt individuell und ausschließlich über das Gitty der Hochschule.
- #### Deadline dafür ist das Ende der Übung am 07.05.24
- mindestens 12 Commits mit sinnvollen Code-Fortschritten im Gitty vorzuweisen
- Die Besprechung der Abgabe mit den Betreuern (Abnahme) soll möglichst in der Übung am 07.05.24 erfolgen, die Entscheidung über Nachtermine liegt im Ermessen der Betreuer und setzt das Erreichen eines sinnvollen Stands am 07.05. voraus.
- Bei der Abnahme ist ein klares Verständnis des vorgelegten Codes nachzuweisen, wir behalten uns vor, Sie Code-Teile live neu schreiben zu lassen, wenn wir daran Zweifel haben sollten.
- Eine Nicht-Teilnahme am 07.05. ist mit einem entsprechenden Nachweis zu entschuldigen.
- Sofern Sie Code-Teile > 2 Zeilen aus dem Internet oder von einer KI übernehmen, ist die Quelle anzugeben (in einer Datei quellen. txt im Hauptverzeichnis Ihres Gitty). Bei Nutzung einer KI geben Sie zusätzlich den verwendeten Prompt an. Sie sind dafür verantwortlich auch übernommene Code-Teile vollständig erklären zu können. Achten Sie ferner darauf, dass Ihre Abgabe eine eigenständige Leistung bleibt, das würde ich ab ca. 20 % übernommener Code-Teile zu bezweifeln beginnen.
- Tauschen Sie keinen Code untereinander aus!
- Nutzen Sie "Schmierzettel" für Diagramme, Skizzen u.ä., um ein besseres Verständnis für das System zu entwickeln, tauschen Sie sich hier auch gerne mit anderen Studierenden aus dem Kurs aus. Heben Sie diese Skizzen auf, um bei der Abnahme Ihre Überlegungen ggf. vorstellen zu können.
### Optionale Ideen zum weiteren Ausbauen des Systems:
- Erstellen Sie JUnit-Tests für die Domänenklassen sowie geeignete UML-Diagramme.
- Bauen Sie eine GUI ein, wenn Sie das vorher noch nicht gemacht haben sollten.
- Versuchen Sie sich an einer graphischen Darstellung der Würfel in Ihrer GUI.
- Erstellen Sie einen Computergegner, der versucht, halbwegs sinnvolle Entscheidungen für seine Würfel zu treffen.
- Überlegen sie sich weitere Sonderkategorien wie bspw. für Leia (1 2 5 9 1) oder denken Sie sich etwas weiteres Lustiges aus, das gerne auch zufällig im Spiel auftauchen kann. So könnte der Todesstern gelegentlich eingetragene Punktzahlen "vernichten" o.ä.

View File

@ -0,0 +1,7 @@
1. Spiel starten
2. 1-6 Spieler eintragen
3. Spielmodus wählen
3.1 Augenanzahl 6
3.2 Augenanzahl 8

11
src/Die.java 100644
View File

@ -0,0 +1,11 @@
package src;
public class Die {
public Die (int eyes){
}
public void roll() {
}
}

View File

@ -0,0 +1,15 @@
package src;
public class GameController {
private GameModel model;
public GameController(GameModel model) {
this.model = model;
}
// Method to roll dice
public void rollDice() {
model.rollDice();
}
}

26
src/GameModel.java 100644
View File

@ -0,0 +1,26 @@
package src;
import java.util.ArrayList;
import java.util.List;
public class GameModel {
private List<Player> players;
private List<Die> dice;
private Scoreboard scoreboard;
public GameModel() {
players = new ArrayList<>();
dice = new ArrayList<>();
scoreboard = new Scoreboard();
// Initialize dice
for (int i = 0; i < 5; i++) {
dice.add(new Die(8)); // Up to 8 faces for Star Wars edition
}
}
public void rollDice() {
dice.forEach(Die::roll);
}
// Add other methods to manipulate the game state
}

14
src/GameView.java 100644
View File

@ -0,0 +1,14 @@
package src;
import javax.swing.JPanel;
public class GameView extends JPanel {
private GameController controller;
public GameView(GameController controller) {
this.controller = controller;
}
}

19
src/Main.java 100644
View File

@ -0,0 +1,19 @@
package src;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class Main {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame("Star Wars Yahtzee");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new GameView(new GameController(new GameModel())));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setSize(200,200);
});
}
}

4
src/Player.java 100644
View File

@ -0,0 +1,4 @@
package src;
public class Player {
}

View File

@ -0,0 +1,4 @@
package src;
public class Scoreboard {
}