AGB  ·  Datenschutz  ·  Impressum  







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

Hilfe mit Textadventure

Ein Thema von MW28 · begonnen am 8. Jan 2015 · letzter Beitrag vom 9. Jan 2015
Antwort Antwort
Seite 2 von 2     12   
MW28

Registriert seit: 8. Jan 2015
5 Beiträge
 
#11

AW: Hilfe mit Textadventure

  Alt 8. Jan 2015, 22:30
Ich der hat das glaube ich schon gerafft, aber den Schülern (also uns) hat der das nicht erklärt. Der Untericht frei im Stil von "Wenn ihr was nicht wisst googlt es." Das ist erstmal garkeine so schlechte Idee aber das ist auch nicht der Sinn eines Lehrers.

Edit: Hab jetzt den Code auf das hier geändert
Delphi-Quellcode:
procedure TRaum.setAusgang(Anorth,Asouth,Aeast,Awest : TRaum) ;
begin
self.Fnorth := Anorth;
self.Fsouth := Asouth;
self.Feast := Aeast;
self.Fwest := Awest;
end;
Allerdings kann ich mit dieser procedure immer noch nicht die Ausgänge festlegen , da sie auf nil bleiben. Ich glaub ich hab das ganze immer noch nicht richtig verstanden. Oder liegt der Fehler jetzt woanders?

