Hallo,
ich programmiere gerade ein kleines Würfelspiel.
Ziel des Spiels ("Schlag den Raab" hat mich da auf die Idee gebracht) ist es möglichst schnell 50 Punkte zu erwürfeln. Man darf so lange würfeln, bis man eine 6 gewürfelt hat (dann gehen alle noch nicht gesicherten Punkte verloren) oder man seine Punkte sichert. In beiden Fällen ist dann erstmal der Gegner/Mitspieler an der Reihe.
Ich habe die Programmlogik zunächst einmal funktional programmiert mit zwei Klassen Spiel und Spieler. Nun habe ich versucht, dass Ganze etwas objektorientierter anzugehen und gleichzeitig in einer GUI zu verpacken. Bisher habe ich ein gutes Gefühl dabei auf dem richtigen Weg zu sein (jedenfalls habe ich derzeit eine funktionierende Vorabversion*). Woran es derzeit in erster Linie hapert ist mehr die Logik als der Code. Deshalb und da ich mich bisher noch nicht wirklich um Kapselung usw. gekümmert habe, möchte ich es auch erstmal ohne meinen bisherigen Code probieren.
Gehört eine Methode würfeln z. B. eher in eine Spielerklasse, wo die ermittelte Zufallszahl von 1 bis 6 direkt den Spielerattributen zugewiesen wird und die weiteren Aktionen (z. B. Spieler bei 6 auf Inaktiv setzen bzw. bei 1-5 eine Entscheidungsabfrage (Weiter?/Schieben?)) direkt in der Spielerklasse erfolgen oder wäre die Ermittlung der Zufallszahl eher die Aufgabe einer Klasse Würfel und der Spieler ruft eine Methode wuerfel.wuerfeln() auf und bearbeitet dann den Return (die Augenzahl) wie oben?
In diesem Fall wäre die Aufgabe der Klasse Würfel sehr einfach => Ermitteln der Zufallszahl (Ok, mit der GUI vlt. noch Aktualisierung des Fensters mit den aktuellen Augen evtl. mit einer kleinen Animation). Womit ich bei der nächsten Problematik wäre. Gehört die gesamte Darstellung des Würfels (paint) und der Spielernamen (JLabel) in die Klasse Spielfeld (JPanel) und aktualisiert das Würfeln lediglich das Spielfeld oder ist auch die Selbstdarstellung der Klassen eine Aufgabe die eher in die Klasse selbst gehört. Für Variante 1 spricht, dass alles was die Darstellung betrifft übersichtlich in einer Datei untergebracht ist. Objektorientiert könnte ich beides erklären:
Das Spielfeld-JPanel ist die Tafel und dort wird ja nicht der Spieler selbst drangenagelt sondern nur der Name angeschrieben. Auch wird dort nicht der Würfel festgeklebt sonder lediglich die aktuelle Augenzahl aufgemalt.
Auf der anderen Seite gehört zu den Eigenschaften des Objektes doch auch irgendwie das Aussehen und das spricht dafür, dass auch dieses in der Klasse selbst definiert wird.
Oder bin ich komplett auf dem Holzweg und das eine ist das Spielfeld, dass andere der Spieler oder der Würfel und dann gibt es noch ein Objekt Namensschild und Würfelanzeige oder Ähnliches?
Welche/wieviele Klassen/-aufteilung empfehlt ihr?
Ich hoffe, das kann man so abstrakt erklären/beantworten. Objektorientierung klingt theoretisch eigentlich so logisch und einfach, aber gerade als Anfänger neigt man doch schnell dazu (zumindest ist das bei mir so) prozessorientiert zu denken.
___
*Falls es für die Beantwortung hilfreich ist und ihr versprecht mich nicht zu hart ranzunehmen ;-) stelle ich meinen bisherigen Code natürlich gerne zur Verfügung
ich programmiere gerade ein kleines Würfelspiel.
Ziel des Spiels ("Schlag den Raab" hat mich da auf die Idee gebracht) ist es möglichst schnell 50 Punkte zu erwürfeln. Man darf so lange würfeln, bis man eine 6 gewürfelt hat (dann gehen alle noch nicht gesicherten Punkte verloren) oder man seine Punkte sichert. In beiden Fällen ist dann erstmal der Gegner/Mitspieler an der Reihe.
Ich habe die Programmlogik zunächst einmal funktional programmiert mit zwei Klassen Spiel und Spieler. Nun habe ich versucht, dass Ganze etwas objektorientierter anzugehen und gleichzeitig in einer GUI zu verpacken. Bisher habe ich ein gutes Gefühl dabei auf dem richtigen Weg zu sein (jedenfalls habe ich derzeit eine funktionierende Vorabversion*). Woran es derzeit in erster Linie hapert ist mehr die Logik als der Code. Deshalb und da ich mich bisher noch nicht wirklich um Kapselung usw. gekümmert habe, möchte ich es auch erstmal ohne meinen bisherigen Code probieren.
Gehört eine Methode würfeln z. B. eher in eine Spielerklasse, wo die ermittelte Zufallszahl von 1 bis 6 direkt den Spielerattributen zugewiesen wird und die weiteren Aktionen (z. B. Spieler bei 6 auf Inaktiv setzen bzw. bei 1-5 eine Entscheidungsabfrage (Weiter?/Schieben?)) direkt in der Spielerklasse erfolgen oder wäre die Ermittlung der Zufallszahl eher die Aufgabe einer Klasse Würfel und der Spieler ruft eine Methode wuerfel.wuerfeln() auf und bearbeitet dann den Return (die Augenzahl) wie oben?
In diesem Fall wäre die Aufgabe der Klasse Würfel sehr einfach => Ermitteln der Zufallszahl (Ok, mit der GUI vlt. noch Aktualisierung des Fensters mit den aktuellen Augen evtl. mit einer kleinen Animation). Womit ich bei der nächsten Problematik wäre. Gehört die gesamte Darstellung des Würfels (paint) und der Spielernamen (JLabel) in die Klasse Spielfeld (JPanel) und aktualisiert das Würfeln lediglich das Spielfeld oder ist auch die Selbstdarstellung der Klassen eine Aufgabe die eher in die Klasse selbst gehört. Für Variante 1 spricht, dass alles was die Darstellung betrifft übersichtlich in einer Datei untergebracht ist. Objektorientiert könnte ich beides erklären:
Das Spielfeld-JPanel ist die Tafel und dort wird ja nicht der Spieler selbst drangenagelt sondern nur der Name angeschrieben. Auch wird dort nicht der Würfel festgeklebt sonder lediglich die aktuelle Augenzahl aufgemalt.
Auf der anderen Seite gehört zu den Eigenschaften des Objektes doch auch irgendwie das Aussehen und das spricht dafür, dass auch dieses in der Klasse selbst definiert wird.
Oder bin ich komplett auf dem Holzweg und das eine ist das Spielfeld, dass andere der Spieler oder der Würfel und dann gibt es noch ein Objekt Namensschild und Würfelanzeige oder Ähnliches?
Welche/wieviele Klassen/-aufteilung empfehlt ihr?
Ich hoffe, das kann man so abstrakt erklären/beantworten. Objektorientierung klingt theoretisch eigentlich so logisch und einfach, aber gerade als Anfänger neigt man doch schnell dazu (zumindest ist das bei mir so) prozessorientiert zu denken.
___
*Falls es für die Beantwortung hilfreich ist und ihr versprecht mich nicht zu hart ranzunehmen ;-) stelle ich meinen bisherigen Code natürlich gerne zur Verfügung