unit u_snake;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, u_apfelklasse, u_snakeklasse, Menus;
type
TSpielfeld =
class(TForm)
Bild: TImage;
Timer1: TTimer;
Button1: TButton;
Punkte: TLabel;
Label1: TLabel;
MainMenu1: TMainMenu;
SPIEL1: TMenuItem;
Bild1: TMenuItem;
Neustart1: TMenuItem;
Beenden1: TMenuItem;
Screenshot1: TMenuItem;
Screenshotffnen1: TMenuItem;
Pause1: TMenuItem;
Weiter1: TMenuItem;
GeschwindigkeitvonSnake1: TMenuItem;
SaveDialog1: TSaveDialog;
OpenDialog1: TOpenDialog;
Button2: TButton;
Button4: TButton;
Button5: TButton;
Extra1: TMenuItem;
Uhrzeit2: TMenuItem;
Datum1: TMenuItem;
Hilfe1: TMenuItem;
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormKeyDown(Sender: TObject;
var Key: Word;
Shift: TShiftState);
procedure Button1Click(Sender: TObject);
procedure Beenden1Click(Sender: TObject);
procedure Pause1Click(Sender: TObject);
procedure Weiter1Click(Sender: TObject);
procedure Screenshot1Click(Sender: TObject);
procedure Screenshotffnen1Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Datum1Click(Sender: TObject);
procedure Uhrzeit2Click(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure Hilfe1Click(Sender: TObject);
procedure GeschwindigkeitvonSnake1Click(Sender: TObject);
procedure Neustart1Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{private-Deklarationen}
public
{ Public-Deklarationen }
end;
var
Spielfeld: TSpielfeld;
snake: Tsnake;
apfel: Tapfel;
x, y :
array[1..100]
of integer;
vx, vy, r: integer;
implementation
{$R *.dfm}
procedure TSpielfeld.FormCreate(Sender: TObject);
{In dieser Prozedure wird mit "Bild.Canvas.pen.Width:=5" die Breite der zu zeichnenden Linie "um" Snake bestimmt. Mit "Bild.Canvas.Brush.COlor:=clWhite" wird die Farbe des Spielfeldes auf die Farbe Weiß festgelegt. Mit "Bild.Canvas.pen.Width:=2" wird die Breite der Linie um das ganze SPielfeld bestimmt. Mit "Bild.Canvas.Rectangle (0,0,Bild.Width,Bild.Height)" werden die Koordinaten des Spielfeldes festgelegt. Mit "Bild.Canvas.Pen.Mode:=pmNOTXOR" wird das "alte" Snake übermalt.}
begin
Bild.Canvas.pen.Width:=5;
Bild.Canvas.Brush.COlor:=clWhite;
Bild.Canvas.Brush.Style:=bsSolid;
Bild.Canvas.pen.Width:=2;
Bild.Canvas.Rectangle (0,0,Bild.Width,Bild.Height);
Bild.Canvas.Pen.Mode:=pmNOTXOR;
snake.init (clRed,Random(30)*20,Random(20)*20,0,0,10);
snake.zeigedich(Bild.Canvas);
apfel.init (clblue,Random(30)*20,Random(20)*20,10);
{hier wird der apfel neu gezeichnet}
apfel.zeigedich(Bild.Canvas);
end;
procedure TSpielfeld.Timer1Timer(Sender: TObject);
{In dieser Procedure wird nach der "procedure snake.zeigedich" die "procedure snake.bewegedich" aufgerufen, da sich Snake als erstes zeigt und dann wie in der "procedure snake.bewegedich" festgelegt bewegt. Anschließend wird wieder die "procedure snake.zeigedich" auf gerufen, damit das "alte" Snake übermalt wird und das "neue" sichtbar wird.}
begin
snake.zeigedich(Bild.Canvas);
snake.bewegedich(bild);
snake.zeigedich(Bild.Canvas);
if ((snake.x[1] = apfel.x)
and (snake.y[1] = apfel.y))
then {wenn die X-Koordinate von Snake auf der X-Koordinate vom APfel liget, dann wird der Apfel mit dem Befehl "apfel.zeigedich" übermalt und anschließend wird mit "apfel.init (clblue,Random(30)*20,Random(20)*20,10)" und "apfel.zeigedich" ein neuer Apfel gemalt.}
begin
apfel.zeigedich(bild.Canvas);
apfel.init (clblue,Random(30)*20,Random(20)*20,10);
apfel.zeigedich(bild.Canvas);
label1.Caption:=inttostr(strtoint(label1.caption)+1);
Timer1.interval := Timer1.interval - 1;
snake.laenge:=snake.laenge+1;
end;
end;
procedure TSpielfeld.FormKeyDown(Sender: TObject;
var Key: Word;
Shift: TShiftState);
begin {mit Hilfe dieser Prozedur kann man Snkae mit den Pfeiltasten steuern}
case key
of
37:
begin {hier wird festgelegt, wenn man die Taste 37 (Pfeiltaste links) drückt, dass sich snake in x-Richtung um -1 und in y-Richtung um 0 bewegt.}
snake.vx:= -1;
snake.vy:= 0;
end;
38:
begin {hier wird festgelegt, wenn man die Taste 38 (Pfeiltaste hoch) drückt, dass sich snake in x-Richtung um 0 und in y-Richtung um -1 bewegt.}
snake.vx:=0;
snake.vy:=-1;
end;
39:
begin {hier wird festgelegt, wenn man die Taste 39 (Pfeiltaste rechts) drückt, dass sich snake in x-Richtung um 1 und in y-Richtung um 0 bewegt.}
snake.vx:=1;
snake.vy:=0;
end;
40:
begin {hier wird festgelegt, wenn man die Taste 40 (Pfeiltaste unten) drückt, dass sich snake in x-Richtung um 0 und in y-Richtung um 1 bewegt.}
snake.vx:=0;
snake.vy:=1;
end;
end;
end;
procedure TSpielfeld.Button1Click(Sender: TObject);
begin
close;
end;
procedure TSpielfeld.Beenden1Click(Sender: TObject);
begin
Close
end;
procedure TSpielfeld.Pause1Click(Sender: TObject);
begin
Timer1.Interval:= 0;
end;
procedure TSpielfeld.Weiter1Click(Sender: TObject);
begin
Timer1.Interval := 100;
end;
procedure TSpielfeld.Screenshot1Click(Sender: TObject);
begin
Timer1.Interval:= 0;
showmessage ('
Beim Speichern: Hinter dem Namen des Bildes noch ".bmp" eintippen sonst wird es nicht als Bilddatei gespeichert');
if Spielfeld.savedialog1.execute
then
bild.picture.bitmap.savetofile(Spielfeld.savedialog1.filename) ;
Timer1.Interval:= 100;
end;
procedure TSpielfeld.Screenshotffnen1Click(Sender: TObject);
begin
Timer1.Interval:= 0;
if Spielfeld.opendialog1.execute
then
Bild.picture.bitmap.loadfromfile(Spielfeld.opendialog1.filename);
Timer1.Interval:= 100;
end;
procedure TSpielfeld.Button4Click(Sender: TObject);
begin
Timer1.Interval := 100;
end;
procedure TSpielfeld.Button2Click(Sender: TObject);
begin
Timer1.Interval:= 0;
end;
procedure TSpielfeld.Datum1Click(Sender: TObject);
var sDatum :
string;
begin
Timer1.Interval:= 0;
sDatum:=DateToStr(Date);
Showmessage('
aktuelles Datum: '+sDatum);
Timer1.Interval:= 100;
end;
procedure TSpielfeld.Uhrzeit2Click(Sender: TObject);
var sZeit :
string;
begin
Timer1.Interval:= 0;
sZeit:=TimeToStr(Time);
Showmessage('
aktuelle Zeit: '+sZeit);
Timer1.Interval:= 100;
end;
procedure TSpielfeld.Edit1Change(Sender: TObject);
var zahl: integer;
begin
zahl:=strtoint(Spielfeld.edit1.text);
Timer1.Interval:=zahl;
end;
procedure TSpielfeld.Hilfe1Click(Sender: TObject);
begin
Timer1.Interval:=0;
Showmessage ('
Snake wird mit den Pfeiltasten gesteuert. Ziel des Spieles ist es soviele Äpfel wie möglich zu essen. Man Kann durch die Wände gehen aber nicht durch sich selbst!');
Timer1.Interval:=100;
end;
procedure TSpielfeld.GeschwindigkeitvonSnake1Click(Sender: TObject);
begin
Timer1.Interval:=0;
Showmessage ('
Bitte geben Sie in das Feld "Geschwindigkeit" eine Zahl ziwschen 1 und 1000 ein. WObei 1 für sehr schnell und 1000 für sehr langsam steht. DIe Geschwindigkeit ist standardmäßig auf 100 eingestellt');
Timer1.Interval:=100;
//noch abändern
end;
procedure TSpielfeld.Neustart1Click(Sender: TObject);
begin
//wie kann man alles aufeinmal übermalen???
//alles dann neuaufrufen
end;
procedure TSpielfeld.Button5Click(Sender: TObject);
begin
Bild.Canvas.Pen.Mode:=pmNOTXOR;
snake.laenge:=1;
snake.zeigedich(Bild.Canvas);
snake.bewegedich(bild);
snake.zeigedich(Bild.Canvas);
end;
initialization
randomize;
snake:=tsnake.Create;
{hier wird snake und apfel erstellt}
apfel:=tapfel.Create;
finalization
snake.Destroy;
apfel.Destroy;
{hier wird snake und apfel zerstört}
end.