AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Spielfeld mit Klassen als Felder

Ein Thema von freak4fun · begonnen am 16. Mai 2006 · letzter Beitrag vom 16. Mai 2006
Antwort Antwort
Seite 2 von 2     12   
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#11

Re: Spielfeld mit Klassen als Felder

  Alt 16. Mai 2006, 14:12
Ich würde es über eine Klasse machen, der ich eine Eigenschaft spendieren würde, über die man ermitteln kann ob Bombe oder nicht.
Markus Kinzler
  Mit Zitat antworten Zitat
McLane

Registriert seit: 4. Sep 2004
37 Beiträge
 
Delphi 5 Professional
 
#12

Re: Spielfeld mit Klassen als Felder

  Alt 16. Mai 2006, 14:21
Moin,

ich würde in TFeld einen neuen Constructor einführen, dem du als Parameter den Feldplatz übergibts. Sollte auf dem Feld schon was sein, löst er einfach den Destructor aus, so dass bei der Zuweisung das Feld dann wieder frei ist. Durch die Ableitung der TBomb von TFeld erbt TBomb den Constructor einfach.

Delphi-Quellcode:
type
  TFeld = class
 
    Position: TPoint;
  public
    Constructor Create(PFeld: TFeld); override; // oder reintroduce; (je nach Vorfahr)
  end;
 
  TBomb = class (TFeld)
   
    ExploTime: Integer;
  end;

TSpielfeld = array[0..1,0..1] of TFeld;

var
  S: TSpielFeld;

Constructor TFeld.Create(PFeld: TFeld);
begin
  inherited;
  if assigned(PFeld) then
    FreeAndNil(PFeld);
end;
// Der Constructor entfernt ein evtl. vorhandenes Feld für uns automatisch
S[0,0] := TBomb.Create(S[0,0]); //etc.
  Mit Zitat antworten Zitat
tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#13

Re: Spielfeld mit Klassen als Felder

  Alt 16. Mai 2006, 14:31
Die meiste Arbeit davon könntest du in einer Methode des Spielfeldes machen, dass ein Feld zu einem bestimmten Typ macht:

Delphi-Quellcode:
type TFeld = class
       ...
     TFeldClass = class of TFeld;
     
     TBomb = class(TFeld)
       ...
     end;
     TBombClass = class(TBomb);
     // usw.

type TSpielfeld = class
     private
       const FELDGROESSE = 10;
       FFelder = array[0..FELDGROESSE-1, 0..FELDGROESSE-1] of TFeld;
     public
       SetFieldTo(i,j: byte; NewClass: TFeldClass);
     end;

procedure TSpielfeld.SetFieldTo(i,j: byte; NewClass: TFeldClass);
begin
  if not (FFelder[i,j] is NewClass) then begin // Veränderung?
    FFelder[i,j].Free;
    FFelder[i,j] := NewClass.Create;
  end;
end;
Alle vorzunehmenden Einstellungen, wie z.B. ExplodeTime etc., gehören sowieso in den Konstruktor der entsprechenden Unterklasse (in diesem Fall TBomb.Create)

Jetzt ließe sich mit Spielfeld.SetFieldTo(0,0, TBomb) das linke obere Feld zu einer Bombe machen, ein anschließender Aufruf Spielfeld.SetFieldTo(0,0, TWall) verwandelt die Bombe in eine Wand.

Nachteil: Alle alten Objektreferenzen verlieren dabei ihre Gültigkeit, wenn du dir also im Spielerfigur-Objekt ein die TFeld-Instanz abspeicherst, auf der sich die Figur gerade befindet, kann es dir passieren, dass diese ihre Gültigkeit verliert. Um das zu vermeiden müsstest du halt grundsätzlich immer über Zeilen- und Spaltenindex auf die Felder zugreifen.

//edit:
@McLane: Konstruktoren sind automatisch virtuell (wär ja sonst auch wenig sinnvoll)...das override braucht (darf?) da also nicht hin. Reintroduce ist falsch, verdecken willst du hier ja nicht.
Christian
Der Computer hilft mir, Probleme zu lösen, die ich ohne Computer nicht hätte.
  Mit Zitat antworten Zitat
Benutzerbild von Kroko1999
Kroko1999

Registriert seit: 21. Apr 2005
Ort: Spremberg
455 Beiträge
 
Turbo Delphi für Win32
 
#14

Re: Spielfeld mit Klassen als Felder

  Alt 16. Mai 2006, 14:44
Warum machst Du es nicht so:
Delphi-Quellcode:
TFeld = class
  end;
TBomb = class (TFeld)
  end;

TFeldRec = record
    Inhalt: Word;
    FObject: TFeld;
end;

TFeldArray = array[0..9,0..9 of TFeldRec];
Wenn Du normales Feld Inhalt := coFeld; oder Mauer Inhalt := coMauer; hast, dann steht dies über Inhalt bereit, und wenn Du die Bombe setzt, machst Du
Delphi-Quellcode:
Inhalt := coBombe;
FObject := TBombe.Create;
Da sprach der Stumme zum Blinden: "Du wirst sehen ..."
oder
Wer lesen kann, ist klar im Vorteil!
  Mit Zitat antworten Zitat
McLane

Registriert seit: 4. Sep 2004
37 Beiträge
 
Delphi 5 Professional
 
#15

Re: Spielfeld mit Klassen als Felder

  Alt 16. Mai 2006, 14:45
also die Lösung von Tigerman gefällt mir richtig. Ich würde aber noch testen ob an der Stelle im Array schon ein Feld existiert, sonst rennst du evtl. beim FFelder[i,j].Free in eine Exception.

Wegen dem override; bzw. reintroduce;
Das Override sollte man nehmen, damit eben nicht verdeckt wird. Und das Reintroduce brauchste wenn du mehrere gleichnamige Constructoren hast, also nen overload; mit bei hast aber trotzdem per inherited auf den Vorfahren zugreifen willst. Lass mich da aber auch gerne belehren (Mein Einsatzgebiet ist Fehlersuche und Korrektur, da hab ich mit Constructodefinitionen sogut wie nie was am Hut)
  Mit Zitat antworten Zitat
tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#16

Re: Spielfeld mit Klassen als Felder

  Alt 16. Mai 2006, 15:06
Free testet automatisch ob dort überhaupt eine Referenz steht. Noch besser wäre es, FreeAndNil zu nehmen, sonst kann das was du angesprochen hast (AccessViolation) doch noch passieren.

Ein Constructor muss (implizit) virtuell sein und wird deswegen auch immer überschrieben, nie verdeckt. Es ist ja gerade erforderlich, eine Instanz gerade der spezifischen Klasse zu erzeugen, und nicht irgendeiner Vorfahrklasse.
Christian
Der Computer hilft mir, Probleme zu lösen, die ich ohne Computer nicht hätte.
  Mit Zitat antworten Zitat
Benutzerbild von freak4fun
freak4fun

Registriert seit: 22. Sep 2004
Ort: Hannover
1.807 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#17

Re: Spielfeld mit Klassen als Felder

  Alt 16. Mai 2006, 15:48
Danke euch allen! Ich werd nun mal sehen, was ich davon umsetzen kann.

MfG
freak
Christian
IT: Schließen Sie bitte das Fenster. User: Die Tür auch?
i++; // zaehler i um 1 erhoehen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz