| Autor |
Beitrag |
xsus
      
Beiträge: 51
Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
|
Verfasst: Sa 10.12.11 13:31
Hey,
ich bin dabei ein Spiel zu schreiben, wo ein Schwein, Edit genannt, ein Platz zugewiesen wird (x- ,y-Koordinaten) und der Spieler dieses durch Eingabe der Koordinaten zu finden versucht.. Klingt relativ einfach und ich bin, glaube ich, auch schon sehr weit, nun bin ich aber an einem Punkt angekommen, an dem ich nicht weiter komme (PS: bin Anfänger^^)  ...wäre super wenn jmd mir beim lösen der Probs helfen könnte..zum einen zeigt Delphi Fehler an , vonwegen es gäbe nicht genügend wirkliche Parameter, zum anderen klappt das Abspielen von Sounds nicht, wie gewollt (es kommt nur der Windows-Beep) und ich erhalte die Exeption (Erste Gelegenheit für Exception bei $0051CEEE. Exception-Klasse $C0000005 mit Meldung 'access violation at 0x0051ceee: read of address 0x00000000'. Prozess Edit.exe (2004))...
Der Quelltext der Unit1 lautet:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66:
| unit Unit1;
interface
uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, mmSystem, mSchwein, mSpielfeld;
type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; Button2: TButton; Button3: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); private public end;
var Form1: TForm1; Spielfeld: TSpielfeld;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin Spielfeld.SetzeX:=StrToInt(Form1.Edit1.Text); Spielfeld.SetzeY:=StrToInt(Form1.Edit2.Text); Spielfeld.GibEditGefangen; if Spielfeld.GibEditGefangen=true then begin showmessage('Du hast Edit gefangen! Gewonnen!'); sndPlaySound('win.wav',SND_ASYNC) end else begin showmessage ('Du hast Edit nicht gefangen! Sorry!'); sndPlaySound('fail.wav',SND_ASYNC) end; end;
procedure TForm1.Button2Click(Sender: TObject); begin Spielfeld.InitSpiel; end;
procedure TForm1.Button3Click(Sender: TObject); begin close; end;
procedure TForm1.FormCreate(Sender: TObject); begin randomize; Spielfeld.InitSpiel; end;
end. |
Der Quelltext der Unit mSchwein:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62:
| UNIT mSchwein;
interface
type TSchwein = class
private x : Byte; y : Byte;
public constructor Create; virtual; procedure SetzeX (pX: Byte); virtual; procedure SetzeY (pY: Byte); virtual; function GibX : Byte; virtual; function GibY : Byte; virtual;
end;
implementation
constructor TSchwein.Create; begin x:=random(3); y:=random(3); end;
procedure TSchwein.SetzeX (pX: Byte); begin x := pX end;
procedure TSchwein.SetzeY (pY: Byte); begin y := pY end;
function TSchwein.GibX : Byte; begin result := x end;
function TSchwein.GibY : Byte; begin result := y end;
end. |
Der Quelltext der Unit mSpielfeld:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96:
| UNIT mSpielfeld;
interface
uses mSchwein;
type TSpielfeld = class
private EditGefangen : Boolean; Gefangen : Boolean; x : Byte; y : Byte; AnzahlFelder : Integer; Sau : TSchwein; Spielfeld:TSpielfeld;
public procedure InitSpiel; virtual; procedure SetzeAnzahlFelder (pAnzahlFelder: Integer); virtual; procedure SetzeX (pX: Byte); virtual; procedure SetzeY (pY: Byte); virtual; function GibEdit : TSchwein; virtual; function GibEditGefangen : Boolean; virtual; function GibX : Byte; virtual; function GibY : Byte; virtual;
end;
implementation
procedure TSpielfeld.InitSpiel; begin Spielfeld:=TSpielfeld.Create; Sau:=TSchwein.Create; EditGefangen:=false; AnzahlFelder:=3 end;
procedure TSpielfeld.SetzeAnzahlFelder (pAnzahlFelder: Integer); begin AnzahlFelder := pAnzahlFelder end;
procedure TSpielfeld.SetzeX (pX: Byte); begin x := pX end;
procedure TSpielfeld.SetzeY (pY: Byte); begin y := pY end;
function TSpielfeld.GibEdit : TSchwein; begin result := Sau end;
function TSpielfeld.GibEditGefangen : Boolean; begin if ((x=Sau.GibX) and (y=Sau.GibY)) then gefangen:=true else gefangen:=false; result := Gefangen end;
function TSpielfeld.GibX : Byte; begin result := x end;
function TSpielfeld.GibY : Byte; begin result := y end;
end. |
Ich weiß...das ist jetzt nen ziemlicher Haufen...wäre trotzdem toll, wenn jmd lust und zeit findet,..da nen bisschen mit zu helfen...
LG V.A.S.
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Sa 10.12.11 13:39
Tach,
Du musst erst eine Instanz von TSpielfeld erzeugen, bevor Du auf Spielfeld zugreifst.
Also z.B. im FormCreate:
Delphi-Quelltext 1:
| Spielfeld := TSpielfeld.Create; |
Gruß,
Jens
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
xsus 
      
