Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Snake Steuerung (https://www.delphipraxis.net/131457-snake-steuerung.html)

michi2415 25. Mär 2009 06:59


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.

cruiser 25. Mär 2009 07:48

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.

michi2415 25. Mär 2009 07:49

Re: Snake Steuerung
 
ja habe ich, leider bringt dies auch nichts. Das Problem ist das ich die Schlange nicht steuern kann.

nuclearping 25. Mär 2009 07:58

Re: Snake Steuerung
 
Setz mal einen Breakpoint in FormKeyDown - oder lasse eine ShowMessage anzeigen. Wird der Event denn überhaupt ausgelöst?

michi2415 25. Mär 2009 07:58

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

cruiser 25. Mär 2009 08:09

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...

Florian Hämmerle 25. Mär 2009 08:11

Re: Snake Steuerung
 
Weis mal dem OnKeyDown des TImage das OnKeyDown der Form zu. Im OI im Reiter Ereignisse.

mfg Flö

nuclearping 25. Mär 2009 08:12

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.

http://www.epinasoft.com/delphikurs/...oint_prog5.png

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.

michi2415 25. Mär 2009 13:40

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

Florian Hämmerle 25. Mär 2009 13:43

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 03:49 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz