[Pascal/Delphi] Delphi Snake

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Pascal/Delphi] Delphi Snake

    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?
Lädt...
X