![]() |
Snake Steuerung
Hallo Liebe Member,
ich habe ein Problem mit der Steuerung von Snake. Ich selber habe schon einige Zeit nach dem Fehler gesucht aber nichts gefunden. Evtl. kann mir ja einer von euch helfen. Hier der Programmcode:
Delphi-Quellcode:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TSpiel = class(TForm) Spielfeld: TImage; Timer1: TTimer; Punkte: TLabel; rang: TLabel; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private-Deklarationen } public { Public-Deklarationen } end; const sup = 1; sdown = 2; sleft = 3; sright = 4; Wand = 5; Essen = 6; var Spiel: TSpiel; Karte: array[1..150] of array[1..150] of integer; // Doppeltes Array Schlange: array of TPoint; Essenposition: Tpoint; // position des Essens schlangenlaenge,setlaenge, KeyDirection,Direction,level, P, HighScore: integer; //HSFile: TIniFile; implementation uses Unit2; {$R *.dfm} procedure Spielflaeche(x,y: integer; color: Tcolor); // Spielfeld zeichnen begin with Spiel.Spielfeld.canvas do begin pen.color:= color; brush.color:= color; rectangle(x*5-4, y*5-4, x*5, y*5); end; end; procedure Zeichnewand; var x, y, i: integer; begin for i:= 1 to 90 do begin x:= 1; y:= i; Spielflaeche(x, y, clblack); Karte[x, y]:= Wand; x:= 90; // Feldgröße; Spielflaeche(x, y, clblack); Karte[x, y]:= Wand; x:= i; y:= 1; Spielflaeche(x, y, clblack); Karte[x, y]:= Wand; y:= 90; // Feldgröße Spielflaeche(x, y, clblack); Karte[x, y]:= Wand; end; end; procedure Zeichnekarte; var x, y, i: integer; begin with Spiel.Spielfeld.Canvas do begin brush.color:= clwhite; rectangle(0, 0, 450, 450); end; x:= 0; y:= 0; for i:= 0 to 40 do begin with Spiel.Spielfeld.canvas do x:= x + 5; y:= y + 5; end; Zeichnewand; end; procedure Zeichneschlange; var i: integer; begin Spielflaeche(Schlange[0].X, Schlange[0].Y, clred); for i:= 1 to Schlangenlaenge do Spielflaeche(Schlange[i].X, Schlange[i].Y, clgreen); end; procedure Zeichneessen; begin Spielflaeche(Essenposition.x, Essenposition.y, clblue); end; procedure ErstelleEssen; var i: integer; begin Essenposition.X:= random(37) + 2; Essenposition.Y:= random(37) + 2; for i:= 0 to Schlangenlaenge do if (Schlange[i].X = Essenposition.X) and (Schlange[i].Y = Essenposition.Y) then ErstelleEssen else Karte[Essenposition.x, Essenposition.y]:= Essen; end; procedure StartGame; var i, x, y: integer; begin //try //HSFile:=TIniFile.Create('Highscore.ini'); //HighScore:= HSFile.Readinteger('Score', 'HighScore', 0); //finally //HSFile.Free; //end; //Spiel.HSDisplay.caption:= 'HighScore: ' + inttostr(HighScore); Spiel.Timer1.Enabled:= true; P:= 0; Spiel.Punkte.Caption:= 'Punkte: ' + inttostr(P); for x:= 1 to 40 do for y:= 1 to 40 do Karte[x, y]:= 0; direction:= random(4)+1; schlangenlaenge:= 8; setlength(schlange, schlangenlaenge + 1); schlange[0].x:= random(20) + 10; schlange[0].y:= random(20) + 10; for i:= 1 to schlangenlaenge do begin schlange[i].Y:= schlange[0].Y; schlange[i].X:= schlange[0].X; end; ErstelleEssen; Zeichnekarte; ZeichneEssen; Zeichneschlange; end; procedure GameOver; begin Spiel.Timer1.Enabled:= false; //try //HSFile:=TIniFile.Create('Highscore.ini'); //if HSFile.Readinteger('Score', 'HighScore', 0) < Points //then HSFile.Writeinteger('Score', 'Highscore', Points); //finally // HSFile.Free; //end; showmessage('Spielvorbei!'); StartGame; end; procedure TSpiel.FormCreate(Sender: TObject); begin randomize; Spiel.DoubleBuffered:= true; StartGame; end; procedure TSpiel.Timer1Timer(Sender: TObject); var i,c:integer; begin for i:= schlangenlaenge downto 1 do begin schlange[i].y:= schlange[i-1].Y; schlange[i].X:= schlange[i-1].X; end; if Direction = sUp then schlange[0].Y:= schlange[0].Y - 1 else if Direction = sDown then schlange[0].Y:= schlange[0].Y + 1 else if Direction = sLeft then schlange[0].X:= schlange[0].X - 1 else if Direction = sRight then schlange[0].X:= schlange[0].X + 1 else if Karte[schlange[0].X, schlange[0].y] = Wand then begin GameOver; exit; end; if Karte[schlange[0].X, schlange[0].Y] = Essen then begin P:= P + 25; // Zählen der Punkte Punkte.Caption:= 'Punkte: ' + inttostr(P);//Punkte schlangenlaenge:= schlangenlaenge + 1; setlength(schlange, schlangenlaenge + 1); Karte[Essenposition.x, Essenposition.y]:= 0; ErstelleEssen; end; for c:= 1 to schlangenlaenge do if (schlange[0].X = schlange[c].X) and (schlange[0].Y = schlange[c].Y) then begin GameOver; exit; end; Zeichnekarte; Zeichneessen; ZeichneSchlange; //LVL Backgroundwechsel if p=100 then begin Spielfeld.Picture.LoadFromFile('Bilder/lvl2.bmp'); level:=level+1; rang.Caption:='Level: '+inttostr(level); timer1.Interval:=timer1.interval-20; end; if p=150 then begin Spielfeld.Picture.LoadFromFile('Bilder/lvl3.bmp'); level:=level+1; rang.Caption:='Level: '+inttostr(level); timer1.Interval:=timer1.interval-20; end; if p=200 then begin Spielfeld.Picture.LoadFromFile('Bilder/lvl4.bmp'); level:=level+1; rang.Caption:='Level: '+inttostr(level); timer1.Interval:=timer1.interval-20; end; if p=250 then begin Spielfeld.Picture.LoadFromFile('Bilder/lvl5.bmp'); level:=level+1; rang.Caption:='Level: '+inttostr(level); timer1.Interval:=timer1.interval-20; end; if p=300 then begin Spielfeld.Picture.LoadFromFile('Bilder/lvl6.bmp'); level:=level+1; rang.Caption:='Level: '+inttostr(level); timer1.Interval:=timer1.interval-20; end; if p=350 then begin Spielfeld.Picture.LoadFromFile('Bilder/lvl7.bmp'); level:=level+1; rang.Caption:='Level: '+inttostr(level); timer1.Interval:=timer1.interval-20; end; if p=400 then begin Spielfeld.Picture.LoadFromFile('Bilder/lvl8.bmp'); level:=level+1; rang.Caption:='Level: '+inttostr(level); timer1.Interval:=timer1.interval-20; end; if p=450 then begin Spielfeld.Picture.LoadFromFile('Bilder/lvl9.bmp'); level:=level+1; rang.Caption:='Level: '+inttostr(level); timer1.Interval:=timer1.interval-20; end; if p=500 then begin Spielfeld.Picture.LoadFromFile('Bilder/lvl10.bmp'); level:=level+1; rang.Caption:='Level: '+inttostr(level); timer1.Interval:=timer1.interval-19; end; end; procedure TSpiel.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (key = vk_up) and (Direction <> sDown) then Direction:= sUp ; if (key = vk_down) and (Direction <> sUp) then Direction:= sDown; if (key = vk_left) and (Direction <> sRight) then Direction:= sleft; if (key = vk_right) and (Direction <> sLeft) then Direction:= sright; end; end. Vielen Dank schon mal für eure Hilfe. |
Re: Snake Steuerung
Wo genau liegt dein Problem? Ich hab mir den Code zwar angesehn aber auf den ersten Blick nichts falsches gefunden. Hast du KeyPreview der form auf true?
PS: Die Verwaltung deiner Schlange ist durch das umkopieren im Array relativ langsam. Ich habe damals deshalb dann auf eine doppelt verlinkte Liste gewechselt. |
Re: Snake Steuerung
ja habe ich, leider bringt dies auch nichts. Das Problem ist das ich die Schlange nicht steuern kann.
|
Re: Snake Steuerung
Setz mal einen Breakpoint in FormKeyDown - oder lasse eine ShowMessage anzeigen. Wird der Event denn überhaupt ausgelöst?
|
Re: Snake Steuerung
was ist denn ein Breakepoint?
Also ich habe nun mal eine showmassage in die Form Key down eingefügt. Es wurde aber die Massage nicht aufgerufen. D.h. Die Procedure wird nicht aufgerufen |
Re: Snake Steuerung
Hmm... dumm, dass meine kompletten Delphiprojekte bei einem Crash mal vernichtet wurden... Backup hätte geholfen... ich glaube es war GetAsynchKeyState mit dem ich direkt im Timer die Tasten abgefragt hatte...
|
Re: Snake Steuerung
Weis mal dem OnKeyDown des TImage das OnKeyDown der Form zu. Im OI im Reiter Ereignisse.
mfg Flö |
Re: Snake Steuerung
Ein Breakpoint ist ein "Haltepunkt" für den Debugger. Den kannst du entweder setzen, indem du in eine Zeile gehst und F5 drückst oder links in dem kleinen grauen Bereich ausserhalb des Editors neben der Zeile klickst.
![]() Bzgl deines Problems: Schau mal in den Objektinspektor (F11) von deiner TSpiel-Form. Und dann prüfe, ob die Eigenschaft "KeyPreview" auch wirklich auf "True" steht. |
Re: Snake Steuerung
Also erst mal an alle ein Großes Danke. Habe das Problem behoben. Nun liegt ein anders Problem vor. Wenn die Schlange sich in richtung Wand bewegt ist das Spiel nicht vorbei wenn die Schlange die Wand berührt.
Vielleicht kann einer noch mal Helfen. MFG |
Re: Snake Steuerung
Das Spiel soll vorbei sein, wenn die Schlange versucht durch die Wand zu laufen.
Du musst eben überprüfen ob der Kopf der Schlange mit dem Zug in die Wand läuft. Einfachste Mathematik. Left, Top sind deine Freunde... mfg Flö |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz