Delphi-PRAXiS
Seite 4 von 6   « Erste     234 56      

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)

Yadon 26. Sep 2004 11:02

Re: Snake (das Spiel)
 
hi,

zur Mittagszeit ging der Download auch nicht, schade, kannst das noch mal ändern?

Gruß Yadon

Wuaegner 26. Sep 2004 11:48

Re: Snake (das Spiel)
 
Auch noch mein Senf dazu : Das in einem Tutorial guter Programmierstil vorkommen sollte mag ja schon stimmen, aber wenn man dieses Tutorial als Denkanstoß für sein eigenes Snake spiel nehmen möchte ist es gut! Es geht ja in erster Linie darum, zu sehen, wie man das Snakespil umsetzen kann, und mit dieser Idee geht man dann an sein eigenes Spiel ran und schreibt seinen eigenen Code , wenn möglich dann auch in gutem Stil. Aber als Bsp. für eine Realisierung des Snakespiels finde ich dieses Turoial echt gut! :thumb:

Airborn 13. Nov 2004 11:48

Re: Snake (das Spiel)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Mal eine ganz dumme Frage eines Anfängers *g*

Ich hab mal versucht das Programm nachzubasteln, compilieren tut er das auch noch, nur laufen will es nicht ordnungsgemäß. Hat irgeneiner von euch Profis einen Tipp für mich? Leider ist ja das Bsp. Programm nicht mehr zum downloadverfügbar, damit ich mal selbst nach dem Fehler suchen könnte.

Aus irgendeinem Grund bewegt sich die Schlange nicht :(

Hier auch nochmal der Soure:
Delphi-Quellcode:
unit snake;

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 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Timer1: TTimer;
    PaintBox1: TPaintBox;
    procedure Button1Click(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);
  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 *.dfm}

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;
if (map[kopf.X, kopf.Y]>0) and (not ende) then
begin
spiel_ende;
ShowMessage('Sie haben sich selbst gebissen!');
end;
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;
paint_map;
enable_buttons(True);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
calc_snake;
if not ende then
paint_map;
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;

end.

Pr0g 13. Nov 2004 13:37

Re: Snake (das Spiel)
 
Die Subdomain hat sich verändert, daher ist der Beispielcode nun hier zu finden: http://pr0g.net/knowhow/files/snake_src.zip


Ersetz mal den Code von "Button1Click" durch folgenden:

Delphi-Quellcode:
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;
  paint_map;
  enable_buttons(True);
  ende := False;
  Timer1.Enabled := True;
end;

Airborn 13. Nov 2004 17:39

Re: Snake (das Spiel)
 
thx, jetzt geht es :) :)

profi 27. Dez 2004 21:56

Re: Snake (das Spiel)
 
also wenn ich den quellcode eingebe dann geht alles, d.h. die schlange flitzt über die paintbox nur kann ich die richtungsänderung nicht eingeben.

Die "If"-Abfrage vor dem Setzen der neuen Richtung ist dazu da um einen direkten Richtungswechsel zu verhindern. So ist es bspw. nicht Möglich während man nach unten läuft die Richtung nach oben zu ändern. "Button3" bekommt die Caption "links" und folgenden Code:
Quellcode: markieren
Delphi-Quellcode:
...
procedure TForm1.Button3Click(Sender: TObject);
begin
  if richtung.X=0 then
    richtung := Point(-1, 0);
end;
...
Wenn ich da auf den Button3 klicke um den Quelltext einzutragen dann kommt ne meldung:
"cannot find implementation of method3click

Da weiß ich nimmer weiter.
Nur zur Info falls einer ne Lösung weiß
ich bin n totaler Noob und hab nur alles genau abgeschrieben wie es im tutorial stand
bitte schreibts einfach *g*
danke

[edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]

Pr0g 28. Dez 2004 12:17

Re: Snake (das Spiel)
 
Am besten wäre es, wenn du nur den Button3 auf deine Form machst, dann Doppelklickt drauf, damit Delphi die Prozedur erstellt und du dann den Code einträgst. Wenn du die ganze Prozedur kopiert hast, musst du gucken, ob sie auch oben in TForm1 eingetragen wurde und sie über den OI dem Button zuweisen.

MfG Pr0g

thepaul 28. Dez 2004 12:35

Re: Snake (das Spiel)
 
Hiermit kann man dann auch die Pfeiltasten zur Steuerung benutzen:
Delphi-Quellcode:
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;

Marcel_Mars 6. Mär 2007 17:19

Re: Snake (das Spiel)
 
Also ich habe noch eine gute erweiterung des Codes. So kann man auch durch wände gehen wie im richtigen Snake.
Delphi-Quellcode:
if (kopf.X<0) then
 Kopf.X:= kopf.X + Breite + 1;
 if Kopf.Y < 0 then
 Kopf.Y := kopf.Y + Hoehe + 1;
 if Kopf.X > Breite then
 Kopf.X := Kopf.x - Breite - 1;
 if Kopf.Y > Hoehe then
 Kopf.Y := Kopf.Y - Hoehe - 1;
Das muss man einfach in calc_snake reinschreiben.

Freundliche Grüsse

Mars

Daniel G 9. Mai 2007 21:49

Re: Snake (das Spiel)
 
Schade, dass die Links ins Leere laufen... :(


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:57 Uhr.
Seite 4 von 6   « Erste     234 56      

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