diff --git a/Main.java b/Main.java deleted file mode 100644 index 7046417..0000000 --- a/Main.java +++ /dev/null @@ -1,2 +0,0 @@ -public class Main { -} diff --git a/README.md b/README.md index db8fa80..822a89b 100644 --- a/README.md +++ b/README.md @@ -1,41 +1,52 @@ # 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. -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. -Es soll möglich sein, dass das Spiel von 1 bis 6 Personen gespielt wird. -Diese sollen zu Beginn alle ihren Namen eingeben können. -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. -Die Highscore-Liste soll vom Hauptmenü aus erreichbar und auf Wunsch nach einer Sicherheitsabfrage löschbar sein. -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. -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) -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. -Bitte achten Sie auf folgende nicht-funktionale Anforderungen bzw. Entwurfsvorgaben: +Da gerade der Star-Wars-Tag (May, the Fourth...) vor der Türe steht, soll unser Kniffel eine Special-Edition werden + - 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. + - Es soll möglich sein, dass das Spiel von 1 bis 6 Personen gespielt wird. + - Diese sollen zu Beginn alle ihren Namen eingeben können. + - 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. + - Die Highscore-Liste soll vom Hauptmenü aus erreichbar und auf Wunsch nach einer Sicherheitsabfrage löschbar sein. +Unsere Special Edition soll eine spezielle Kategorie "Star Wars Day" bekommen: + - nur die Punkte von Vieren und Fünfen in beliebiger Kombination zählen. + - Kategorie "R2D2" + - 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. -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: +### nicht-funktionale Anforderungen bzw. Entwurfsvorgaben: -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.ä. +- Layered Architecture inkl. eines sauber objektorientierten Domain-Layers, wie in der Vorlesung vorgestellt +- TUI oder einer GUI implementieren +- 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 + - 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. +- 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.ä. diff --git a/gameflow.txt b/gameflow.txt index e69de29..c2b3a29 100644 --- a/gameflow.txt +++ b/gameflow.txt @@ -0,0 +1,7 @@ +1. Spiel starten +2. 1-6 Spieler eintragen +3. Spielmodus wählen + 3.1 Augenanzahl 6 + 3.2 Augenanzahl 8 + + diff --git a/src/Die.java b/src/Die.java new file mode 100644 index 0000000..d538dc0 --- /dev/null +++ b/src/Die.java @@ -0,0 +1,11 @@ +package src; + +public class Die { + + public Die (int eyes){ + + } + + public void roll() { + } +} diff --git a/src/GameController.java b/src/GameController.java new file mode 100644 index 0000000..f3d2ede --- /dev/null +++ b/src/GameController.java @@ -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(); + } +} + diff --git a/src/GameModel.java b/src/GameModel.java new file mode 100644 index 0000000..2db0236 --- /dev/null +++ b/src/GameModel.java @@ -0,0 +1,26 @@ +package src; + +import java.util.ArrayList; +import java.util.List; + +public class GameModel { + private List players; + private List 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 +} diff --git a/src/GameView.java b/src/GameView.java new file mode 100644 index 0000000..dd6575d --- /dev/null +++ b/src/GameView.java @@ -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; + + } + +} + diff --git a/src/Main.java b/src/Main.java new file mode 100644 index 0000000..95c759c --- /dev/null +++ b/src/Main.java @@ -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); + + }); + } +} diff --git a/src/Player.java b/src/Player.java new file mode 100644 index 0000000..75c005c --- /dev/null +++ b/src/Player.java @@ -0,0 +1,4 @@ +package src; + +public class Player { +} diff --git a/src/Scoreboard.java b/src/Scoreboard.java new file mode 100644 index 0000000..436e4d7 --- /dev/null +++ b/src/Scoreboard.java @@ -0,0 +1,4 @@ +package src; + +public class Scoreboard { +}