![]() |
Snake/ sie mag nicht wenden
hey ich hätte mal eine frage. Ich programmiere im Moment snake. Habe die Kollisionsabfrage, einen Apfel der zufällig spawnt und die Schlange kann auch laufen aber lenken geht nicht :(
Delphi-Quellcode:
Was mache ich falsch?
unit Unit2;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, pngimage, pngextra, pnglang, ExtCtrls, StdCtrls; type TForm2 = class(TForm) Image1: TImage; Timer1: TTimer; Button1: TButton; Timer2: TTimer; Timer3: TTimer; Timer4: TTimer; Timer5: TTimer; Timer6: TTimer; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Timer2Timer(Sender: TObject); procedure Timer3Timer(Sender: TObject); procedure Timer4Timer(Sender: TObject); procedure Timer5Timer(Sender: TObject); procedure Timer6Timer(Sender: TObject); procedure Timer7Timer(Sender: TObject); procedure Timer8Timer(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form2: TForm2; implementation {$R *.dfm} TYPE Tfeld = //REcord für das Spielfeld wird angelegt record Bild: TImage; Name: String; End; var feld: array [1..17,1..13] of Tfeld; //array für Spielfeld wird angelegt var x,y,x2,y2 : integer; TYPE Tsnake = //record für die Schlange record x1 : integer; y1 : integer; end; var snake: array [1..12] of Tsnake; var olddirection, direction, dup, dright, ddown, dleft:string; //hilfvariabeln für die Richtung var längesnake: integer; //____________________Spielfeld______________________________________________________________________________________________ procedure init; var i : integer; begin i:=1; randomize; for x:=1 to 13 do begin; for y:=1 to 17 do begin; feld[x,y].Name := 'Gras'; feld[x,y].Bild := Timage.create(Form2); feld[x,y].Bild.parent := Form2; feld[x,y].Bild.top := x*50; feld[x,y].Bild.left := y*50; feld[x,y].Bild.Picture.LoadFromFile('images/gras.PNG'); //Gras laden end; end; for y:= 1 to 17 do begin; for x:=1 to 13 do begin; If (y = 1) or (y = 17) then begin; feld[x,y].Name := 'Wand'; feld[x,y].Bild := Timage.create(Form2); feld[x,y].Bild.parent := Form2; feld[x,y].Bild.top := x*50; feld[x,y].Bild.left := y*50; feld[x,y].Bild.Picture.LoadFromFile('images/wand-hoch.PNG') //Wand rechts und links laden end; end; end; for x:= 1 to 13 do begin; for y:=1 to 17 do begin; If (x = 1)or(x = 13) then begin; feld[x,y].Name := 'Wand'; feld[x,y].Bild := Timage.create(Form2); feld[x,y].Bild.parent := Form2; feld[x,y].Bild.top := x*50; feld[x,y].Bild.left := y*50; feld[x,y].Bild.Picture.LoadFromFile('images/wand-breit.PNG') //Wand oben und unten laden end; end; end; for x:=6 to 9 do begin; y:=9; feld[x,y].Name := 'Snake-Körper'; feld[x,y].Bild := Timage.create(Form2); feld[x,y].Bild.parent := Form2; feld[x,y].Bild.top := x*50; feld[x,y].Bild.left := y*50; feld[x,y].Bild.Picture.LoadFromFile('images/körper.PNG'); // Snake laden snake[i].x1:=x; snake[i].y1:=y; i:=i+1; end; x:= random(10)+2; y:= random(13)+2; //Apfel erscheint zufällig begin feld[x,y].Name := 'Apfel'; feld[x,y].Bild := Timage.create(Form2); feld[x,y].Bild.parent := Form2; feld[x,y].Bild.top := x*50; feld[x,y].Bild.left := y*50; feld[x,y].Bild.Picture.LoadFromFile('images/apfel.PNG'); //Apfel laden end; x:=0; y:=0; dup:= 'up'; dright:= 'right'; dleft:= 'left'; ddown:='down'; längesnake:=4; end; //______________________Spielfeld kreieren_________________________________________________________________________________________ procedure TForm2.FormCreate(Sender: TObject); begin Form2.DoubleBuffered:=True; init; //Spielfeld-Aufbau end; //_____________________________________________________________________________________________________ procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin case chr(key) of chr(38),'w', 'W': if olddirection <> ddown then begin direction:=dup; Timer1.Enabled:=true; Timer2.Enabled:=true; //Start der Bewegung olddirection:=direction; end; chr(40),'s', 'S': if olddirection <> dup then begin direction:=ddown; Timer3.Enabled:=true; Timer4.Enabled:=true; olddirection:=direction; end; chr(37),'a', 'A': if olddirection <> dright then direction := dleft; chr(39),'d', 'D': if olddirection <> dleft then begin direction := dright; Timer5.Enabled:=true; olddirection:=direction; end; end; end; procedure TForm2.Button1Click(Sender: TObject); begin Button1.Visible:=false; x:=5; y:=9; x2:=9; y2:=9; end; procedure TForm2.Timer1Timer(Sender: TObject); begin feld[x,y].Name := 'Snake-Körper'; feld[x,y].Bild := Timage.create(Form2); feld[x,y].Bild.parent := Form2; feld[x,y].Bild.top := x*50; feld[x,y].Bild.left := y*50; feld[x,y].Bild.Picture.LoadFromFile('images/körper.PNG'); x:=x-1; //nach oben bewegen If ((x <1) or (y <1) or (x>13) or (y>17) or (x2 <1) or (y2 <1) or (x2>13) or (y2>17) or (snake[1].x1 <1) or (snake[1].y1 <1) or (snake[1].x1>13) or (snake[1].y1>17)) then begin Timer1.Enabled:=false; Timer2.Enabled:=false; showmessage('Sie haben verloren! ):'); //Wandcrash-Abfrage end; end; procedure TForm2.Timer2Timer (Sender:TObject); begin feld[x2,y2].Name := 'Gras'; feld[x2,y2].Bild := Timage.create(Form2); feld[x2,y2].Bild.parent := Form2; feld[x2,y2].Bild.top := x2*50; feld[x2,y2].Bild.left := y2*50; feld[x2,y2].Bild.Picture.LoadFromFile('images/gras.PNG'); //läd Gras //auf das x2:=x2-1; //letzte Teil //der Snake end; procedure TForm2.Timer3Timer(Sender: TObject); begin Timer2.Enabled:=false; Timer1.Enabled:=false; Timer5.Enabled:=false; Timer2.Enabled:=false; feld[x,y].Name := 'Snake-Körper'; feld[x,y].Bild := Timage.create(Form2); feld[x,y].Bild.parent := Form2; feld[x,y].Bild.top := x*50; feld[x,y].Bild.left := y*50; feld[x,y].Bild.Picture.LoadFromFile('images/körper.PNG'); x:=x+1; //nach unten bewegen If ((x <1) or (y <1) or (x>13) or (y>17) or (x2 <1) or (y2 <1) or (x2>13) or (y2>17) or (snake[1].x1 <1) or (snake[1].y1 <1) or (snake[1].x1>13) or (snake[1].y1>17)) then begin Timer3.Enabled:=false; Timer4.Enabled:=false; showmessage('Sie haben verloren! ):'); //Wandcrash-Abfrage end; end; procedure TForm2.Timer4Timer (Sender:TObject); begin feld[x2,y2].Name := 'Gras'; feld[x2,y2].Bild := Timage.create(Form2); feld[x2,y2].Bild.parent := Form2; feld[x2,y2].Bild.top := x2*50; feld[x2,y2].Bild.left := y2*50; feld[x2,y2].Bild.Picture.LoadFromFile('images/gras.PNG'); //läd Gras //auf das x2:=x2+1; //letzte Teil //der Snake end; procedure TForm2.Timer5Timer(Sender: TObject); begin If direction=Dright then begin Timer1.Enabled:=false; Timer2.Enabled:=false; Timer3.Enabled:=false; Timer4.Enabled:=false; feld[x,y].Name := 'Snake-Körper'; feld[x,y].Bild := Timage.create(Form2); feld[x,y].Bild.parent := Form2; feld[x,y].Bild.top := x*50; feld[x,y].Bild.left := y*50; feld[x,y].Bild.Picture.LoadFromFile('images/körper.PNG'); y:=y+1; //nach rechts bewegen end; If ((x <1) or (y <1) or (x>13) or (y>17) or (x2 <1) or (y2 <1) or (x2>13) or (y2>17) or (snake[1].x1 <1) or (snake[1].y1 <1) or (snake[1].x1>13) or (snake[1].y1>17)) then begin Timer5.Enabled:=false; Timer2.Enabled:=false; showmessage('Sie haben verloren! ):'); //Wandcrash-Abfrage end; end; procedure TForm2.Timer6Timer (Sender:TObject); begin feld[x2,y2].Name := 'Gras'; feld[x2,y2].Bild := Timage.create(Form2); feld[x2,y2].Bild.parent := Form2; feld[x2,y2].Bild.top := x2*50; feld[x2,y2].Bild.left := y2*50; feld[x2,y2].Bild.Picture.LoadFromFile('images/gras.PNG'); //läd Gras //auf das x2:=x2+1; //letzte Teil //der Snake end; procedure TForm2.Timer7Timer(Sender: TObject); begin Timer1.Enabled:=false; Timer2.Enabled:=false; Timer3.Enabled:=false; Timer4.Enabled:=false; Timer5.Enabled:=false; Timer6.Enabled:=false; feld[x,y].Name := 'Snake-Körper'; feld[x,y].Bild := Timage.create(Form2); feld[x,y].Bild.parent := Form2; feld[x,y].Bild.top := x*50; feld[x,y].Bild.left := y*50; feld[x,y].Bild.Picture.LoadFromFile('images/körper.PNG'); y:=y-1; //nach links bewegen If ((x <1) or (y <1) or (x>13) or (y>17) or (x2 <1) or (y2 <1) or (x2>13) or (y2>17) or (snake[1].x1 <1) or (snake[1].y1 <1) or (snake[1].x1>13) or (snake[1].y1>17)) then begin Timer5.Enabled:=false; Timer2.Enabled:=false; showmessage('Sie haben verloren! ):'); //Wandcrash-Abfrage end; end; procedure TForm2.Timer8Timer (Sender:TObject); begin feld[x2,y2].Name := 'Gras'; feld[x2,y2].Bild := Timage.create(Form2); feld[x2,y2].Bild.parent := Form2; feld[x2,y2].Bild.top := x2*50; feld[x2,y2].Bild.left := y2*50; feld[x2,y2].Bild.Picture.LoadFromFile('images/gras.PNG'); //läd Gras //auf das x2:=x2+1; //letzte Teil //der Snake end; end. |
AW: Snake/ sie mag nicht wenden
Hallo!
Also ich hab ziemlich lange gebraucht um deinen Code zu verstehen, bzw. kenn ich mich noch immer nicht so ganz aus :/ Warum so viele Timer, ist es richtig dass du für jede Bewegungsrichtung einen Timer hast? Besser ist es, wenn du mit TPoint arbeitest!
Delphi-Quellcode:
Ebenso besser wäre es evt. die Kollisionsabfrage in eine Function zu geben..mit einem Boolean als Rückagewert.
var
Dir : TPoint; Speed : Integer; procedure onKeyDown(); begin iF Key = vk_LEFT Then Point(-1, 0); iF Key = vk_RIGHT Then Point( 1, 0); iF Key = vk_UP Then Point( 0, 1); iF Key = VK_DOWN Then Point( 0,-1); end; procedure Timer.OnTimer(); begin //Bewegung Koerper.Left := Koerper.Left + (Speed * Dir.X); Koerper.Top := Koerper.Top + (Speed * Dir.Y); //Kollisionsabfrage iF Collision Then begin Verloren(); end; end; lg /edit Einfacher ist es auch wenn du den TSnake-Record als Klasse machst z.B:
Delphi-Quellcode:
type
TSnake = class (TImage) function Collision() : Boolean; //für Kollisionsabfrage public Speed : Integer; Dir : TPoint ; Laenge : Integer; end; var Snake : TSnake; //Erstellen Snake := TSnake.Create(Form); with Snake do begin Parent := Form: Picture.LoadFromFile(''); Speed := 1; Dir := Point(0, 0); Laenge := 6; AutoSize := TRUE; Show; end; //Timer Snake.Left := Snake.Left + Snake.Dir.X; ... if Snake.Collision Then ... |
AW: Snake/ sie mag nicht wenden
Warum machst du einen neuen Thread auf und antwortest nicht in dem alten von dir?
![]() |
AW: Snake/ sie mag nicht wenden
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:45 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