Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi Snake (das Spiel) (https://www.delphipraxis.net/22871-snake-das-spiel.html)

Pr0g 19. Mai 2007 02:32

Re: Snake (das Spiel)
 
Da ich hin und wieder mal ne PN zu dem Downloadlink bekomme, hier kann man das Archiv aus dem ersten Post noch finden: klick.

XeRo 19. Mai 2007 11:39

Re: Snake (das Spiel)
 
Vielen Dank! :mrgreen:

speedax 18. Mär 2009 18:16

Re: Snake (das Spiel)
 
Hey leute,

i hab mal einfach nur simplerweise versucht das spiel zu erstellen quasi mit copy+paste
i wie funktioniert das aber nicht also es kompiliert meine 5 oder 6 buttons sind da aber die paintbox erscheint nciht und gar nchts passeirt... hab den quellcode einfach eingefügt und die button angepasst... kann mir jemand helfen? i würde des game gerne haben um mal hinter seine funktionsweise zu "steigen" :coder:

lbccaleb 18. Mär 2009 18:45

Re: Snake (das Spiel)
 
Hallo und Willkommen in der DP :)
:dp: :dp:


Benutze das unten angehängte Bsp. aus diesem Post:

Snake Source

mfg

Pr0g 18. Mär 2009 18:54

Re: Snake (das Spiel)
 
Zitat:

Zitat von speedax
...i würde des game gerne haben um mal hinter seine funktionsweise zu "steigen" :coder:

Zwei Posts über deinem habe ich (vor fast zwei Jahren) einen "aktuellen" Link zu dem Code gepostet. Versuche diesen nach dem Runterladen zu kompilieren.

Bin doch immer wieder erstaunt alle paar Jahre mal ne Email über eine PN bezüglich Snake zu bekommen :P

speedax 18. Mär 2009 19:59

Re: Snake (das Spiel)
 
Verdammt 'tschuldige hattes nciht gesehen gehabt...

i habe mal ne frage zu dem

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
VK_UP: Button2.Click;
VK_DOWN: Button5.Click;
VK_RIGHT: Button4.Click;
VK_LEFT: Button3.Click;
end;
end;


weiß jemand für was das VK_* steht?
wie verwende ich das konkret? also die ganze procedure?

lbccaleb 18. Mär 2009 20:08

Re: Snake (das Spiel)
 
Die Zeilen mit VK_.. geben die Tasten an, bei denen auf druck selbiger was getan werden soll! Das was ausgeführt werden soll, wird hinter dem ":" angegeben!

PS benutze bitte den Delphi-Tag um die Übersicht zu wahren...

edit:
VK_UP = Taste hoch
VK_DOWN = Taste runter
VK_RIGHT = Taste rechts
VK_LEFT = Taste links


mfg

speedax 18. Mär 2009 20:12

Re: Snake (das Spiel)
 
interessant... aaber wenn ich ihn verwenden will kommen diverse fehlermeldungen (muss dazu sagen habe nur schuldelphi)

so etwas wie tformkeydown unterscheidet sich von vorherigen deklarationen... aber ich habe eigentlich korrekt angegeben

mleyen 18. Mär 2009 20:27

Re: Snake (das Spiel)
 
Ich denke mal du hast im "interface"-Teil Die "KeyDown"-Prozedur anders definiert als im "implementation"-Teil.
(Aber ich rate dir erstmal die Tutorials auf dsdt durchzugehen)

speedax 18. Mär 2009 20:46

Re: Snake (das Spiel)
 
hey

naja gaaanz so noobhaft (nix für ungut) bin ich net, i hab beides gleich angegeben das is ja was was i net verstehe i steig net hinter den fehler... selbst wenn i sage i packse bei implementation rein und rufse unten auf beim start button kommt der blöde fehler.... :wink:

speedax 18. Mär 2009 21:10

Re: Snake (das Spiel)
 
habs erstmal hinbekommen....aber diese procedure wählt ja nur die buitton an...kann man die damit auch gleich , quasi "direkt" bedienen?

mleyen 18. Mär 2009 21:16

Re: Snake (das Spiel)
 
Du kannst natürlich den Code in den Buttonevents auslagern und die ausgelagerten Prozeduren dann "direkt" aufrufen.

