Код
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls;
type
{ TForm1 }
Ttargan = class
public
x,y : double;
golod : integer;
stan : integer;
{ 0 - стою
1 - Гуляю
2 - Біжу до їжі
3 - Їм!
4 - Тікаю до темного
}
dov_krok : double;
procedure BigtiDo( a,b:double); //Змінити координати таргана, щоб був ближще до вказаної точки
procedure Gulyaty; //Робимо випадковий рух, гуляємо
procedure ZminityStan( svitlo: integer; a,b:double; var izha:integer); //За правилами скінченного автомату міняємо стан
procedure Isty( a,b:double; var izha:integer); //Якщо їжа досяжна - істи
procedure Tikaty;
end;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
CheckBox1: TCheckBox;
IdleTimer1: TIdleTimer;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure IdleTimer1Timer(Sender: TObject);
procedure Image1Click(Sender: TObject);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ private declarations }
public
{ public declarations }
Izha : integer; //Кількість їжі
A,B : integer; //Координати їжі
targan: array [0..50] of Ttargan;
end;
var
Form1: TForm1;
implementation
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
var i:integer; //Створюємо початкові стани тарганам
begin
for i:=0 to 50 do
begin
targan[i] := Ttargan.Create;
targan[i].x:=random(400)+50;
targan[i].y:=random(400)+50;
targan[i].golod:=random(200);
targan[i].dov_krok:=5;
targan[i].stan:=0;
end;
Image1.Canvas.Brush.Color:=0;
Image1.Canvas.FillRect(0,0,511,511);
Izha := 0;
end;
procedure TForm1.IdleTimer1Timer(Sender: TObject);
begin
Button2Click(Sender);
Button1Click(Sender);
end;
procedure TForm1.Image1Click(Sender: TObject);
begin
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
A := X; B := Y; Izha := 600;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i:integer; //Малюємо стадо тарганів
begin
if CheckBox1.Checked then
Image1.Canvas.Brush.Color:=127+127*256+127*256*256
else
Image1.Canvas.Brush.Color:=0;
Image1.Canvas.FillRect(0,0,511,511);
Image1.Canvas.Pen.Color:=255*256;
for i:=0 to 50 do
begin
Image1.Canvas.EllipseC(round(targan[i].x),round(targan[i].y),2,2);
end;
if Izha>0 then
begin
Image1.Canvas.Pen.Color:=255;
Image1.Canvas.EllipseC(A,B,1+round(Izha/100),1+round(Izha/100));
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var i,c:integer;
begin
if CheckBox1.Checked then c:=1 else c:=0;
for i:=0 to 50 do
begin
if targan[i].golod>0 then targan[i].golod:= targan[i].golod-1;
if Izha>0 then targan[i].ZminityStan(c,A,B,Izha)
else targan[i].ZminityStan(c,-100,-100,Izha);
end;
end;
{$R *.lfm}
procedure Ttargan.BigtiDo( a,b:double);
var D : double;
begin
D := sqrt( sqr(a-x)+sqr(b-y) );
x := x + 1.5*dov_krok*(a-x)/D;
y := y + 1.5*dov_krok*(b-y)/D;
end;
procedure Ttargan.Gulyaty;
var a,b,D:double;
begin
a := random(512);
b := random(512);
D := sqrt( sqr(a-x)+sqr(b-y) );
x := x + 0.5*dov_krok*(a-x)/D;
y := y + 0.5*dov_krok*(b-y)/D;
end;
procedure Ttargan.ZminityStan( svitlo: integer; a,b:double; var izha:integer);
begin
if svitlo=1 then
begin
stan:=4;
Tikaty;
end else
if stan=0 then
begin
if golod=0 then stan:=1;
if random(2)=1 then stan:=1;
end else
if stan=1 then
begin
Gulyaty;
if (a>0)and(golod=0) then
begin
stan:=2;
end;
if golod>0 then if random(2)=0 then stan:=0;
end else
if stan=2 then
begin
if a<0 then stan:=1 else Isty(a,b,izha);
if golod=200 then stan:=0;
end else
if stan=4 then
begin
if svitlo=0 then stan:=0;
end;
end;
procedure Ttargan.Isty( a,b:double; var izha:integer); //Якщо їжа досяжна - істи
var D : double;
begin
D := sqrt( sqr(a-x)+sqr(b-y) );
if( D< 1.5*dov_krok ) then
begin
izha := izha - 1;
golod := golod + 4;
end else
begin
BigtiDo(a,b);
end;
end;
procedure Ttargan.Tikaty;
begin
if x<y then
begin
if x<(512.0-y) then BigtiDo(x,512.0) else BigtiDo(0,y);
end else
begin
if y<(512.0-x) then BigtiDo(512.0,y) else BigtiDo(x,0);
end;
end;
end.