unit Robot;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
DBTables;
type
TRobot =
class(TDatabase)
private
{ Private-Deklarationen }
Position:
Array[1..2]
of integer;
Winkel_1,Speed:double;
Ziel: TRobot;
protected
{ Protected-Deklarationen }
public
procedure Zeichnen(Ziel: TBitmap);
function WinkelBestimmen(X,Y:integer): Double;
function PPunkt: TPoint;
function PosX: integer;
function PosY: integer;
procedure PositionSetzen(X,Y: integer);
function Winkel: double;
procedure WinkelSetzen(NeuerWinkel: double);
//procedure GeschwindigkeitSetzen(NeueGeschwindigkeit: double);
procedure Initialisieren(PositionX, PositionY: integer; StartWinkel, Geschwindigkeit: double);
procedure Step;
procedure ZielAussuchen(Feinde:
Array of TRobot; Prioritaet: integer);
function EntfernungMessen (Zielpunkt: TPoint): double;
procedure AufZielRichten;
{ Public-Deklarationen }
published
{ Published-Deklarationen }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('
Robot Wars', [TRobot]);
end;
procedure TRobot.AufZielRichten;
begin
WinkelBestimmen(Ziel.PosX,Ziel.PosY);
end;
function TRobot.EntfernungMessen (Zielpunkt: TPoint): double;
var DiffX,DiffY:integer;
begin
DiffX:=Zielpunkt.x-Position[1];
DiffY:=Zielpunkt.y-Position[2];
EntfernungMessen:=Sqrt(DiffX*DiffX+DiffY*DiffY);
end;
procedure TRobot.ZielAussuchen (Feinde:
Array of TRobot; Prioritaet: integer);
var i: integer; Entfernung: double;
begin
Entfernung:=1000000;
for i:= 1
to (High(Feinde))+1
do
begin
if EntfernungMessen(Feinde[i].PPunkt)<Entfernung
then
begin
Entfernung:=EntfernungMessen(Feinde[i].PPunkt);
Ziel:=Feinde[i];
Showmessage('
Ziel gewählt');
end;
end;
end;
procedure TRobot.Step;
begin
Position[1]:=Position[1]-Round(Sin(Winkel_1)*Speed);
Position[2]:=Position[2]-Round(Cos(Winkel_1)*Speed);
end;
procedure TRobot.Initialisieren (PositionX, PositionY: integer; StartWinkel, Geschwindigkeit: double);
begin
Position[1]:=PositionX;
Position[2]:=PositionY;
Winkel_1:=StartWinkel;
Speed:=Geschwindigkeit;
end;
procedure GeschwindigkeitSetzen(NeueGeschwindigkeit: double);
begin
//Speed:=NeueGeschwindigkeit;
end;
function TRobot.Winkel: double;
begin
Winkel:=Winkel_1;
end;
function TRobot.PPunkt: TPoint;
begin
PPunkt:=Point(Position[1],Position[2]);
end;
function TRobot.PosX: integer;
begin
PosX:=Position[1];
end;
function TRobot.PosY: integer;
begin
PosY:=Position[2];
end;
procedure TRobot.PositionSetzen(X,Y: integer);
begin
Position[1]:=X;
Position[2]:=Y;
end;
function TRobot.WinkelBestimmen(X,Y:integer): Double;
var Rid:integer; DiffX,DiffY,Plus:real;
begin
Plus:=0;
Rid:=0;
DiffX:=X-Position[1];
DiffY:=Y-Position[2];
if DiffX>0
then
begin
if DiffY>0
then
Plus:=Pi/2;
if DiffY<0
then
begin
Plus:=0;
Rid:=1;
end;
if DiffY=0
then
Plus:=Pi/2;
end;
if DiffX<0
then
begin
if DiffY>0
then
begin
Plus:=Pi;
Rid:=1;
end;
if DiffY<0
then
Plus:=3*Pi/2;
if DiffY=0
then
Plus:=3*Pi/2;
end;
if DiffX=0
then
begin
if DiffY>0
then
begin
Plus:=Pi;
Rid:=1;
end;
if DiffY<0
then
Plus:=2*Pi;
if DiffY=0
then
Plus:=0;
end;
DiffX:=abs(DiffX);
DiffY:=abs(DiffY);
if Rid=1
then
begin
if DiffY=0
then
begin
Rid:=3;
DiffY:=0.1;
end;
WinkelBestimmen:=ArcTan(DiffX/DiffY)+Plus;
if Rid=3
then
Winkelbestimmen:=plus;
end
else
begin
if DiffX=0
then
begin
Rid:=2;
DiffX:=0.1;
end;
WinkelBestimmen:=ArcTan(DiffY/DiffX)+Plus;
if Rid=2
then
Winkelbestimmen:=plus;
end;
end;
procedure TRobot.Zeichnen(Ziel: TBitmap);
var Koord :
array[1..3]
of TPoint;
i :integer;
KoordX, KoordY:
array[1..3]
of integer;
Winkelz:
array[1..3]
of double;
begin
Winkelz[1]:=pi;
Winkelz[2]:=2*Pi/3+pi;
Winkelz[3]:=4*Pi/3+pi;
for i:= 1
to 3
do
begin
KoordX[i]:=Round(Position[1]+Sin(Winkel_1+Winkelz[i])*10);
KoordY[i]:=Round(Position[2]+Cos(Winkel_1+Winkelz[i])*10);
Koord[i]:=Point(KoordX[i],KoordY[i]);
end;
Ziel.Canvas.Brush.Color:=clred;
Ziel.Canvas.Polygon(Koord);
end;
procedure TRobot.WinkelSetzen(NeuerWinkel: double);
begin
Winkel_1:=NeuerWinkel;
end;
end.