speedax 19. Mär 2009 17:52

Re: Snake (das Spiel)
 
um da nen punktezähler einzubauen muss ich ja theoretisch einfach nur die anzahl ausummieren die die schlange mit den futterpunkten übereinstimmt

Delphi-Quellcode:
if (kopf.X=futter.X) and (kopf.Y=futter.Y) then
  begin

    edit1.text:=inttostr(punkte);
    Inc(laenge);
    neues_futter;
    [b]punkte:=punkte+1;[/b]
  end;
oder ist das so abwägig?... i wie kommen da höchst dumme punktzahlen raus...

speedax 20. Mär 2009 17:02

Re: Snake (das Spiel)
 
i packs net wenn ich des ganze einfach beim futter erschaffen mit rein packe dann gehts trotzdem ent, aber eig muss i ja nur zählen wieoft futter erschaffen wird-1... hmm

anluyomo 2. Mai 2018 13:39

AW: Snake (das Spiel)
 
Liste der Anhänge anzeigen (Anzahl: 1)
ich bin neu hier und auch beim Programmieren mit Delphi.
Ich benutze Lazarus ;-)

Für Einsteiger ist richtig gut erklärt und nachvollziehbar.
Am Anfang konnte ich kein Bild kriegen, aber nach copy/paste von source code, ging das.

Allerdings kann ich die Schlange nicht steuern, weder mit den Buttons noch mit den Pfeiltasten :cry:

Kann mir jemand dabei helfen?

Vielen Dank!

QuickAndDirty 2. Mai 2018 13:43

AW: Snake (das Spiel)
 
Du musst die Eigenschaft Keypreview
im Formular aktivieren!
Dann kannst du dir im KeyDownEvent vom Formular die letzten Gedrückte Pfeiltaste merken.

anluyomo 3. Mai 2018 09:11

AW: Snake (das Spiel)
 
Danke für die schnelle Antwort, allerdings hat sich nichts geändert. Ich kann leider nicht finden, wo der Fehler sein kann.

object Form1: TForm1
Left = 361
Height = 335
Top = 139
Width = 484
Caption = 'Form1'
ClientHeight = 335
ClientWidth = 484
KeyPreview = True
OnCreate = FormCreate
OnKeyDown = FormKeyDown
LCLVersion = '1.8.0.6'

Wie Du es beschrieben hast, habe ich in den Eigenschaften der Form das geändert und auch die Methode FormKeyDown verknüpft.
Das ist die Implementation der Buttons und von FormKeyDown:

procedure TForm1.Button2Click(Sender: TObject);
begin
if richtung.Y=0 then
richtung :=Point(0,-1);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
if richtung.X=0 then
richtung:=Point(1, 0);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
if richtung.X=0 then
richtung:=Point(1,0);
end;


procedure TForm1.Button5Click(Sender: TObject);
begin
if richtung.Y=0 then
richtung:= Point(0,1);
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
VK_UP: Button2.Click;
VK_DOWN: Button5.Click;
VK_RIGHT: Button4.Click;
VK_LEFT: Button3.Click;
end;
end;

Danke nochmal für Deine Hilfe!

anluyomo 7. Mai 2018 11:56

AW: Snake (das Spiel)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo QuickAndDirty,

Hier ist der Code ohne die Anwendungsdatei, sonst war zu gross zum Hochladen.

Danke!

QuickAndDirty 8. Mai 2018 08:53

AW: Snake (das Spiel)
 
Ich hab nicht alles gefixt
nur 2 Zeilen oder so
von hier aus müsstest es selbst können.

1. SpielEnde oder der startbutton initialisieren das Spiel nicht komplett! Das muss du dir mal ansehen
2. Der Quelltext ist komisch formatiert!
3. Das malen habe ich in das Paint Ereignis gelegt, so wie Gott es gewollt hat.

Grundsätzliches zu spielen:
Jedes spiel hat eine Gameloop das ist eine schleife die den status des Spiels iteriert.(OK heute baut keiner mehr solche Spiele, aber irgendwo in der eingekauften Engine ist sicher auch irgendeine mainloop)
In deinem Fall ist Timer1 deine "Gameloop für Arme".
Hier muss die komplette spiellogik stattfinden.
Damit das möglich ist muss der timer auch laufen, bei start!

