Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi [UML] Mastermind (https://www.delphipraxis.net/80526-%5Buml%5D-mastermind.html)

holle 10. Nov 2006 12:09


[UML] Mastermind
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo, ich wollte für Informatik ein kleines Spiel schreiben: Mastermind
Ich habe jetzt angefangen ein UML Diagramm zu entwerfen, bin aber nicht so recht damit zufrieden. Als Objekte habe ich jetzt das Spielbrett, dass sich aus 12 Reihen und 12 Hilfen zusammensetzt. Was haltet ihr davon? Würdet ihr andere Objekte nehmen? Und die Methoden, seit ihr damit einverstanden?

- Marcel -

MrSpock 10. Nov 2006 12:12

Re: [UML] Mastermind
 
Hallo holle,

was ist die Verantwortung der Klasse THilfe und warum brauchst du für jede Reihe eine eigene Instanz?

holle 10. Nov 2006 12:15

Re: [UML] Mastermind
 
Das Spielfeld gliedert sich ja in 12 Reihen. Jede Reihe hat vier Felder für die Eingabe (TReihe) und vier Felder, wo der Gegner angiebt, ob ein Stein sich an der Richtigen Position befindet (THilfe). Das mit den drei Instanzen war mein Vorschlag, geht es besser?

- Marcel -

holle 10. Nov 2006 16:19

Re: [UML] Mastermind
 
Also bilde ich dann eine Instanz für das EingabeSpielbrett und eine für das ScoreSpielbrett. Und wie dann weiter?

- Marcel -

MrSpock 10. Nov 2006 16:23

Re: [UML] Mastermind
 
Hallo hallo,

soll das Spiel zwei Spieler zulassen oder zunächst nur einen Spieler gegen den Computer?

Du benötigst dann eine Methode innerhalb der "Spielerklasse", die eine Kombination (einen Code) erzeugt, der erraten werden muss.

Wie hast du dir die Eingabe und Ausgabe vorgestellt?

holle 10. Nov 2006 16:41

Re: [UML] Mastermind
 
Ein- und Ausgabe habe ich mir wie HIER bei dieser Onlineversion vorgestellt. Mein Problem ist, dass ich nicht genau weiß, welche Klassen ich benötige. (Wir lernen gerade OOP in der Schule).

Ich hatte mir überlegt evtl. eine Klasse für das Spielbrett zu nehmen. Beim erzeugen des Spielbrettes wird auch der "Code" erzeugt. Gespielt wird gegen den Computer => der Mensch versucht den Code zu knacken.

- Marcel -

MrSpock 10. Nov 2006 17:04

Re: [UML] Mastermind
 
Hallo holle,

in einem ersten Schritt bei OOA/OOP machst du dir Gedanken über die Funktionen die du benötigst und erstellst dazu Use Cases.

Wenn ich mir überlege welche Objekte du benötigst, so würde ich auf jeden Fall einmal eine "SpielerKlasse" vorsehen. Der Spieler kann einen Zug durchführen, in dem er einen Code festlegt und dann eine Nachricht "evaluate" an das Spielbrett schickt. Diese ermittelt das Ergebnis und stellt es grafisch dar. Wenn es noch nicht gelöst ist, könnte das Spielbrett eine Nachricht "nextTry" an das Spielerobjekt schicken, um einen neuen Code anzufordern.

Du solltest also ein Sequenzdiagramm anfertigen, dass den Nachrichtenfluss zwischen den Objekten zeigt.

holle 10. Nov 2006 17:23

Re: [UML] Mastermind
 
Wir haben das leider im Unterricht anders gelernt. Wir erstellen als erstes immer gleich ein UML Diagramm.

Als ersten Schritt dafür muss ich die Objekte analysieren und daraus die Klassen ableiten.
Spielbrett => TSpielbrett

Dann muss ich ja die benötigten Attribute und Methoden ergänzen.

##TSpielbrett
#
##Attribute
#aktuelleReihe
#geheimCode
#code[1..12]
#
##Methoden
#erzeugen
#tippSetzen(Farbe1, Frabe2, Farbe3, Farbe4)
#anzeigen
#löschen

Da verstehe ich jetzt nicht, was der Spieler da noch machen soll?

- marcel -

MrSpock 10. Nov 2006 17:32

Re: [UML] Mastermind
 
Hallo holle,

UML ist eine "Sprache", die verschieden Diagramme zur Verfügung stellt. Du hast ein Klassendiagramm erstellt. Ein Use Case Diagramm ist ein anderer Diagrammtyp. Das Sequenzdiagramm ist ein weiteres Diagramm. Alle diese Diagramme haben verschiedene Aufgaben.

In deinem Klassendiagramm versucht du Objekte zu finden und diesen Verantwortungen zuzuweisen. Welches Objekt hat bei dir die Verantwortung einen Spielzug durchzuführen? Objekte senden Nachrichten. Das ist die einzige Art zu kommunizieren.

holle 10. Nov 2006 17:54

Re: [UML] Mastermind
 
na mit "spielbrett.tippsetzen(schwarz, rot, grün blau)" kann ich doch einen spielzug durchführen, oder nicht?

- marcel -

MrSpock 10. Nov 2006 18:31

Re: [UML] Mastermind
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo holle,

ja, das kannst du. Der Aufrufer dieser Methode muss aber in OOP ein Objekt sein.

Ich habe einmal ein Beispiel für ein Klassendiagramm und ein dazugehöriges Sequenzdiagramm angehängt.

Das Sequenzdiagramm zeigt, dass der Spieler zunächst einmal ein neues Spiel beginnt und dazu einen neuen SecretCode vom Spielbrett erzeugen lässt. Dann erzeugt der Spieler einen VersuchsCode und schickt ihn an Spielbrett, welchen diesen auswertet.

holle 10. Nov 2006 19:01

Re: [UML] Mastermind
 
@MrSpock
DANKE für die Diagramme. Noch ein zwei Fragen dazu:

Was bedeutet "void"? In der Wiki habe ich folgendes gefunden
Zitat:

Das Substantiv Void bezeichnet einen Datentyp in der Informatik, der – im Gegensatz zur üblichen Rolle eines Datentyps – keine Werte speichert. Dieser tritt häufig in den höheren Programmiersprachen wie C bzw. C++ oder Java auf. Er dient dazu, Formalismen, bei denen ein Datentyp angegeben wird, auch dann benutzen zu können, wenn an der entsprechenden Stelle keine Daten verwendet werden, oder um einen möglichst unspezifizierten Typ angeben zu können, wenn die Angabe keine Rolle spielt. Beispielsweise kann man prozedurenähnliche Funktionen schaffen, indem man void als Typ für ihren Rückgabewert festlegt.
Heißt das, dass mit "function tueWas(): void;" das gleiche wie mit "procedure tueWas();" gemeint ist?

Wie kann der Spieler das Spielbrett dazu veranlassen einen SecretCode zu erzeugen? Ich verstehe das irgendwie nicht. Ich würde es ja mit Spielbrett.ErzeugeCode(); machen. Geht aber nicht da ja der Spieler die Methode auslösen muss und ErzeugeCode(); eine Funktion ist. Ich glaub mir fehlt da noch was an Wissen. Kann man das irgenwo nachlesen?

- Marcel -

MrSpock 10. Nov 2006 19:36

Re: [UML] Mastermind
 
Hallo holle,

ja, void heißt, dass kein Wert zurückgegeben wird. Wird von dem Tool, das ich benutzt habe so erzeugt, weil es ein Java Tool ist. Ein gutes Buch zum Thema Objectorientierte Analyse und Design mit UML ist sicher eine gute Investition.

Du könntest im Hauptprogramm z.B. die beiden Objekte Spieler und Spielbrett erzeugen.

Ich würde das so realisieren, wenn im Hauptmenue der Punkt Datei | Neu ausgewählt wird, erstellt du die beiden Objekte Spieler und Spielbrett:

Delphi-Quellcode:
Spieler := TSpieler.Create;
Spielbrett := TSpielbrett.Create;

{ Dann schickst du dem Spieler die Nachricht, dass ein neues Spiel beginnt. }

Spieler.NeuesSpiel;
Der Spieler führt jetzt das aus, was in dem Sequenzdiagramm dargestellt ist:

Delphi-Quellcode:
{ Code in der Methode TSpieler.NeuesSpiel }
Spielbrett.ErzeugeCode;

{ Jetzt wird die Methode GeneriereCode aufgerufen, die eine Oeration von TSpieler ist }
{ Generiere Code ermöglicht jetzt dem Benutzer einen Code einzugeben. Es wird ein Objekt der
  Klasse TCode generiert, in dem der Code gespeichert wird. Wahrscheinlich werden die Objekte
  in einer Collection gespeichert. }
NextCode := GeneriereCode;

{ und jetzt schickt der Spieler die Nachricht an das Spielbrett }
Ergebnis := Spielbrett.TesteCode(NextCode);
Ich hab das jetzt nur mal so hingepfuscht, ohne mir da weitere Gedanken zu machen.

[Nachtrag]
Wenn du den Aufruf direkt machst, dann wir letztlich dein Formular zum Objekt Spieler.
[/Nachtrag]


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz