AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Snake Steuerung

Ein Thema von michi2415 · begonnen am 25. Mär 2009 · letzter Beitrag vom 28. Mär 2009
Antwort Antwort
Seite 1 von 2  1 2      
michi2415

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

Snake Steuerung

  Alt 25. Mär 2009, 07: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
Benutzerbild von cruiser
cruiser

Registriert seit: 23. Dez 2003
Ort: Königsbrück/Sachsen
455 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Snake Steuerung

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

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

Re: Snake Steuerung

  Alt 25. Mär 2009, 08:49
ja habe ich, leider bringt dies auch nichts. Das Problem ist das ich die Schlange nicht steuern kann.
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: Snake Steuerung

  Alt 25. Mär 2009, 08:58
Setz mal einen Breakpoint in FormKeyDown - oder lasse eine ShowMessage anzeigen. Wird der Event denn überhaupt ausgelöst?
  Mit Zitat antworten Zitat
michi2415

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

Re: Snake Steuerung

  Alt 25. Mär 2009, 08:58
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
  Mit Zitat antworten Zitat
Benutzerbild von cruiser
cruiser

Registriert seit: 23. Dez 2003
Ort: Königsbrück/Sachsen
455 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Snake Steuerung

  Alt 25. Mär 2009, 09:09
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...
  Mit Zitat antworten Zitat
Florian Hämmerle
(Gast)

n/a Beiträge
 
#7

Re: Snake Steuerung

  Alt 25. Mär 2009, 09:11
Weis mal dem OnKeyDown des TImage das OnKeyDown der Form zu. Im OI im Reiter Ereignisse.

mfg Flö
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

Re: Snake Steuerung

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

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

Re: Snake Steuerung

  Alt 25. Mär 2009, 14:40
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
  Mit Zitat antworten Zitat
Florian Hämmerle
(Gast)

n/a Beiträge
 
#10

Re: Snake Steuerung

  Alt 25. Mär 2009, 14:43
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ö
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:14 Uhr.
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