Labyrinth über MazeGameServer visualisieren

jono

Top Contributor
Es wird empfohlen mit der Komponente GameStatusModel zu beginnen. Die Aufgabe der Klassen der Komponente GameStatusModel ist es, den vollständigen Spielstatus(Maze, baits, score, players) zu enthalten und andere Komponenten wie die MazeClientUI über Änderungen zu benachrichtigen. Wie gehe ich da jetzt vor, kann mir da jemand Hilfe beim Ansatz geben, wie ich anfangen kann.
Zuerst möchte ich jetzt ein UML für die Klassen der GameStatusModel-Komponente erstellen. Ich weiß, dass mehrere Klassen notwendig sind, aber warum ist das nicht mit einer Klasse zu händeln?
Attribute wären ja schonmal coffee,gem,...(In der exam-task.pdf). Aber wie weiter...? Wäre sehr dankbar für ein paar gute Hilfen !
1597668078024.png
 

Anhänge

  • exam-task.pdf
    223,8 KB · Aufrufe: 14
  • MazeGameClient.pdf
    255,3 KB · Aufrufe: 3

LimDul

Top Contributor
Warum nicht mit einer Klasse? Kannst du dann in einem Satz die Klasse vollständig beschreiben was ihre Verantwortung ist? Schau dir in der exam-task mal das Kapitel 6 an, was es alles an Informationen gibt. Diese kannst du nicht einer Klasse abbilden. Der Spieler z.B. wird irgendwo eine Position haben. Die Baits müssen gespeichert werden. Wie soll deine Klasse dann aussehen? Zig Listen zu den unterschiedlichen Daten mit einfachen Datentypen? Das ist nicht sinnvoll. Es ist meist sinnvoller lieber mehr als weniger Klassen zu haben. Du hast es schon selber geschrieben " (Maze, baits, score, players)". Da hast du schon einige Dinge identifiziert. Das werden mit Sicherheit alles eigene Klassen werden (außer vielleicht Score, was ggf. eine Eigenschaft des Spielers ist).
 

MoxxiManagarm

Top Contributor
und andere Komponenten wie die MazeClientUI über Änderungen zu benachrichtigen. Wie gehe ich da jetzt vor, kann mir da jemand Hilfe beim Ansatz geben, wie ich anfangen kann.

Ich weiß, dass mehrere Klassen notwendig sind, aber warum ist das nicht mit einer Klasse zu händeln?
Du kannst viel in einer Klasse machen, aber bedenke, dass du den Überblick behalten willst, sowie andere, die deinen Code anschauen wollen. Daher sind sprechende Strukturen ein notwendiges Mittel.
 

jono

Top Contributor
@MoxxiManagarm
Also zu mir meinte der Dozent:
"Das Observer-Pattern brauchen Sie nicht selbst implementieren, denn in JavaFX gibt es dafür schon ObservableValues."

Ja, okay, das wäre natürlich sinnvoll, ich werde jetzt mal das UML weiter erstellen und ich werde es dann mal hochladen.
 

jono

Top Contributor
Ich habe jetzt mal etwas erstellt und ich gehe fast davon aus, dass das nicht vollständig ist. Nur fällt mir einfach nicht mehr ein. Was könnte noch hinzugefügt werden?
1597674825119.png
 

LimDul

Top Contributor
- Grundsätzlich - operation1 bis 6 sind keine sinnvollen Bezeichnungen.
- Gleiches gilt für attribute8
- Wo speicherst du die Position der baits?
- Warum hat ein Bait (also eine Instanz der Klasse Baits) vier Attribute? Ein Bait besteht für dich also aus "Gem UND Coffee UND Food UND Trap)"? Ist das was du da modelliert hast, nicht eher der BaitType mit einem Score Wert (Typ: Java-Enum).
 

LimDul

Top Contributor
Vielleicht als Tipp: Lös dich mal von UML und Attributen und Methoden.

Beschreibe erst mal in Natürlicher Sprache, was hast du für Objekte

Ein Spieler befindet sich an einer Position im Labyrinth und hat einen Punktewert.
Ein Labyrinth besteht aus Wegen und Mauern......
 

jono