Geändert von MW28 ( 8. Jan 2015 um 22:43 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#12

AW: Hilfe mit Textadventure

  Alt 9. Jan 2015, 00:43
Du hast noch ein anderes Problem. Mal ein Auszug aus deinem Code:
Delphi-Quellcode:
// 0
startRaum := TRaum.Create;
startRaum.setAusgang(raum1,nil,nil,nil);
info_startRaum := 'Dies ist der Start. Hier geht es nur in eine Richtung' ;

// 1
raum1 := TRaum.Create;
raum1.setAusgang(raum2,nil,raum3,nil);
info_raum1 := 'dies ist raum1' ;

// 2
raum2 := TRaum.Create ;
raum2.setAusgang(nil,raum1,nil,nil);
info_raum2 := 'dies ist raum2';
Bei "// 0" setzt du den ersten Parameter in setAusgang() auf "raum1". "raum1" ist zu diesem Zeitpunkt allerdings noch überhaupt nicht erstellt worden, und ist somit "nil". Dort steht also effektiv daher startRaum.setAusgang(nil,nil,nil,nil); . Nachträglich an "raum1" zugewiesene Werte werden nicht automatisch an in der Vergangenheit gemachte Zuweisungen weitergeleitet.
Bei "// 1" hast du letztlich genau dasselbe Problem, "raum2" und "raum3" sind dort noch "nil".
Bei "// 2" müsste aber "raum1" bereits mit einer Instanz von TRaum belegt sein, und somit wird dort NICHT "nil" im 2. Parameter übergeben. Dort sollte es tatsächlich passen.

Das simpelste wäre hier wohl, wenn man zuerst alle Räume erstellt, und erst danach allen ihre Ausgänge zuweist:
Delphi-Quellcode:
startRaum := TRaum.Create;
raum1 := TRaum.Create;
raum2 := TRaum.Create ;

info_startRaum := 'Dies ist der Start. Hier geht es nur in eine Richtung' ;
info_raum1 := 'dies ist raum1' ;
info_raum2 := 'dies ist raum2';

startRaum.setAusgang(raum1,nil,nil,nil);
raum1.setAusgang(raum2,nil,raum3,nil);
raum2.setAusgang(nil,raum1,nil,nil);
Auf die strukturellen "Fehler" sollten wir hier denke ich erstmal nicht weiter eingehen, das würde für ein Schulprojekt wohl zu weit führen, und den TE eher noch mehr verwirren. (So Dinge wie, dass die "info_*" Variablen nach OOP eigentlich ein Feld von TRaum sein sollten z.B.) Wichtiger ist erst mal, dass es überhaupt schon mal klappt. Alleine schon um den Spaß dran zu behalten.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
MW28

Registriert seit: 8. Jan 2015
5 Beiträge
 
#13

AW: Hilfe mit Textadventure

  Alt 9. Jan 2015, 13:51
Vielen Dank für die Hilfe. Ich hab den Code jetzt auf das hier verändert:
Delphi-Quellcode:
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 ;
raum1 := TRaum.Create ;
raum2 := TRaum.Create ;
raum3 := TRaum.Create ;
aktuellerRaum := TRaum.Create ;

startRaum.setAusgang(raum1,nil,nil,nil,'Dies ist der Start. Hier geht es nur in eine Richtung');
raum1.setAusgang(raum2,nil,raum3,nil,'dies ist raum1');
raum2.setAusgang(nil,raum1,nil,nil,'dies ist raum2');
raum3.setAusgang(nil,nil,nil,raum1,'dies ist raum3');
aktuellerRaum.setAusgang(nil,nil,nil,nil,'fehler');

info_startRaum := 'Dies ist der Start. Hier geht es nur in eine Richtung' ;
info_raum1 := 'dies ist raum1' ;
info_raum2 := 'dies ist raum2' ;
info_raum3 := 'dies ist raum3' ;
info_aktuellerRaum := 'fehler'  ;

aktuellerRaum := startRaum ;
info_aktuellerRaum := info_startRaum ;

Memo1.Clear ;
Memo1.Lines.add(aktuellerRaum.Finfo) ;
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(aktuellerRaum.Finfo);

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:
unit URaum;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, JPEG;

type
  TRaum = class
   Fnorth,Fsouth,Feast,Fwest : TRaum;
   Finfo : string;
   procedure setAusgang(Anorth,Asouth,Aeast,Awest: TRaum; Ainfo :string);
   Constructor Create;

   private

   public

end;

implementation
Constructor TRaum.Create;
begin

end;

procedure TRaum.setAusgang(Anorth,Asouth,Aeast,Awest : TRaum ; Ainfo :string) ;
begin
self.Fnorth := Anorth;
self.Fsouth := Asouth;
self.Feast := Aeast;
self.Fwest := Awest;
self.Finfo := Ainfo;
end;
end.
Funktioniert gut soweit. Ich komm vermutlich jetzt wieder alleine weiter. Nochmal vielen Dank.
  Mit Zitat antworten Zitat
OlafSt

Registriert seit: 2. Mär 2007
Ort: Hamburg
284 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#14

AW: Hilfe mit Textadventure

  Alt 9. Jan 2015, 14:16
Eine unschöne Sache ist da noch drin. Der leere constructor.

Konstruktoren dienen dazu, die einzelnen Felder des Objekts zu initialisieren. So, wie du es nun hast, gibt es ein Problem: Nach dem Aufruf von TRaum.Create; sind die Felder FNorth...FEast von TRaum mit "irgendwas" gefüllt. Ein Test auf nil (um festzustellen, das es in diese Richtung nicht weitergeht) kann also problemlos ergeben "da gehts weiter", denn "irgendwas" ist nicht nil. Du arbeitest dann mit ungültigen Daten, was direkt in eine Schutzverletzung mündet.

Nutze den Konstruktor also, um solche Probleme gar nicht erst entstehen zu lassen und setze die Felder von TRaum auf nil. Das erspart viel Ärger und womöglich aufwändige Fehlersucherei.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.160 Beiträge
 
Delphi 10 Seattle Enterprise
 
#15

AW: Hilfe mit Textadventure

  Alt 9. Jan 2015, 14:20
Das der leere Konstruktor unnötig ist stimmt zwar, die Begründung ist aber Quatsch. Die Felder sind definitiv mit Nil initialisiert. Das verwechselst du mit lokalen Variablen in einer Methode, die sind es nämlich nicht.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#16

AW: Hilfe mit Textadventure

  Alt 9. Jan 2015, 14:30
Das der leere Konstruktor unnötig ist stimmt zwar, die Begründung ist aber Quatsch. Die Felder sind definitiv mit Nil initialisiert. Das verwechselst du mit lokalen Variablen in einer Methode, die sind es nämlich nicht.
So isses
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#17

AW: Hilfe mit Textadventure

  Alt 9. Jan 2015, 14:42
Das der leere Konstruktor unnötig ist stimmt zwar, die Begründung ist aber Quatsch. Die Felder sind definitiv mit Nil initialisiert. Das verwechselst du mit lokalen Variablen in einer Methode, die sind es nämlich nicht.
So isses
Mal isses so, mal isses so, machen und dann weiß man was man hat.
(Dann gibt es auch kein "Oh, das hab' ich glaub' ich verwechselt")

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#18

AW: Hilfe mit Textadventure

  Alt 9. Jan 2015, 14:45
Lokale Variablen werden nicht initialisiert, das sollte bekannt sein.
Record Felder mit nicht gemanagten Typen, sind nicht initialisiert, sollte auch bekannt sein.
Der Rest ist initialisiert.

Was ist daran mal so mal so?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 9. Jan 2015 um 14:48 Uhr)
  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 07:40 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