Zitat von
Hansa:
Zwischen den Zeilen liest man da Zweifel am eigenen Konzept. Und die sind auch durchaus berechtigt.
OOP-mäßig fängt man doch nicht bei Null an. TObject ist so gut wie nichts. Sinnvollerweise sollte man vorhandene Methoden verwenden oder erweitern. Und zwar aus vorhandenem heraus. Gehe doch hin und bilde das Memory-Spiel logisch 1:1 im Programm ab. Für mich ist das ein quadratisches Array. Da bietet sich ein
Array [1..MaxX,1..MaxY] of TImage;
an.
Und mit dem Array hätten wir dann den
OOP Pfad wieder verlassen.
Es war schon richtig sich eine Klasse
TCard zu erstellen und diese in einem Container
TField zu verwalten. Eine Kart kennt ihren Zustand und ihren Wert, ob umgedreht oder nicht.
TField kennt jede Position jeder Karte und deren Wert, den sie sich von dem Objekt
TCard geben lässt. Ich drehe ein Karte um und
TField fragt
TCard: "Was hast du für einen Wert?" Dann wird die zweite Karte umgedreht und
TField fragt auch diese Karte: "Was hast du für einen Wert?"
TMemory fragt dann
TField: "Sind die Karten gleich?" In Abhängigkeit der Antworte kann dann
TMemory entscheiden was passieren muss. Entweder sagt es
TField: "Dreh die Karten wieder um." (Sie waren nicht gleich.) Und
TField sagt den Karten, dass sie wieder ihren Zuständ ändern sollen und zwar in den umgedrehten. Oder
TMemory sagt
TField: "Nimm die Karten vom Spielfeld. (Sie waren gleich und
TField löscht die betreffenden Karten-Objekte aus der Liste und stellt deren Plätze entsprechend dar.)
Manchmal fällt es leichter, wenn man sich so einen Ablauf mit handelnden Peronen vorstellt. Hier haben wir einen Spielleiter,
TMemory, der die Regeln kennt und entscheidet, was passieren muss. Dann haben wir einen Spielfeldverwalter,
TField, der die Anweisungen an die Akteure,
TCard, weitergibt. Man überlegt, welche Personen brauche ich und wie arbeiten diese Personen zusammen, welche Informationen benötigen sie (das sind dann die Attribute der Klasse) und welche Informationen übermitteln sie (das sind dann die Methoden). Hinzu kommen Ereignisse, die entsprechende Reaktionen bei den handelnden Personen auslösen.
Beispiel:
Wird eine Karte umgedreht, wird das Ereignis
OnFlip ausgelöst und
TField zählt mit. So bald
TField festgestellt hat, dass zwei mal dieses Ereignis eingetreten ist, fragt es die Karten, welche Werte sie haben und löst dann das Ereignis
OnEndTurn aus. Im Ereignis
OnEndTurn teilt es dem Spielleiter
TMemory mit, ob die Karten gleich sind oder nicht.
TMemory weist dann
TField an, was mit den Karten passieren soll.
Hm, eigentlich habe ich gerade dein Programm geschrieben. Das jetzt umzusetzen, ist eigentlich nur noch reine Tipparbeit.
@Hansa: Und die Klassen
TMemory und
TField würde ich von
TObject ableiten. Die Klasse
TCard dann je nach dem entweder von TImage oder sonst einer grafischen Komponente.