delphi_snake/uMain.pas
2016-03-09 21:45:36 +01:00

198 lines
4.4 KiB
ObjectPascal
Raw Permalink Blame History

unit uMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Menus, StdCtrls;
type
TfMain = class(TForm)
timer: TTimer;
MainMenu: TMainMenu;
mSnake: TMenuItem;
Spielneustarten1: TMenuItem;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure StartGame;
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure timerTimer(Sender: TObject);
procedure Spielneustarten1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
Points:Integer;
Snake: array of TShape;
Snakehor: Integer;
Snakever: Integer;
Dots: array of TShape;
LastPosX:Integer;
LastPosY:Integer;
end;
var
fMain: TfMain;
const
SnakeHead = clBlue;
implementation
{$R *.dfm}
procedure TfMain.FormCreate(Sender: TObject);
begin
Randomize;
DoubleBuffered:=True;
StartGame;
end;
procedure TfMain.StartGame;
var i:Integer;
begin
Snakehor:= 1;
Snakever:= 0;
Points := 0;
for i:=0 to Length(Snake)-1 do Snake[i].Free;
SetLength(Snake,0);
for i:=0 to 2 do
begin
SetLength(Snake,Length(Snake)+1);
Snake[Length(Snake)-1]:=TShape.create(fMain);
Snake[Length(Snake)-1].Parent:=fMain;
Snake[Length(Snake)-1].Shape:=stRoundRect;
Snake[Length(Snake)-1].Width:=10;
Snake[Length(Snake)-1].Height:=10;
if i=0 then
begin
Snake[Length(Snake)-1].Top:=fMain.Height div 2;
Snake[Length(Snake)-1].Left:=fMain.Width div 2;
Snake[Length(Snake)-1].Brush.Color:=Snakehead;
end else
begin
Snake[Length(Snake)-1].Top:=Snake[Length(Snake)-2].Top;
Snake[Length(Snake)-1].Left:=Snake[Length(Snake)-2].Left-10;
end;
end;
timer.Enabled:=True;
end;
procedure TfMain.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = vk_up then
begin
Snakever:= -1;
Snakehor:= 0;
end;
if Key = vk_down then
begin
Snakever:= 1;
Snakehor:= 0;
end;
if Key = vk_left then
begin
Snakever:= 0;
Snakehor:= -1;
end;
if Key = vk_right then
begin
Snakever:= 0;
Snakehor:= 1;
end;
end;
procedure TfMain.timerTimer(Sender: TObject);
var i,tempt,templ:Integer;
begin
for i:=0 to length(Snake)-1 do
begin
if i=0 then
begin
LastPosY:=Snake[0].Top;
LastPosX:=Snake[0].Left;
Snake[0].Top:= Snake[0].Top + Snakever*Snake[0].Height;
Snake[0].Left:= Snake[0].Left + Snakehor*Snake[0].Width;
end else
begin
tempt:=Snake[i].Top;
templ:=Snake[i].Left;
Snake[i].Top:= LastPosY;
Snake[i].Left:= LastPosX;
LastPosY:=tempt;
LastPosX:=templ;
end;
end;
snake[0].BringToFront;
if Length(Dots)=0 then
begin
setlength(Dots,1);
Dots[Length(Dots)-1]:=TShape.create(fMain);
Dots[Length(Dots)-1].Parent:=fMain;
Dots[Length(Dots)-1].Shape:=stCircle;
Dots[Length(Dots)-1].Width:=7;
Dots[Length(Dots)-1].Height:=7;
Dots[Length(Dots)-1].Brush.Color:=clRed;
Dots[Length(Dots)-1].Top:=40+Random(fMain.Height-180);
Dots[Length(Dots)-1].Left:=40+Random(fMain.Width-80)
end;
//kollision
//W<>nde
if (Snake[0].left<0) then timer.Enabled:=False;
if (Snake[0].Left+Snake[0].Width*2>fMain.Width) then timer.Enabled:=False;
if (Snake[0].Top<10) then timer.Enabled:=False;
if (Snake[0].Top+Snake[0].Height+60>fMain.Height) then timer.Enabled:=False;
//Self
for i:=1 to Length(Snake)-1 do
if (Snake[0].Top=Snake[i].Top) and (Snake[0].Left=Snake[i].Left) then timer.Enabled:=False;
//Dot
if (Snake[0].Left+Snake[0].width>=Dots[0].Left) and (Snake[0].Left<=Dots[0].Left+Dots[0].Width) and (Snake[0].Top+Snake[0].Height>=Dots[0].Top) and (Snake[0].Top<=Dots[0].Top+Dots[0].Height) then
begin
Inc(Points,1000+random(1000));
Dots[0].Free;
SetLength(Dots,0);
//Neues Schlangenglied
SetLength(Snake,Length(Snake)+1);
Snake[Length(Snake)-1]:=TShape.create(fMain);
Snake[Length(Snake)-1].Parent:=fMain;
Snake[Length(Snake)-1].Shape:=stRoundRect;
Snake[Length(Snake)-1].Width:=10;
Snake[Length(Snake)-1].Height:=10;
Snake[Length(Snake)-1].Top:=LastPosY;
Snake[Length(Snake)-1].Left:=LastPosX;
end;
Inc(Points,Random(2));
label1.Caption:='Punkte: '+inttostr(Points);
end;
procedure TfMain.Spielneustarten1Click(Sender: TObject);
begin
StartGame;
end;
end.