hallo, hab mich mal an snake probiert, aber irgendwie funzt es nicht...
hier der quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
Image1: TImage; // Zeichenfläche
Button1: TButton;
TrackBar1: TTrackBar;
Label1: TLabel;
Label2: TLabel;
Timer1: TTimer;
IKRechts: TImage; // Kopf-Bilder
IKOben: TImage;
IKLinks: TImage;
IKUnten: TImage;
IBody: TImage; // Körper-Bild
ILeer1: TImage; // zum Überdecken
IFutter1: TImage;
IFutter2: TImage;
IFutter3: TImage;
IFutter4: TImage;
ILeer2: TImage;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
procedure Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Edit1Exit(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
type
TRichtung = (rechts,hoch,links,runter);
type
TGlied = record
x,y : integer;
end;
type
CSnake = class
Glied : array[0..1000] of TGlied;
Kopf : TGlied;
Laenge : integer;
Futter : TGlied;
procedure Init;
procedure Draw;
procedure Move;
procedure Feed;
end;
var
Form1: TForm1;
Snake : CSnake;
Richtung : TRichtung;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
if Button1.Caption = 'Start' then
begin
Trackbar1.Enabled := false;
Timer1.Enabled := true;
Button1.Caption := 'Stop';
Edit1.SetFocus; // Im Hintergund v. Image1 zur Ereignisannahme
Snake.Init;
end;
if Button1.Caption = 'Stop' then
begin
Trackbar1.Enabled := true;
Timer1.Enabled := false;
Button1.Caption := 'Start';
Image1.Canvas.Brush.Color := clWhite;
Image1.Canvas.Pen.Color := clWhite;
Image1.Canvas.Rectangle(Image1.Canvas.ClipRect);
end;
end;
procedure CSnake.Init;
var
i : integer;
ok : boolean;
zahl : integer;
label essen;
begin
ok := true;
Laenge := 5;
Kopf.x := 6;
Kopf.y := 4;
for i := 0 to Laenge - 1 do
begin
Glied[i].x := 5 - i;
Glied[i].y := 4;
end;
Richtung := rechts;
Randomize;
essen:
Futter.x := random(36);
Futter.y := random(36);
for i := 0 to Laenge - 1 do
if ok then
if (Glied[i].x = Futter.x) and (Glied[i].y = Futter.y) then
ok := false;
if ok = false then goto essen;
zahl := random(4);
case zahl of
0 : begin
Form1.Image1.Canvas.Draw(Futter.x*10,Futter.y*10,Form1.IFutter1.Picture.Bitmap);
end;
1 : begin
Form1.Image1.Canvas.Draw(Futter.x*10,Futter.y*10,Form1.IFutter2.Picture.Bitmap);
end;
2 : begin
Form1.Image1.Canvas.Draw(Futter.x*10,Futter.y*10,Form1.IFutter3.Picture.Bitmap);
end;
3 : begin
Form1.Image1.Canvas.Draw(Futter.x*10,Futter.y*10,Form1.IFutter4.Picture.Bitmap);
end;
end;
end;
procedure CSnake.Draw;
var
i : integer;
begin
if Richtung = rechts then
Form1.Image1.Canvas.Draw(Kopf.x*10,Kopf.y*10,Form1.IKRechts.Picture.Bitmap)
else if Richtung = hoch then
Form1.Image1.Canvas.Draw(Kopf.x*10,Kopf.y*10,Form1.IKOben.Picture.Bitmap)
else if Richtung = links then
Form1.Image1.Canvas.Draw(Kopf.x*10,Kopf.y*10,Form1.IKLinks.Picture.Bitmap)
else if Richtung = runter then
Form1.Image1.Canvas.Draw(Kopf.x*10,Kopf.y*10,Form1.IKUnten.Picture.Bitmap);
for i := 0 to Laenge - 1 do
Form1.Image1.Canvas.Draw(Glied[i].x*10,Glied[i].y*10,Form1.IBody.Picture.Bitmap);
Form1.Image1.Canvas.Draw(Glied[Laenge].x*10,Glied[Laenge].y*10,Form1.ILeer1.Picture.Bitmap);
end;
procedure CSnake.Move;
var
i : integer;
begin
for i := Laenge downto 1 do
Glied[i] := Glied[i-1];
Glied[0] := Kopf;
if Richtung = rechts then Kopf.x := Kopf.x + 1
else if Richtung = hoch then Kopf.y := Kopf.y - 1
else if Richtung = links then Kopf.x := Kopf.x - 1
else if Richtung = runter then Kopf.y := Kopf.y + 1;
if Kopf.x > 36 then Kopf.x := 0;
if Kopf.x < 1 then Kopf.x := 37;
if Kopf.y > 36 then Kopf.y := 0;
if Kopf.y < 1 then Kopf.y := 37;
end;
procedure CSnake.Feed;
var
punkte,i,zahl : integer;
ok : boolean;
label essen;
begin
punkte := StrToInt(Form1.Label2.Caption);
if not (Kopf.x = Futter.x) and not (Kopf.y = Futter.y) then
begin
punkte := punkte + 10;
Form1.Label2.Caption := IntToStr(punkte);
end;
randomize;
essen:
Futter.x := random(36);
Futter.y := random(36);
for i := 0 to Laenge - 1 do
if ok then
if (Glied[i].x = Futter.x) and (Glied[i].y = Futter.y) then
ok := false;
if ok = false then goto essen;
zahl := random(4);
case zahl of
0 : begin
Form1.Image1.Canvas.Draw(Futter.x*10,Futter.y*10,Form1.IFutter1.Picture.Bitmap);
end;
1 : begin
Form1.Image1.Canvas.Draw(Futter.x*10,Futter.y*10,Form1.IFutter2.Picture.Bitmap);
end;
2 : begin
Form1.Image1.Canvas.Draw(Futter.x*10,Futter.y*10,Form1.IFutter3.Picture.Bitmap);
end;
3 : begin
Form1.Image1.Canvas.Draw(Futter.x*10,Futter.y*10,Form1.IFutter4.Picture.Bitmap);
end;
end;
Laenge := Laenge + 1;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Snake.Move;
Snake.Draw;
end;
procedure TForm1.Edit1Exit(Sender: TObject);
begin
if (Timer1.Enabled = true) and not Button1.Focused then
begin
Application.ProcessMessages;
Edit1.SetFocus;
end;
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
Timer1.Interval := (10 - TRackbar1.Position) * 50;
end;
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
37:
if not (Richtung = rechts) then Richtung := rechts;
38: begin
if not (Richtung = hoch) then Richtung := hoch;
end;
39: begin
if not (Richtung = links) then Richtung := links;
end;
40: begin
if not (Richtung = runter) then Richtung := runter;
end;
end;
end;
end.
ja und nun gibts nen laufzeitfehler wenn ich button1 drücke, wobei der haltepunkt bei" Laenge := 5;" im quelltext gesetzt wird...
zum laufzeitfehler kann ich nix sagen, irgndwie "ungültiger vorgang im modul xyz blablabla..."
weiß jmd wo fehler stecken?
hier der quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
Image1: TImage; // Zeichenfläche
Button1: TButton;
TrackBar1: TTrackBar;
Label1: TLabel;
Label2: TLabel;
Timer1: TTimer;
IKRechts: TImage; // Kopf-Bilder
IKOben: TImage;
IKLinks: TImage;
IKUnten: TImage;
IBody: TImage; // Körper-Bild
ILeer1: TImage; // zum Überdecken
IFutter1: TImage;
IFutter2: TImage;
IFutter3: TImage;
IFutter4: TImage;
ILeer2: TImage;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
procedure Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Edit1Exit(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
type
TRichtung = (rechts,hoch,links,runter);
type
TGlied = record
x,y : integer;
end;
type
CSnake = class
Glied : array[0..1000] of TGlied;
Kopf : TGlied;
Laenge : integer;
Futter : TGlied;
procedure Init;
procedure Draw;
procedure Move;
procedure Feed;
end;
var
Form1: TForm1;
Snake : CSnake;
Richtung : TRichtung;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
if Button1.Caption = 'Start' then
begin
Trackbar1.Enabled := false;
Timer1.Enabled := true;
Button1.Caption := 'Stop';
Edit1.SetFocus; // Im Hintergund v. Image1 zur Ereignisannahme
Snake.Init;
end;
if Button1.Caption = 'Stop' then
begin
Trackbar1.Enabled := true;
Timer1.Enabled := false;
Button1.Caption := 'Start';
Image1.Canvas.Brush.Color := clWhite;
Image1.Canvas.Pen.Color := clWhite;
Image1.Canvas.Rectangle(Image1.Canvas.ClipRect);
end;
end;
procedure CSnake.Init;
var
i : integer;
ok : boolean;
zahl : integer;
label essen;
begin
ok := true;
Laenge := 5;
Kopf.x := 6;
Kopf.y := 4;
for i := 0 to Laenge - 1 do
begin
Glied[i].x := 5 - i;
Glied[i].y := 4;
end;
Richtung := rechts;
Randomize;
essen:
Futter.x := random(36);
Futter.y := random(36);
for i := 0 to Laenge - 1 do
if ok then
if (Glied[i].x = Futter.x) and (Glied[i].y = Futter.y) then
ok := false;
if ok = false then goto essen;
zahl := random(4);
case zahl of
0 : begin
Form1.Image1.Canvas.Draw(Futter.x*10,Futter.y*10,Form1.IFutter1.Picture.Bitmap);
end;
1 : begin
Form1.Image1.Canvas.Draw(Futter.x*10,Futter.y*10,Form1.IFutter2.Picture.Bitmap);
end;
2 : begin
Form1.Image1.Canvas.Draw(Futter.x*10,Futter.y*10,Form1.IFutter3.Picture.Bitmap);
end;
3 : begin
Form1.Image1.Canvas.Draw(Futter.x*10,Futter.y*10,Form1.IFutter4.Picture.Bitmap);
end;
end;
end;
procedure CSnake.Draw;
var
i : integer;
begin
if Richtung = rechts then
Form1.Image1.Canvas.Draw(Kopf.x*10,Kopf.y*10,Form1.IKRechts.Picture.Bitmap)
else if Richtung = hoch then
Form1.Image1.Canvas.Draw(Kopf.x*10,Kopf.y*10,Form1.IKOben.Picture.Bitmap)
else if Richtung = links then
Form1.Image1.Canvas.Draw(Kopf.x*10,Kopf.y*10,Form1.IKLinks.Picture.Bitmap)
else if Richtung = runter then
Form1.Image1.Canvas.Draw(Kopf.x*10,Kopf.y*10,Form1.IKUnten.Picture.Bitmap);
for i := 0 to Laenge - 1 do
Form1.Image1.Canvas.Draw(Glied[i].x*10,Glied[i].y*10,Form1.IBody.Picture.Bitmap);
Form1.Image1.Canvas.Draw(Glied[Laenge].x*10,Glied[Laenge].y*10,Form1.ILeer1.Picture.Bitmap);
end;
procedure CSnake.Move;
var
i : integer;
begin
for i := Laenge downto 1 do
Glied[i] := Glied[i-1];
Glied[0] := Kopf;
if Richtung = rechts then Kopf.x := Kopf.x + 1
else if Richtung = hoch then Kopf.y := Kopf.y - 1
else if Richtung = links then Kopf.x := Kopf.x - 1
else if Richtung = runter then Kopf.y := Kopf.y + 1;
if Kopf.x > 36 then Kopf.x := 0;
if Kopf.x < 1 then Kopf.x := 37;
if Kopf.y > 36 then Kopf.y := 0;
if Kopf.y < 1 then Kopf.y := 37;
end;
procedure CSnake.Feed;
var
punkte,i,zahl : integer;
ok : boolean;
label essen;
begin
punkte := StrToInt(Form1.Label2.Caption);
if not (Kopf.x = Futter.x) and not (Kopf.y = Futter.y) then
begin
punkte := punkte + 10;
Form1.Label2.Caption := IntToStr(punkte);
end;
randomize;
essen:
Futter.x := random(36);
Futter.y := random(36);
for i := 0 to Laenge - 1 do
if ok then
if (Glied[i].x = Futter.x) and (Glied[i].y = Futter.y) then
ok := false;
if ok = false then goto essen;
zahl := random(4);
case zahl of
0 : begin
Form1.Image1.Canvas.Draw(Futter.x*10,Futter.y*10,Form1.IFutter1.Picture.Bitmap);
end;
1 : begin
Form1.Image1.Canvas.Draw(Futter.x*10,Futter.y*10,Form1.IFutter2.Picture.Bitmap);
end;
2 : begin
Form1.Image1.Canvas.Draw(Futter.x*10,Futter.y*10,Form1.IFutter3.Picture.Bitmap);
end;
3 : begin
Form1.Image1.Canvas.Draw(Futter.x*10,Futter.y*10,Form1.IFutter4.Picture.Bitmap);
end;
end;
Laenge := Laenge + 1;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Snake.Move;
Snake.Draw;
end;
procedure TForm1.Edit1Exit(Sender: TObject);
begin
if (Timer1.Enabled = true) and not Button1.Focused then
begin
Application.ProcessMessages;
Edit1.SetFocus;
end;
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
Timer1.Interval := (10 - TRackbar1.Position) * 50;
end;
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
37:
if not (Richtung = rechts) then Richtung := rechts;
38: begin
if not (Richtung = hoch) then Richtung := hoch;
end;
39: begin
if not (Richtung = links) then Richtung := links;
end;
40: begin
if not (Richtung = runter) then Richtung := runter;
end;
end;
end;
end.
ja und nun gibts nen laufzeitfehler wenn ich button1 drücke, wobei der haltepunkt bei" Laenge := 5;" im quelltext gesetzt wird...
zum laufzeitfehler kann ich nix sagen, irgndwie "ungültiger vorgang im modul xyz blablabla..."
weiß jmd wo fehler stecken?