Dieser Thread hat lange Quelltexte allerdings ist nur der erste Beitrag zum Verständnis wichtig (weiter unten ist der Absatz der das eigentliche Problem beschreibt hervorgehoben). der dritte und vierte Beitrag liefern wichtige Hinweise während der zweite nur als referenz den Quelltext zeigt.
Hallo,
ich programmiere im Moment an einem kleinen Spiel. Dabei werden beim Klicken auf eines der felder eines 7*7 2DBrettes Karten umgedreht. Beim Starten des Spiel funktioniert das zuweisen von Bildern noch super zu den einzelnen Feldern, allerdings gibt es nun Probleme. Die fehlermeldung erscheint nicht beim Compilieren sondern zur Laufzeit. Ich habe folgendes Onclickereingis erzeugt:
Delphi-Quellcode:
procedure TForm1.OnImageClick(Sender: TObject); //Beim Klicken auf ein Feld
var x,y: integer;
begin
x:=Tfieldpic(Sender).Fieldx; //Feldkoordinaten von obenlinks aus gesehen zuweisen, sodass
y:=Tfieldpic(Sender).Fieldy; // die Koordinaten verwendet werden können durch den Array eines
// Feldes das richtige Feld ansprechen zu können
if fields[x,y].picstatus=hidden then //Falls Karte noch nicht aufgedeckt
begin
ShowCard(x,y); //führe die Prozedur: Aufdecken der Karte aus , x und y werden übergeben damit das feld angesprochen werden kann auf das geklickt wurde
end
else
begin
showmessage('nicht versteckt');
end;
end;
Diese Prozedur wirf noch keine Probleme auf, vielmehr ist es die in der Prozedur aufgerufene Prozedur "ShowCard". Die Zuweisung der Variablen x und y funktioniert problemfrei dies hatte ich nach dem schreiben auch mittels Dialogfeldern gecheckt, die beim Klicken auf ein Feld die Koordinaten anzeigen. Nun zu dem Problem mit der Prozedur "ShowCard":
Delphi-Quellcode:
procedure Tform1.ShowCard(x,y: integer); //Prozedur zum Umdrehen einer Karte , x und y um wieder das richtige Feld ansprechen zu können
var rand,rand2: integer;
begin
rand:=random(48)+1; //1..8jae 9..10holzf 11..12baer 13..18fuchs 19..26fasan 27..33ente 34..40nadel 41..48laub
{die Zahlen 1-8 sollen das Umdrehen eines Jägers zur Folge haben, die Zahlen 9-10 das eines holzfällers, usw}
//jae tritt ein
if (rand=1) or (rand=2) or (rand=3) or (rand=4) or (rand=5) or (rand=6) or (rand=7) or (rand=8) then //falls rand 1-8 soll versucht werden einen Jaeger umzudrehen
begin
if totala.jae>0 then //falls noch Jäger im Spiel sind (es dürfen maximal 8 Jäger im Spiel sein)
begin
rand2:=random(4)+1; //zweite Zufallsvariable, da Jäger in vier richtungen aufgedeckt werden können
//1=schussrichtung links, 2=Schussrichtung rechts, 3=schussrichtung oben, 4=schussrichtung unten
fields[x,y]:=Cjae; // dem Feld werden die standardmäßigen Jäger eigenschaften zugewiesen
totala.jae:=totala.jae-1;
//1jaeleft 2jaeright 3jaeup 4jaedown
if rand2=1 then //Jaeger mit schuss nach links wird erzeugt
begin
fields[x,y].pic.picture.assign(piclist[0,0]); //Bild mit dem nach linksgerichteten Jäger wird zugewiesen
fields[x,y].picindex.typ:=0; //die dazugehörige Bildindexnummer wird zugewiesen
fields[x,y].picstatus:=shown;
end
else if rand2=2 then //Jaeger mit schuss nach rechts wird erzeugt (rest wie oben)
begin
fields[x,y].pic.picture.assign(piclist[1,0]); //piclist ist ein Bilderindex
fields[x,y].picindex.typ:=1;
fields[x,y].picstatus:=shown;
end
else if rand2=3 then
begin
fields[x,y].pic.picture.assign(piclist[2,0]);
fields[x,y].picindex.typ:=2;
fields[x,y].picstatus:=shown;
end
else if rand2=4 then
begin
fields[x,y].pic.picture.assign(piclist[3,0]);
fields[x,y].picindex.typ:=3;
fields[x,y].picstatus:=shown;
end;
end
else if totala.jae=0 then //falls schon alle Jäger aufgedeckt waren Prozedur nochmal ausführen (später führt dies zum aufdecken der anderen Karten)
begin
showmessage('alle 8 jäger aufgedeckt');
ShowCard(x,y);
end;
end
//iwasanderes tritt ein
else
begin
showmessage('kein Jäger aufgedeckt');
end;
end;
Die Prozedur ist noch nicht fertig die Teile zum aufdecken der anderen Karten kommt später hinzu. Nun habe ich folgenden Fehler: Wenn nach dem Klicken auf ein Feld die Zufallsvariable nicht einen Wert von 1-8 erhält so kommt ganz richtig die Meldung" Kein Jäger aufgedeckt". Wenn allerdings das Ereignis das rand=1-8 eintritt so bekomme ich einen "Access Violation" fehler. Nun das Kuriose:
Das ganze erzeugt überhaupt keinen fehler sobal ich
fields[x,y].pic.picture.assign(piclist[0,0]);
durch
fields[1,1].pic.picture.assign(piclist[0,0]);
Daher dachte ich, dass es an dem Übergeben der Koordinatenvariablen x und y liegen müsste aber auch das ist nicht der Fall denn diese Zeile:
fields[x,y].picstatus:=shown;
funktioniert einwandfrei (getestet durch showmessage)
Nun die Frage: Was mache ich falsch, sodass es nicht möglich ist dem feld auf das ich KLICKE (das ist ja nicht in jedem Fall das mit den koordinaten x=1 und y=1) ein Bild aus der Liste zuzuweisen?
Über Hilfe würde ich mich sehr freuen. Schon mal vielen Dank im Vorraus
mfg KahPee