Thema: Delphi Snake Steuerung

Einzelnen Beitrag anzeigen

michi2415

Registriert seit: 3. Mär 2009
Ort: Köln
6 Beiträge
 
#1

Snake Steuerung

  Alt 25. Mär 2009, 06:59
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.
  Mit Zitat antworten Zitat