Top Contributor
Die Bezeichnungen "-operation1 bis 6 usw." sind vorgegeben von Astah , werden noch umbenannt oder gelöscht jenachdem ob sie benötigt werden.
Wie speichere ich denn eine Postition...?(evtl. muss dann pro bait ein zweidimensionales Array angelegt werden?)
Ja, das stimmt es ist schon eher der BaitType, aber wieso kann ich es denn nicht einfach so anlegen und brauche ein ENUM? In der BaitType-Klasses sind Attribute doch eigentlich auch nur eine Aufzählung...?

Guter Tipp mit der natürlichen Sprache, habe ich ehrlicherweise nicht dran gedacht.
 

jono

Top Contributor
Ist ja in der Protokollsyntax festgelegt in exam-task.pdf , soll ich das dann einfach übernehmen? String ... = "-" für ein unbekanntes nicht zugängliches Feld.
 

VfL_Freak

Top Contributor
Moin,
Bekomme ich keine Antwort mehr ^^
mal so nebenbei:
Du musst bedenken, dass wir, die Dir helfen, das zumeist neben der Arbeit, Schule etc. machen!
Zudem völlig unentgeltlich! Und die wenigsten sind 24 h pro Tag online, haben aber auch ein Privatleben 😮

Also bitte ggf. etwas mehr Geduld in bezug auf Antworten!

VG Klaus
 

jono

Top Contributor
@mrBrown
zur Klasse Player:
Jeder Spieler befindet sich an einer Position und schaut in eine der 4 vorhanden Himmelsrichtungen. Jeder Spieler hat eine individuelle Punktzahl und am Anfang beträgt sie 0. Jeder hat eine eigene ID und eine nickname und eine bestimme Koordinate im Maze. Der Spieler muss die Baits einsammeln können (collect()) und dazu muss er sich bewegen können (move()). Außerdem muss ein Spieler sich mit dem Server verbinden können, das Spiel spielen und es auch wieder verlassen können.

Maze:
Ein Labyrinth hat eine Höhe und eine Breite. Es besitzt außerdem unbekannte, nicht zugängliche Felder, dann Wände und noch freie Wege.
Die verschiedenen Items befinden sich mit ihren Scores ebenfalls im Labyrinth.

@VfL_Freak
Ja, ich weiß, habe auch absolut Verständnis und Geduld, dachte vielleicht hat er nicht mehr daran gedacht oder so...

1597757577522.png
Das habe ich jetzt erstmal vorläufig dazu erstellt.
 

jono

Top Contributor
1. Auch mit width und height?
Was fehlt ansonsten noch? Müsste ich nicht noch eine Methode zum Verlassen des Spiels hinzufügen in der Klasse Player?
 

jono

Top Contributor
Eine Position ist eine Koordinate im Sinne des Labyrinths, ich kenne nur x und y Koordinaten im herkömmlichen Sinne. Ich denke, dass sich das eignet ein Tipp von dir wäre echt sehr nett und hilfreich. :)
 
K

kneitzel

Gast
In einer Objektorientierten Sprache werden Objekte gebildet, die gewisse Eigenschaften / Zustände haben und mit denen man gewisse Dinge machen kann.

In Java wird das über Klassen gemacht, von denen dann Instanzen erstellt werden können.

Wenn du eine Person modellieren müsstest, würdest du dann eine Liste aus [Name, Vorname, Alter] erstellen?
Das wäre dann also z.B. eine Klasse Person, welche Instanzvariablen name, vorname und alter haben könnte.

Und wenn Du also eine Position aus x und y Koordinate hast, dann macht es durchaus Sinn, dies auch entsprechend zu modellieren...

Das dürfte das sein, worauf @mrBrown hinaus wollte...
 

jono

Top Contributor
Ja, eine Klasse für Koordinate x und Koordinate y ?
Aber die Position des Spielers soll ja dynamisch sein, heißt x und y sind variabel, wie modelliere ich das denn entsprechend?
@JustNobody
 
Zuletzt bearbeitet:

mrBrown

Super-Moderator
Mitarbeiter

jono

Top Contributor
Ja, gut erstmal sehe ich da kein Problem, ist ja variabel da ja keine Werte zugewiesen worden sind.
1597933271364.png
Wäre das dann so korrekt?
Wie genau stelle ich jetzt die Wände, unzugänglichen Felder und zugängliche Felder dar?
Das hat man ja schonmal als Information:
" Description: The server informs about the structure of the maze. First, it sends the Width and Height of the rectangular game field. The following lines with game field data contain one character for each field of the maze. The fields are encoded as follows:
• - (Minus): Unknown, non-accessible field (may also occur inside the maze)
• # (Hash): Stone field; an impenetrable wall
• . (Period): Free accessible field
Müssen die Zeichen einfach der Klasse Maze als String Attribute hinzugefügt werden?
Und wie sage ich der Klasse dass es nicht zugänglich ist usw...?
 

