optimaler Klassenaufbau

Status
Nicht offen für weitere Antworten.

Griffin

Bekanntes Mitglied
HI!

Ich hab mir mal das Tutorial mit dem tollen Zeichen-Programm durchgelesen und fand die Strukturierung echt klasse. Ich wollte eine einfache MineSweeper Version machen, weiss aber nicht wie ich das Spiel aufteilen soll.
Ich hab schon angefangen mit Klassen schreiben für das "core" Programm und wollte nun die GUI entwerfen. Dabei fiel mir auf, dass ich sozusagen in mein altes Muster falle, in dem ich die GUI zu stark mit den Data Klassen verbinde (meist direkt).
Ich würd euch gern fragen, wie würdet ihr die Klassen aufteilen und die Verbindungen setzen?

Mein Aufbau
- jminesweeper
...|-core
......|-Mine.java
......|-MineField.java
...|-gui
......|-MineButton.java
......|-MainFrame.java
......|-MainMenu.java
...|- Main.java

(Ich glaub da fehlen noch paar Klassen zu denen ich mir noch keine Gedanken gemacht habe.)
 
B

Beni

Gast
Hm, ich würde die Klasse "Mine" weglassen, denn was willst du in ihr speichern? (Doch hoffentlich keine Graphik einer Mine, das würde ja allen Konzepten widersprechen :bae:)

In einem ersten Anlauf würde ich dann diese Klassen herstellen.
Code:
- jminesweeper
...|-core
......|-MineField
...|-gui
......|-MinePanel
......|-MainFrame
......|-MainMenu
...|- Main

Meine (nicht ganz vollständigen Gedanken), laufen in diese Richtung:
MineField steuert alles was mit dem Minenfeld zu tun hat, das ist:
- Berechnung welche Felder offen, gedeckt sind
- Berechnung bei welchen Feldern welche Zahl (=Anzahl Minen rundherum) steht
- Speichern der Position von Minen
- Entsprechende Methoden um abzufragen wo Minen sind, welche Felder offen/gedeckt sind...
- Eine Methode um einzelne Felder einzudrücken. Die Methode gibt wohl am einfachsten einen boolean zurück "alles ok"/"Mine explodiert".

Und für die GUI würde ich ein "MinePanel" basteln. Dieses MinePanel kann nichts anderes als das Minenfeld darstellen (ob es jetzt Buttons oder sonstwas benutzt ist egal). Und das MinePanel ist diejenige Klasse, welche die Felder der MineFields eindrückt (wenn der Benutzer draufklickt).

Das MinePanel kennt das MainFrame (und umgekehrt), so kann das MinePanel dem MainFrame z.B. melden, wenn das Spiel vorüber ist (und das MainFrame öffnet einen Dialog "Game over"). (Man könnte hier auch ein grossartiges Listener-System aufbauen, das wäre aber ein bisschen übertrieben bei 4 Klassen...)

Naja, eine Variante, es gibt viele andere. Mir hat es immer viel gebracht wenn ich ein Progi zuerstmal geschrieben hab, dann meine Fehler analysiert, und es gleich nochmal implementiert habe.
 

Griffin

Bekanntes Mitglied
Danke für deine Antwort.

Bei mir dient die Klasse Mine einfach dazu den Wert zu speichern, ob sie eine scharfe Mine ist oder nicht. Ich wollte damit nur das ganze bischen auseinander friemmeln.

Mir stellt sich aber jetzt die Hauptfrage, welche Klasse kennt MineField? Wo kommt die Verbindung mit der GUI? Am besten sind natürlich so wenige Verbindungen wie es nur geht.
 
B

Beni

Gast
Ah, ok. Ich hätte das gleich als boolean-Array in MineField gemacht, aber deine Variante ist sicher auch ok.

MineField weiss gar nix von seiner Umgebung (zumindest nicht der Teil der Umgebung, der sich auf die GUI bezieht). Es sitzt in seiner Höhle am Feuer, und sieht manchmal eine seltsame Erscheinung am Himmel (dann wird eines seiner Methoden aufgerufen), aber was dort oben abgeht, davon weiss es nichts (muss es auch nicht). MineField ist ja keine *aktive Komponente (es ändert sich nicht selbstständig, nur als Reaktion auf Eingaben des Benutzers), also muss es auch niemanden kennen um ihm z.B. zu sagen "Mine sowieso ist jetzt plötzlich hinzugekommen".

Und MineField selbst wird wohl nur von MinePanel (oder wie du das nennen willst) benutzt, alle anderen müssen vom MineField eigentlich auch nicht viel wissen (hm, vielleicht das Menu wenn es ein neues Spiel generiert, oder andere Klassen in ähnlichen Situationen...).

(*sollte MineField sich einfach so verändern, würd ich ein Interface "MineFieldListener" herstellen. Dem MineField könnten beliebig viele Listener übergeben werden, welche dann aufgerufen werden, sollte sich was ändern. Dann kannst du in der GUI rumwüten, ohne am Code des MineFields was ändern zu müssen.)
 
Status
Nicht offen für weitere Antworten.

Oben