Einzelnen Beitrag anzeigen

Benutzerbild von isilive
isilive

Registriert seit: 15. Okt 2008
Ort: Österreich
192 Beiträge
 
Delphi 2009 Professional
 
#47

AW: Eine Projektarbeit

  Alt 20. Jan 2015, 19:42
Das Problem ist, dass ihr das Pferd von hinten aufzäumt. Wie p80286 richtigerweise anmerkt sollte man sich beim Austüfteln des Programms zuerst auf die Programmlogik und erst später auf die Darstellung konzentrieren.

Beispiel1:
Ich habe ein Programm das schöne Bilder anzeigt. Wenn ich draufklicke passiert entweder nix oder etwas zufälliges.
Beispiel2:
Ich habe ein Programm das mir nur 14 mal ein "X" als Text hinschreibt. Wenn ich per Tastatur ein X aufmache erscheint eine Zahl. Decke ich zwei gleiche Zahlen hintereinander auf bleiben sie offen. Sind alle "X" offen habe ich gewonnen.
Welches Programm ist "mehr" Memory?


Ok, also was braucht ihr noch? Richtig, die gesamte Spiellogik.

Wie kann ich die einbauen?

Man braucht eine Funktion die immer aufgerufen wird, egal auf welche Karte man geklickt hat. Und die weiß auf welche Karte man klickte und die sich ein paar Sachen "merkt" (zB in globalen Variablen).

Dazu muss man aber etwas abstrahieren. Ihr habt 14 Karten(Bilder) und ihr schreibt 14x den "fast" selben Code hin. Erstens kannn man das bei 100 Bildern nicht mehr machen, und zweitens müsstet ihr jede kleine Änderung der Logik immer 14x ändern.

Ich würde das beispielsweise so angehen:

1) Ihr müsst allen Bildern das selbe Klickevent zuweisen. Es soll die selbe Funktion aufgerufen werden. Dies macht ihr in dem ihr bei allen Bildern im Objektinspektor bei OnClick die selbe Funktion angebt.

2) Natürlich muss man aber wissen auf WELCHES Bild geklickt wurde.
Das geht über Auswerten des Senders:
wird zb hier erklärt: http://www.festra.com/wwwboard/messages/2235.html

2b) Als mögliche Alternative fällt mir gerade ein: alle Klick-Events rufen danach eine einheitliche Funktion auf und schicken als Parameter mit auf welche Karte geklickt wurde.

3) Jetzt haben wir einen Eventhandler der von allen Karten ausgelöst wird und der weiß auf welche Karte geklickt wurde. Dann können wir mit der Logik beginnen.

4) Diese braucht ein paar globale Variablen. Sie muss wissen:
ob wir gerade auf die "erste" oder die "zweite" Karte geklickt haben
wieviele Karten schon aufgedeckt sind
evtl. welche Karten aufgedeckt und verdeckt sind (Array/Liste)

5) Ich würde zB. eine Integer Variable "Status" nehmen
zu Beginn ist status := 0
klicke ich auf die erste Karte:
status := 1
decke diese karte auf
merke dir diese karte (in einer variablen)

klicke ich auf die nächste (zweite) Karte:
status := 2
decke diese karte auf
if diese karte = die erste karte then:
speichere irgendwie (variable, array, liste, whatever) dass diese beiden karten nach dem nächsten klick offen bleiben
Speichere auch wieviele Karten offen sind. Sind alle offen ist das Spiel gewonnen.

klicke ich wieder auf eine Karte:
decke die 2 vorigen Karten wieder zu (außer es waren 2 gleiche)
status := 1
und mache es wie oben bei status 1


Die Spiellogik von Memory ist gar nicht so trivial zu implementieren wie man meinen möchte, jedoch ist es gut mit Standardmethoden möglich.

Ich würde mir zu beginn die Arbeit vereinfachen und nur mal:
- ich klicke auf eine Karte
- es wird immer der gleiche Eventhandler (Funktion) aufgerufen.
- ein Memo schreibt mir hin auf welche Karte geklickt wurde (zur Kontrolle. Debugging) Wird über "Sender" rausgefunden - siehe oben.
- ich kann erstmal einfach alle Karten aufmachen
- wenn alle Karten offen sind erkennt das Programm das

später:
- das Memo schreibt auch den Status hin. (siehe oben)
- wenn der status von 2 auf 1 geht könnte mich - erstmal zur Vereinfachung - auch eine Messagebox fragen ob die letzten 2 Karten identisch waren. Als braver Bürger beantworte ich die Frage natürlich wahrheitsgemäss und kann spielen
Stefan
Jedoch kann die referenzbasierte Implementierung des Standard-Objektmodells in Kombination mit den komplexen syntaktischen Dereferenzierungsregeln bei einer objektorientierten API wie ein Stolperstein wirken.

Geändert von isilive (20. Jan 2015 um 19:43 Uhr) Grund: Typo
  Mit Zitat antworten Zitat