thecain

Top Contributor
Die Multiplizitäten bei den Enums stimmen mMn nicht... aber ich bin auch kein UML Experte, aber ich hätte ein Feld gemacht und eine Abhängigkeitsbeziehung
 

jono

Top Contributor
Ja, hast recht. Müssten Kompositionen sein und andere Multiplizitäten ändere ich doch gerade mal ab.
@thecain Könntest du mir bei den Fragen unter dem UML in #36behilflich sein ?
 

mrBrown

Super-Moderator
Mitarbeiter
Ein Feld ist einfach nur ein Feld innerhalb des Labyrints, der Feld-Typ ist dann die „Art“ des Felds, zb „Wand“
 

jono

Top Contributor
Gut, aber wie ich jetzt die Wände usw. erstelle ist mir immer noch nicht ersichtlich aus den Hilfen.
Die Antwort von @thecain ein Feld zu machen ist nicht wirklich hilfreich, denn das ist ja das was ich gerade frage, wie mache ich ein Feld(siehe #36 durch Hinzufügen der Zeichen als String Attribute der Maze-Klasse)?
 

mrBrown

Super-Moderator
Mitarbeiter
Ist im wesentlichen deine Beschreibung des ganzen, etwas ergänz (in kursiv). Darin einfach jedes Nomen markieren (in Fett), und wenn irgendein Nomen etwas anderes "besitzt" wird das ganze unterstrichen:

"zur Klasse Player:
Jeder Spieler befindet sich an einer Position, diese besteht aus x- und y-Koordinate, und schaut in eine der 4 vorhanden Himmelsrichtungen. Jeder Spieler hat eine individuelle Punktzahl und am Anfang beträgt sie 0. Jeder hat eine eigene ID und eine nickname und eine bestimme Koordinate im Maze. Der Spieler muss die Baits einsammeln können (collect()) und dazu muss er sich bewegen können (move()). Außerdem muss ein Spieler sich mit dem Server verbinden können, das Spiel spielen und es auch wieder verlassen können.

Maze:
Ein Labyrinth hat eine Höhe und eine Breite. Es besitzt außerdem unbekannte, nicht zugängliche Felder, dann Wände und noch freie Wege.
Die verschiedenen Items befinden sich mit ihren Scores ebenfalls auf Feldern im Labyrinth."


Jedes Nomen ist jetzt ein Typ (=Klasse oder primitiver Typ wie Enum/Zahl/String/boolean), jedes Unterstrichene ist ein Feld in einem der Typen.

Das kannst du jetzt einfach in einem Diagramm darstellen (jedes Nomen ein Kasten, jedes "besitzen" ein Pfeil). Wenn etwas keine ausgehenden Pfeile hat, ist es meist in primitiver Typ, welche musst du dann entscheiden (zB ist "Nickname" wahrscheinlich ein String), wenn dem so ist, kannst du es als eigener Typ in dem Diagramm entfernen und direkt als "Attribut" in den besitzenden Typen eintragen.

Wahrscheinlich muss man dann noch ein bisschen verfeinern, am Ende kommt dann ein meist relativ sinnvolles Domänenmodell dabei raus, welches du so 1-zu-1 in Code übersetzen kannst.
 
Zuletzt bearbeitet:

jono

Top Contributor
Also erstmal danke, dass du mir hilfst. Aber was willst du mir denn jetzt damit sagen, dass jedes Nomen ein Kasten darstellt? Wofür steht denn ein Kasten in deinem Sinne? Und wozu dient der Pfeil?
2. Was meinst du mit "...wenn dem so ist, kannst du es als eigener Typ in dem Diagramm entfernen und direkt als ...". Wenn du ja sagst, dass jedes Nomen ein Typ ist und sagst, dass der nickname als Stringtyp als eigener Typ in dem Diagramm entfernt werden kann und direkt als Attribut in den besitzenden Typ eingetragen werden soll ? Der Nickname ist doch als Attribut dem besitzenden Typen(Player) beigefügt???
Ein bisschen bessere Differenzierung von deinen Ausführungen wären da echt mega.
 

Ähnliche Java Themen


Oben