Hilfe mit Textadventure
Hallo ,
ich muss für die Schule als Projekt ein Textadventure mit Delphi 7 erstellen(nichts allzu kompliziertes). Ich habe nun schon ein wenig angefangen soweit ich konnte, jetzt komm ich aber bei den Attributen(?) für die Klassen nicht so recht weiter. Das ganze compiled zwar, nimmt aber die Attribute nicht so recht an (bleiben auf nil). Falls ich irgendeinen offensichlichen Fahler gemacht hab tut es mir leid aber wir haben erst ca. 15 Doppelstunden Informatik gehabt und unser Lehrer ist nicht grade gut im Erklären bzw. erklärt garnichts sondern gibt einfach nur Arbeitsblätter. Hier der Quellcode von Form1 :
Delphi-Quellcode:
Und hier der von URaum:
unit DelphiSpiel;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, URaum, ExtCtrls, StdCtrls, JPEG ; type TForm1 = class(TForm) Memo1: TMemo; Edit1: TEdit; Button1: TButton; Image1: TImage; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private public end; var Form1: TForm1; info_aktuellerRaum : string ; info_startRaum : string ; info_raum1 : string ; info_raum2 : string ; info_raum3 : string ; aktuellerRaum , startRaum , raum1 , raum2 , raum3 : TRaum ; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin image1.canvas.create ; startRaum := TRaum.Create; startRaum.setAusgang(raum1,nil,nil,nil); info_startRaum := 'Dies ist der Start. Hier geht es nur in eine Richtung' ; raum1 := TRaum.Create ; raum1.setAusgang(raum2,nil,raum3,nil,); info_raum1 := 'dies ist raum1' ; raum2 := TRaum.Create ; raum2.setAusgang(nil,raum1,nil,nil); info_raum2 := 'dies ist raum2' ; raum3 := TRaum.Create ; raum3.setAusgang(nil,nil,nil,raum1); info_raum3 := 'dies ist raum3' ; aktuellerRaum := TRaum.Create ; aktuellerRaum.setAusgang(nil,nil,nil,nil); info_aktuellerRaum := 'fehler' ; aktuellerRaum := startRaum ; info_aktuellerRaum := info_startRaum ; Memo1.Clear ; Memo1.Lines.add(info_aktuellerRaum) ; if aktuellerRaum.Fnorth <> nil then Memo1.Lines.add('---->Norden') ; if aktuellerRaum.Fsouth <> nil then Memo1.Lines.add('---->Süden') ; if aktuellerRaum.Feast <> nil then Memo1.Lines.add('---->Osten') ; if aktuellerRaum.Fwest <> nil then Memo1.Lines.add('---->Westen') ; if startRaum.Fnorth = nil then Memo1.Lines.add('attribute wurden nicht richtig festgelegt'); end; procedure TForm1.Button1Click(Sender: TObject); var eingabe : string; begin eingabe := edit1.Text ; if (eingabe = 'Norden')and (aktuellerRaum.Fnorth = nil) then aktuellerRaum := aktuellerRaum.Fnorth ; if (eingabe = 'Süden')and (aktuellerRaum.Fsouth <> nil) then aktuellerRaum := aktuellerRaum.Fsouth ; if (eingabe = 'Osten')and (aktuellerRaum.Feast <> nil) then aktuellerRaum := aktuellerRaum.Feast ; if (eingabe = 'Westen')and (aktuellerRaum.Fwest <> nil) then aktuellerRaum := aktuellerRaum.Fwest ; Memo1.clear ; Memo1.Lines.add(info_aktuellerRaum); if aktuellerRaum.Fnorth <> nil then Memo1.Lines.add('---->Norden') ; if aktuellerRaum.Fsouth <> nil then Memo1.Lines.add('---->Süden') ; if aktuellerRaum.Feast <> nil then Memo1.Lines.add('---->Osten') ; if aktuellerRaum.Fwest <> nil then Memo1.Lines.add('---->Westen') ; end; end.
Delphi-Quellcode:
Soweit ich inzwischen weiß müsste man das garnicht in verschieden Dateien machen, aber unser Leherer hat uns das so gezeigt.
unit URaum;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, JPEG; type TRaum = class Fnorth,Fsouth,Feast,Fwest : TRaum; procedure setAusgang(n,s,e,w : TRaum); Constructor Create; private public end; implementation Constructor TRaum.Create; begin self.Fnorth := Fnorth; self.Fsouth := Fsouth; self.Feast := Feast; self.Fwest := Fwest; end; procedure TRaum.setAusgang(n,s,e,w : TRaum) ; begin self.Fnorth := Fnorth; self.Fsouth := Fsouth; self.Feast := Feast; self.Fwest := Fwest; end; end. Schon mal vielen Dank im Vorraus. |
AW: Hilfe mit Textadventure
Ich drück mal beide Augen fest zu und antworte möglichst produktiv.
Schau mal hier:
Delphi-Quellcode:
Untersuche genau, was du hier zuweist.
procedure TRaum.setAusgang(n,s,e,w : TRaum) ;
begin self.Fnorth := Fnorth; self.Fsouth := Fsouth; self.Feast := Feast; self.Fwest := Fwest; end; gruß j |
AW: Hilfe mit Textadventure
Und den Sinn von
Zitat:
|
AW: Hilfe mit Textadventure
Also den Raum selber würde ich schon anders aufbauen. Warum merkt sich der Raum nicht die Beschreibung selber?
Und wenn ich mich von einem Raum in eine Richtung x bewege, dann kann diese Methode doch einfach eine Raum-Instanz zurückliefern. Gibt es keinen Raum in Richtung x, dann liefert der Raum einfach die eigene Instanz zurück.
Delphi-Quellcode:
Sieht viel einfacher aus und ist auch leichter zu verstehen.
Procedure TForm.Move ( ADirection : TDirection );
begin FCurrentRoom := FCurrentRoom.MoveTo ( ADirection ); end; |
AW: Hilfe mit Textadventure
Zitat:
Zitat:
|
AW: Hilfe mit Textadventure
Zitat:
Delphi-Quellcode:
var
a : Integer; begin a := a; // toll ... aber wozu, in a steht eh schon der Wert von a drin, weil ist ja auch a end;
Delphi-Quellcode:
Somit ist das nicht der Fehler auf dem AB deines Lehrers, sondern DU hast das nicht verstanden.
procedure TRaum.setAusgang(n,s,e,w : TRaum) ;
begin self.Fnorth := n; self.Fsouth := s; self.Feast := e; self.Fwest := w; end;
Delphi-Quellcode:
ruft den
image.canvas.create;
Delphi-Quellcode:
der bereits erzeugten Instanz auf. Es wird dadurch keine neue Instanz erzeugt. Ist in diesem Zusammenhang also sinnlos.
constructor
|
AW: Hilfe mit Textadventure
[QUOTE=Sir Rufo;1285957][QUOTE=MW28;1285948]
Zitat:
Delphi-Quellcode:
Auszug aus dem PDF Arbeitsblatt zum Constructor. Wir haben allerdings auch ein Blatt bekommen wo das so wie du das gemacht hast(also mit n,s,e,w) angedeutet wird.Die Möglichkeit die du nennst hatte ich schon einmal ausprobiert, macht aber auch keinen Unterschied. Das Problem bleibt bestehen.
constructor TFruit.Create(name: string);
begin // And save the fruit name self.name := name; end; |
AW: Hilfe mit Textadventure
Also schauen wir uns mal das vom Arbeitsblatt an
Delphi-Quellcode:
und das was du daraus gemacht hast
constructor TFruit.Create(name: string);
begin // And save the fruit name self.name := name; end;
Delphi-Quellcode:
Was fällt uns auf? Eben, denn richtig wäre
constructor TFruit.Create(name: string);
begin // And save the fruit name self.Fname := Fname; end;
Delphi-Quellcode:
denn
constructor TFruit.Create(name: string);
begin // And save the fruit name self.Fname := name; end;
Delphi-Quellcode:
Es hat einfach damit zu tun, dass der Compiler sich hier entscheiden muss, worauf sich
constructor TFruit.Create( {Argument} name: string);
begin // And save the fruit name self.name := {Argument} name; end;
Delphi-Quellcode:
denn nun bezieht. Auf ein Element der Klasse oder eben das Argument. Da das Argument der Methode in der Methode aber näher ist als die Klasse, bezieht sich
name
Delphi-Quellcode:
auf das Argument. Um auf die Klassen-Variable zuzugreifen muss man den Scope mit angeben durch
name
Delphi-Quellcode:
.
self.name
|
AW: Hilfe mit Textadventure
Es hat schon seinen Grund, warum Borland mal empfohlen hat, Parameter mit einem "A" als Prefix zu versehen, sowie Felder mit einem "F"-Prefix:
Delphi-Quellcode:
Nochmal hervorgehoben: self.FName := AName;constructor TFruit.Create(AName: string); begin // And save the fruit name self.FName := AName; end; So gibts auch keine babylonische Sprachverwirrung mit "name" als Parameter und "name" als Feld. Ich glaube, das der TE nämlich diesen Zusammenhang gar nicht erkannt hat. Und Asche auf das Haupt des Lehrers, der das selbst nicht gerafft hat. |
AW: Hilfe mit Textadventure
Woraus schliesst du, dass der Lehrer da was nicht gerafft hat? Das kann ich daraus nicht ableiten.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:44 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