Beiträge: 51
Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
|
Verfasst: Sa 10.12.11 13:58
Hallo, das habe ich bereits in InitSpiel getan...auch wenn ich es jetzt zusätzlich nochmal hinschreibe ..ändert sich nichts :/
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Sa 10.12.11 14:07
In InitSpiel ist es zu spät, das ist ja bereits eine Methode der Klasse. Und um die Methode nutzen zu können, musst Du die Klasse erst instanzieren.
Also: aus InitSpiel den Aufruf rausnehmen und nach FormCreate verschieben. Zeig mal den Code, wie es jetzt aussieht (von FormCreate, nicht alles).
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
xsus 
      
Beiträge: 51
Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
|
Verfasst: Sa 10.12.11 14:10
Soooo...
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TForm1.FormCreate(Sender: TObject); begin randomize; Spielfeld:=TSpielfeld.Create; Spielfeld.InitSpiel end; |
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Sa 10.12.11 14:54
Sieht gut aus. Welchen Fehler bekommst Du jetzt noch, und an welcher Stelle genau wird gemeckert?
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
xsus 
      
Beiträge: 51
Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
|
Verfasst: Sa 10.12.11 14:58
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.Button1Click(Sender: TObject); begin Spielfeld.SetzeX:=StrToInt(Form1.Edit1.Text); Spielfeld.SetzeY:=StrToInt(Form1.Edit2.Text); Spielfeld.GibEditGefangen; if Spielfeld.GibEditGefangen=true then begin showmessage('Du hast Edit gefangen! Gewonnen!'); sndPlaySound('win.wav',SND_ASYNC) end else begin showmessage ('Du hast Edit nicht gefangen! Sorry!'); sndPlaySound('fail.wav',SND_ASYNC) end; end; |
Also wie gesagt, das Problem , dass nur der Windows - Beep kommt, statt dem gewünschtem Sound. Und er zeigt Fehler in Zeile 3 und 4 : Nicht genügend wirkliche Parameter.
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Sa 10.12.11 15:00
Du musst vermutlich den kompletten Pfad zu den Wav-Dateien angeben.
Zeile 3 und 4 sehen eigentlich korrekt aus, da weiß ich grad nicht, woran das liegt.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
xsus 
      
Beiträge: 51
Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
|
Verfasst: Sa 10.12.11 15:04
Okee, vielen Dank ersteinmal,...
dann hilft nur noch abwarten, weil ich da halt auch nix finden konnte :/ 
|
|
jaenicke
      
Beiträge: 19338
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 10.12.11 15:28
SetzeX und SetzeY sind Prozeduren, die einen Parameter erwarten und keine Eigenschaften... Delphi-Quelltext 1: 2: 3: 4: 5:
| Spielfeld.SetzeX := StrToInt(Form1.Edit1.Text);
Spielfeld.SetzeX(StrToInt(Form1.Edit1.Text)); |
|
|
xsus 
      
Beiträge: 51
Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
|
Verfasst: Sa 10.12.11 15:33
Vielen vielen Dank! ...Funktioniert alles  Ihr seit Spitze
|
|
|