4. Hab im Startbutton den timer aktiviert.
5. als letzten aufruf im timer die darstellung von Paintbox für ungültig(invalide) erklärt. Paintbox rendert das Canvas dann neue sobald es geht.
6. Dein VK_LEFT war nicht in ordnung es lenkte nach rechts. Habs gerade gebogen
7. Else if in Calc Snake. Weil da kann immer nur eine von den sachen passieren.



Delphi-Quellcode:
unit unit1;

interface

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

const
    farben: Array [0..2] of TColor = (clBlack, clLime, clRed);
    raster: integer = 10;
    breite: integer = 24;
    hoehe: integer = 24;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Timer1: TTimer;
    PaintBox1: TPaintBox;
    procedure Button1Click(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
  private
    { Private declarations }
    map: Array [0..24] of Array [0..24] of Integer;
    kopf, richtung, futter: TPoint;
    laenge,
    punkte: Integer;
    ende: Boolean;
    bmp: TBitmap;
    procedure enable_buttons(status: Boolean);
    procedure spiel_ende;
    procedure neues_futter;
    procedure paint_map;
    procedure calc_snake;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

procedure TForm1.enable_buttons(status: Boolean);
begin
  Button2.Enabled := status;
  Button3.Enabled := status;
  Button4.Enabled := status;
  Button5.Enabled := status;
end;

procedure TForm1.spiel_ende;
Begin
  ende:= True;
  Timer1.Enabled := False;
  enable_buttons(False);
  Button1.Enabled := True;
end;

procedure TForm1.neues_futter;
begin
        futter := Point(Random(breite), Random(hoehe));
        while map[futter.X, futter.Y]<>0 do
                futter:= Point(Random(breite), Random(hoehe));
        map[futter.X,futter.Y] := -1;
end;

procedure TForm1.paint_map;
var i,j: integer; col:TColor;
begin
        for i := 0 to breite do
                for j := 0 to hoehe do
                begin
                        case map[i, j] of
                        -1: col := farben[1];
                         0: col := farben[0];
                        else
                         col := farben[2];
                end;
                PaintBox1.Canvas.Brush.Color:=col;
                PaintBox1.Canvas.FillRect(Rect(i*raster, j*raster, (i+1)*raster, (j+1)*raster));
        end;
end;

procedure TForm1.calc_snake;
var i,j: Integer;
begin
   for i := 0 to breite do
     for j := 0 to hoehe do
     if map[i,j]>0 then
        Dec(map[i,j]);
        Inc(kopf.X, richtung.X);
        Inc(kopf.Y, richtung.Y);
     if (kopf.X<0) or (kopf.X>breite) or (kopf.Y<0) or (kopf.Y>hoehe) then
     begin
          spiel_ende;
          ShowMessage('Sie haben den Rand berührt!');
     end
     else if (map[kopf.X, kopf.Y]>0) and (not ende) then
     begin
          spiel_ende;
          ShowMessage('Sie haben sich selbst gebissen!');
     end
     else if (kopf.X=futter.X) and (kopf.Y=futter.Y) then
     begin
          Inc(laenge);
          neues_futter;
     end;
     map[kopf.X, kopf.Y] := laenge;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i,j: Integer;
begin
Button1.Enabled := False;
for i:=0 to breite do
  for j:=0 to hoehe do
    map[i,j] := 0;
 kopf:= Point(1,1);
 laenge:= 5;
 richtung:= Point(0,1);
 map[kopf.X,kopf.Y] := laenge;
 neues_futter;
 enable_buttons(True);
 Timer1.enabled := true;
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  paint_map;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
     calc_snake;
     Paintbox1.invalidate;
     if ende then
       Timer1.enabled := false;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
     if richtung.Y=0 then
     richtung :=Point(0,-1);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
     if richtung.X=0 then
     richtung:=Point(-1, 0);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
     if richtung.X=0 then
     richtung:=Point(1,0);
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
     if richtung.Y=0 then
     richtung:= Point(0,1);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
randomize;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    VK_UP: Button2.Click;
    VK_DOWN: Button5.Click;
    VK_RIGHT: Button4.Click;
    VK_LEFT: Button3.Click;
  end;
end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:50 Uhr.
Seite 2 von 2     12   

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