Einzelnen Beitrag anzeigen

Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#10

AW: verschachtelte if funktion

  Alt 18. Sep 2010, 12:14
was für ein objekt?
ich versteh das nicht.
Er meint du hast eine Klasse die eine Mulde darstellt. Sie selber speichert, ob darin eine Kugel ist, und wie die Mulden an den Seiten sind. Wenn du jetzt einen Spielstein anklickst, dann nimmst du die passende Mulde (du kannst es ja mit den X/Y Koordinaten herausfinden) und sagst der, dass der Stein bewegt werden soll. Diese Mulde guckt dann: Ist ein Stein drin -> Wenn ja ist daneben ein Stein? Dann sagt er das der benachbarten Mulde, dass dort ein Stein rüber zieht. Diese kennt ja wiederum auch ihre Nachbarmulden und kann gucken ob diese Frei ist. Wenn ja, dann wird der Stein zwischen den beiden Mulden ausgetauscht, und der mittlere gelöscht.

Delphi-Quellcode:
type
  TMulde = class(TObject)
  private
    FLeft, FTop, FRight, FBottom : TMulde;
    FStoneSet : Boolean;

    function MoveOverStoneBottom() : Boolean;
    function MoveOverStoneRight() : Boolean;
    function MoveOverStoneLeft() : Boolean;
    function MoveOverStoneTop() : Boolean;
  public
    function MoveStoneBottom() : Boolean;
    function MoveStoneRight() : Boolean;
    function MoveStoneLeft() : Boolean;
    function MoveStoneTop() : Boolean;
  end;
In MoveStone* wird dann das oben beschriebene gemacht:
Delphi-Quellcode:
if FStoneSet // Stein in der Mulde
   and Assigned(FTop) // Mulde oberhalb vorhanden
   and FTop.FStoneSet // Stein in der oberen Mulde
   then
begin
  Result := FTop.MoveOverStone();
  if (Result) then // Der Stein wurde verschoben
    FStoneSet := False; // Dann den hier entfernen
end else
  Result := False;
In MoveOverStone* wird dann das weiter verarbeitet:
Delphi-Quellcode:
if Assigned(FTop) // Mulde oberhalb vorhanden
   not(FTop.StoneSet) // Mulde oberhalb ist frei
   then
begin
  FTop.StoneSet := True;
  Self.StoneSet := False;
  // Alternativ:
  // FBottom.StoneSet := False;
end else
  Result := False;
Das ist nicht der Weisheit letzter Schluss, aber vielleicht hilft es dir zumindest im Hintergrund zu speichern, was passiert.
Um das noch zu Zeichnen, muss man nicht mehr so viel tun. Du muss halt alle Mulden im Programm abspeichern und dann eine TPaintBox darauf legen. Und im OnPaint der Paintbox kannst du dann die Mulden durchgehen und dann herausfinden wo die Mulde ist (z.B. die Mulde speichert seine Koordinaten) und dann gucken ob die Mulde besetzt ist und z.B. entweder einen nicht ausgefüllten oder einen ausgefüllten Kreis zeichnen.

MfG
Fabian

PS: Nach zwei Minuten schon aufgeben? Wir sind zwar schnell, aber so schnell auch nicht.
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat