Autor Beitrag
xsus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51

Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
BeitragVerfasst: 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:
ausblenden volle Höhe Delphi-Quelltext
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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:
ausblenden volle Höhe Delphi-Quelltext
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


//--------------------  ggf Uses-Liste einfügen !  --------------------


type
  TSchwein = class

  private //Attribute
    x : Byte;
    y : Byte;

  public //Methoden
    constructor Create; virtual;
    procedure SetzeX (pX: Byte); virtual;
    procedure SetzeY (pY: Byte); virtual;
    function GibX : Byte; virtual;
    function GibY : Byte; virtual;

   end;

implementation

//+---------------------------------------------------------------------
//|         TSchwein: Methodendefinition 
//+---------------------------------------------------------------------

//-------- Create (public) ---------------------------------------------
constructor TSchwein.Create;
begin
  x:=random(3);
  y:=random(3);
end;

//-------- SetzeX (public) ---------------------------------------------
procedure TSchwein.SetzeX (pX: Byte);
begin
  x := pX
end;

//-------- SetzeY (public) ---------------------------------------------
procedure TSchwein.SetzeY (pY: Byte);
begin
  y := pY
end;

//-------- GibX (public) -----------------------------------------------
function TSchwein.GibX : Byte;
begin
  result  := x
end;

//-------- GibY (public) -----------------------------------------------
function TSchwein.GibY : Byte;
begin
  result  := y
end;

end.


Der Quelltext der Unit mSpielfeld:
ausblenden volle Höhe Delphi-Quelltext
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

//--------------------  ggf Uses-Liste anpassen !  --------------------
uses mSchwein;

type
  TSpielfeld = class

  private //Attribute
    EditGefangen : Boolean;
    Gefangen : Boolean;
    x : Byte;
    y : Byte;
    AnzahlFelder : Integer;
    Sau : TSchwein;
    Spielfeld:TSpielfeld;

     //Objektbeziehungen:
        // hatTSchwein : TSchwein;

  public //Methoden
    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

//+---------------------------------------------------------------------
//|         TSpielfeld: Methodendefinition 
//+---------------------------------------------------------------------

//-------- InitSpiel (public) ------------------------------------------
procedure TSpielfeld.InitSpiel;
begin
  Spielfeld:=TSpielfeld.Create;
  Sau:=TSchwein.Create;
  EditGefangen:=false;
  AnzahlFelder:=3
end;

//-------- SetzeAnzahlFelder (public) ----------------------------------
procedure TSpielfeld.SetzeAnzahlFelder (pAnzahlFelder: Integer);
begin
  AnzahlFelder := pAnzahlFelder
end;

//-------- SetzeX (public) ---------------------------------------------
procedure TSpielfeld.SetzeX (pX: Byte);
begin
  x := pX
end;

//-------- SetzeY (public) ---------------------------------------------
procedure TSpielfeld.SetzeY (pY: Byte);
begin
  y := pY
end;

//-------- GibEdit (public) --------------------------------------------
function TSpielfeld.GibEdit : TSchwein;
begin
  result := Sau
end;

//-------- GibEditGefangen (public) ------------------------------------
function TSpielfeld.GibEditGefangen : Boolean;
begin
  if ((x=Sau.GibX) and (y=Sau.GibY)) then
     gefangen:=true
  else
     gefangen:=false;
  result := Gefangen
end;

//-------- GibX (public) -----------------------------------------------
function TSpielfeld.GibX : Byte;
begin
  result  := x
end;

//-------- GibY (public) -----------------------------------------------
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51

Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51

Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
BeitragVerfasst: Sa 10.12.11 14:10 
Soooo...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.FormCreate(Sender: TObject);
begin
  randomize;
  Spielfeld:=TSpielfeld.Create;
  Spielfeld.InitSpiel
end;
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51

Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
BeitragVerfasst: Sa 10.12.11 14:58 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51

Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
BeitragVerfasst: Sa 10.12.11 15:04 
Okee, vielen Dank ersteinmal,...
dann hilft nur noch abwarten, weil ich da halt auch nix finden konnte :/ :)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19338
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 10.12.11 15:28 
SetzeX und SetzeY sind Prozeduren, die einen Parameter erwarten und keine Eigenschaften...
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  Spielfeld.SetzeX := StrToInt(Form1.Edit1.Text);
// das ist eine Zuweisung, kein Prozeduraufruf

// richtig:
  Spielfeld.SetzeX(StrToInt(Form1.Edit1.Text));
xsus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51

Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
BeitragVerfasst: Sa 10.12.11 15:33 
Vielen vielen Dank! ...Funktioniert alles ;) Ihr seit Spitze