Thema: Delphi Snake (das Spiel)

Einzelnen Beitrag anzeigen

QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.529 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#59

AW: Snake (das Spiel)

  Alt 8. Mai 2018, 08:53
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.
Andreas
#PerfMatters

Geändert von QuickAndDirty ( 8. Mai 2018 um 09:00 Uhr)
  Mit Zitat antworten Zitat