Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Snake programmieren/brauche Hilfe bei der bewegung (https://www.delphipraxis.net/171678-snake-programmieren-brauche-hilfe-bei-der-bewegung.html)

cello 19. Nov 2012 18:34

Snake programmieren/brauche Hilfe bei der bewegung
 
ich soll für die schule snake prgrammieren. leider haben wir nie gelernt wie man bewegung in die sache reinbringt. ich habe im internet geguckt aber nichts gefunden, was verständlich ist oder so war, dass man nicht den ganzen code wieder löschen muss. hier mal das, was ich bis jetzt habe.
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, pngimage, pngextra, pnglang, ExtCtrls, StdCtrls;

type
  TForm2 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Körper;
    procedure update;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;





implementation
var
  Form2: TForm2;

 TYPE Tfeld =
 record
    Bild: TImage;
    Name: String;
 End;
 var feld: array [1..17,1..13] of Tfeld;
 var x,y : integer;


 TYPE Tsnake =
 record
    x1 : integer;
    y1 : integer;

 end;
  var snake: array [1..12] of Tsnake;


 var
Rrichtung: byte;
{$R *.dfm}



 procedure init;
 var i : integer;

 begin
    i:=1;
    randomize;
    for x:=1 to 13 do
    begin;
      for y:=1 to 17 do
        begin;
          feld[x,y].Name := 'Gras';
          feld[x,y].Bild := Timage.create(Form2);
          feld[x,y].Bild.parent := Form2;
          feld[x,y].Bild.top := x*50;
          feld[x,y].Bild.left := y*50;
          feld[x,y].Bild.Picture.LoadFromFile('images/gras.PNG');
        end;
    end;


      for y:= 1 to 17 do
      begin;
        for x:=1 to 13 do
          begin;
            If (y = 1) or (y = 17) then
             begin;
              feld[x,y].Name := 'Wand';
              feld[x,y].Bild := Timage.create(Form2);
              feld[x,y].Bild.parent := Form2;
              feld[x,y].Bild.top := x*50;
              feld[x,y].Bild.left := y*50;
              feld[x,y].Bild.Picture.LoadFromFile('images/wand-hoch.PNG')
             end;
      end;
    end;

      for x:= 1 to 13 do
      begin;
        for y:=1 to 17 do
          begin;
            If (x = 1)or(x = 13) then
             begin;
              feld[x,y].Name := 'Wand';
              feld[x,y].Bild := Timage.create(Form2);
              feld[x,y].Bild.parent := Form2;
              feld[x,y].Bild.top := x*50;
              feld[x,y].Bild.left := y*50;
              feld[x,y].Bild.Picture.LoadFromFile('images/wand-breit.PNG')
             end;
      end;
      end;

 end;



      begin
      for x:=6 to 9 do
      begin
        y:=9;
        feld[x,y].Name := 'Snake-Körper';
        feld[x,y].Bild := Timage.create(Form2);
        feld[x,y].Bild.parent := Form2;
        feld[x,y].Bild.top := x*50;
        feld[x,y].Bild.left := y*50;
        feld[x,y].Bild.Picture.LoadFromFile('images/körper.PNG');

        snake[i].x1:=x;
        snake[i].y1:=y;
        i:=i+1;

      end;

       x:= random(14)+2;
       y:= random(10)+2;

      begin
        feld[x,y].Name := 'Apfel';
        feld[x,y].Bild := Timage.create(Form2);
        feld[x,y].Bild.parent := Form2;
        feld[x,y].Bild.top := x*50;
        feld[x,y].Bild.left := y*50;
        feld[x,y].Bild.Picture.LoadFromFile('images/apfel.PNG');
      end;
        x:=0;
        y:=0;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
 Form2.DoubleBuffered:=True;
 init;
end;

   

end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  Button1.Visible:=false;
  TForm2.Timer1Timer;



end;










end.
tut mir leid wenn einige sachen nicht gut eingerückt sind :oops: wäre echt toll wenn mir jemand helfen könnte

Sir Rufo 19. Nov 2012 20:09

AW: Snake programmieren/brauche Hilfe bei der bewegung
 
Die Erkenntnis (Einrückung) ist da, nur fehlt die Motivation?

Rücke es vernünftig ein, dann zeigen sich meistens schon ein paar Fehler, und dann schauen wir weiter.
Und bitte auch überflüssige Leerzeilen (mehr als 1 ist immer zuviel) entfernen.

EDIT (da der TE nicht in der Lage ist oder keine Motivation dazu hat, habe ich den Source zum Formatieren mal durch mein Delphi gejagt)
Und schon sieht man auch gleich einen Fehler:
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, pngimage, pngextra, pnglang, ExtCtrls, StdCtrls;

type
  TForm2 = class( TForm )
    Image1 : TImage;
    Timer1 : TTimer;
    Button1 : TButton;
    procedure FormCreate( Sender : TObject );
    procedure Button1Click( Sender : TObject );
    procedure Körper;
    procedure update;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

implementation

var
  Form2 : TForm2;

TYPE
  Tfeld = record
    Bild : TImage;
    Name : String;
  End;

var
  feld : array [1 .. 17, 1 .. 13] of Tfeld;

var
  x, y : integer;

TYPE
  Tsnake = record
    x1 : integer;
    y1 : integer;

  end;

var
  snake : array [1 .. 12] of Tsnake;

var
  Rrichtung : byte;
{$R *.dfm}

procedure init;
var
  i : integer;

begin
  i := 1;
  randomize;
  for x := 1 to 13 do
    begin;
      for y := 1 to 17 do
        begin;
          feld[x, y].Name       := 'Gras';
          feld[x, y].Bild       := TImage.create( Form2 );
          feld[x, y].Bild.parent := Form2;
          feld[x, y].Bild.top   := x * 50;
          feld[x, y].Bild.left  := y * 50;
          feld[x, y].Bild.Picture.LoadFromFile( 'images/gras.PNG' );
        end;
    end;

  for y := 1 to 17 do
    begin;
      for x := 1 to 13 do
        begin;
          If ( y = 1 ) or ( y = 17 )
          then
            begin;
              feld[x, y].Name       := 'Wand';
              feld[x, y].Bild       := TImage.create( Form2 );
              feld[x, y].Bild.parent := Form2;
              feld[x, y].Bild.top   := x * 50;
              feld[x, y].Bild.left  := y * 50;
              feld[x, y].Bild.Picture.LoadFromFile( 'images/wand-hoch.PNG' )
            end;
        end;
    end;

  for x := 1 to 13 do
    begin;
      for y := 1 to 17 do
        begin;
          If ( x = 1 ) or ( x = 13 )
          then
            begin;
              feld[x, y].Name       := 'Wand';
              feld[x, y].Bild       := TImage.create( Form2 );
              feld[x, y].Bild.parent := Form2;
              feld[x, y].Bild.top   := x * 50;
              feld[x, y].Bild.left  := y * 50;
              feld[x, y].Bild.Picture.LoadFromFile( 'images/wand-breit.PNG' )
            end;
        end;
    end;

end;

begin // ja, wozu soll das denn gehören?
  for x := 6 to 9 do
    begin
      y                     := 9;
      feld[x, y].Name       := 'Snake-Körper';
      feld[x, y].Bild       := TImage.create( Form2 );
      feld[x, y].Bild.parent := Form2;
      feld[x, y].Bild.top   := x * 50;
      feld[x, y].Bild.left  := y * 50;
      feld[x, y].Bild.Picture.LoadFromFile( 'images/körper.PNG' );

      snake[i].x1 := x;
      snake[i].y1 := y;
      i          := i + 1;

    end;

  x := random( 14 ) + 2;
  y := random( 10 ) + 2;

  begin
    feld[x, y].Name       := 'Apfel';
    feld[x, y].Bild       := TImage.create( Form2 );
    feld[x, y].Bild.parent := Form2;
    feld[x, y].Bild.top   := x * 50;
    feld[x, y].Bild.left  := y * 50;
    feld[x, y].Bild.Picture.LoadFromFile( 'images/apfel.PNG' );
  end;
  x := 0;
  y := 0;
end;

procedure TForm2.FormCreate( Sender : TObject );
begin
  Form2.DoubleBuffered := True;
  init;
end;

end;

procedure TForm2.Button1Click( Sender : TObject );
begin
  Button1.Visible := false;
  TForm2.Timer1Timer;

end;

end.

nuclearping 20. Nov 2012 06:34

AW: Snake programmieren/brauche Hilfe bei der bewegung
 
Zitat:

Zitat von cello (Beitrag 1191935)
wäre echt toll wenn mir jemand helfen könnte

Wo ist denn das Problem? Du hast schonmal einen Timer, du hast deine Schlangen, deren X- und Y-Position du kennst. Also musst du im Timer nur entsprechend die X- und / oder Y-Werte ändern, neu zeichnen lassen und schwupps ... IGORRR ES LÄÄÄBT! :mrgreen:

cello 20. Nov 2012 07:59

AW: Snake programmieren/brauche Hilfe bei der bewegung
 
Wo ist denn das Problem? Du hast schonmal einen Timer, du hast deine Schlangen, deren X- und Y-Position du kennst. Also musst du im Timer nur entsprechend die X- und / oder Y-Werte ändern, neu zeichnen lassen und schwupps ... IGORRR ES LÄÄÄBT! :mrgreen:[/QUOTE]

ja nur weiß ich nicht wie es machen soll, dass die schlange solange läuft bis man was anderes drückt :(

Klaus01 20. Nov 2012 08:25

AW: Snake programmieren/brauche Hilfe bei der bewegung
 
.. in onKeyUp Ereignis der Form festellen welche Taste gedrückt wurde.
(Eventuell KexyPreview auf true setzen)

Pfeil nach rechts -> Laufrichtung der Schlnage nach rechts
Pfeil nach links -> Laufrichtung der Schlange nach links
...

In der execute Methode des Timers
musst Du nun auf die Laufrichtung reagieren und entsprechend die X und Y Werte
variieren.

Grüße
Klaus

Bjoerk 20. Nov 2012 12:33

AW: Snake programmieren/brauche Hilfe bei der bewegung
 
Zu Anfang würd' ich vielleicht erst mal diese ganzen Bilder weglassen und die Schlange durch Kreise darstellen, insbesondere weil das etwas einfacher ist und weil du einige Bilder so erzeugst, daß du sie gar nicht mehr freigeben kannst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:30 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