📄 rei_33.pas
字号:
unit Rei_33;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, Menus, StdCtrls;
type
// 定义管理点的记录类型
TDotDt = record
Used: Byte;
Xpos: Integer;
Ypos: Integer;
Trad: Extended;
Drad: Extended;
Dbas: Byte;
Dcol: TColor;
end;
TRei40_33 = class(TForm)
Timer1: TTimer;
MainMenu1: TMainMenu;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ReDraw(Sender: TObject);
private
{ Private 定义 }
procedure WhiteDot;
procedure YellowDot;
public
{ Public 定义 }
end;
var
Rei40_33: TRei40_33;
// 定义各种变量类型(Byte、Word、Extended、TRect)
St, Sn: Byte;
Cheight, Cwidth: Word;
QTR, TX, TY, TDR, SP, TP: Extended;
Rect_D: TRect;
// 定义点用的数组
WDpon: array[0..6] of TDotDt;
YDpon: array[0..6] of TDotDt;
implementation
{$R *.DFM}
procedure TRei40_33.FormCreate(Sender: TObject);
begin
// 设定Form属性
Rei40_33.Height := 480;
Rei40_33.Width := 640;
Button1.Height := 41;
Button1.Left := 580;
Button1.Top := 16;
Button1.Width := 41;
Cheight := Rei40_33.ClientHeight;
Cwidth := 570;
end;
procedure TRei40_33.Timer1Timer(Sender: TObject);
var
// 定义局部变量
Cn: Byte;
begin
case St of
// 若St=0则将画面与变量初始化
0: begin
Rect_D := Rect(0, 0, Cwidth, Cheight);
Rei40_33.Canvas.Brush.Color := clBlack;
Rei40_33.Canvas.FillRect(Rect_D);
Randomize;
for Cn := 0 to 6 do
begin
with WDpon[Cn] do
begin
Used := 1;
Xpos := Cwidth div 2 - 50 + Random(101);
Ypos := 10 + Cn * 20;
Trad := 270 * Pi / 180;
Drad := 2 * Pi / 180;
Dbas := Cheight div 2 - Ypos;
Dcol := clWhite;
end;
with YDpon[Cn] do
begin
Used := 1;
Xpos := Cwidth div 2 - 28 + Random(57);
Ypos := Cheight div 2 - 28 + Cn * 8;
Trad := 0;
Drad := (6 + Random(6)) * Pi / 180;
Dbas := 4 + Random(4);
Dcol := clYellow;
end;
end;
St := 1;
end;
// 将白点旋转
1: begin
WhiteDot;
YellowDot;
end;
// 黄点猎捕白点
2: begin
WhiteDot;
YellowDot;
end;
end;
end;
procedure TRei40_33.WhiteDot;
var
// 定义局部变量
Cn: Byte;
begin
// 管理白点的行动
for Cn := 0 to 6 do
with WDpon[Cn], Rei40_33 do
if Used = 1 then
begin
Canvas.Pixels[Xpos, Ypos] := clBlack;
Canvas.Pixels[Xpos, Ypos + 1] := clBlack;
Canvas.Pixels[Xpos + 1, Ypos] := clBlack;
Canvas.Pixels[Xpos + 1, Ypos + 1] := clBlack;
QTR := Trad;
Trad := Trad + Drad;
if Trad >= 2 * Pi then
Trad := Trad - 2 * Pi;
Xpos := Xpos + Round(Dbas * (Cos(Trad) - Cos(QTR)));
Ypos := Ypos + Round(Dbas * (Sin(Trad) - Sin(QTR)));
Canvas.Pixels[Xpos, Ypos] := Dcol;
Canvas.Pixels[Xpos, Ypos + 1] := Dcol;
Canvas.Pixels[Xpos + 1, Ypos] := Dcol;
Canvas.Pixels[Xpos + 1, Ypos + 1] := Dcol;
if Random(50) = 0 then
if Drad = 2 * Pi / 180 then
Drad := 358 * Pi / 180
else
Drad := 2 * Pi / 180;
end;
end;
procedure TRei40_33.YellowDot;
var
// 定义局部变量
Cn, Dn: Byte;
begin
// 管理黄点的行动
for Cn := 0 to 6 do
with YDpon[Cn], Rei40_33 do
case Used of
1: begin
Canvas.Pixels[Xpos, Ypos] := Dcol;
Canvas.Pixels[Xpos, Ypos + 1] := Dcol;
Canvas.Pixels[Xpos + 1, Ypos] := Dcol;
Canvas.Pixels[Xpos + 1, Ypos + 1] := Dcol;
end;
2: begin
SP := 10000;
for Dn := 0 to 6 do
if WDpon[Dn].Used = 1 then
begin
TP := Sqrt(Sqr(Xpos - WDpon[Dn].Xpos) +
Sqr(Ypos - WDpon[Dn].Ypos));
if TP < SP then
begin
SP := TP;
Sn := Dn;
end;
end;
TX := WDpon[Sn].Xpos - Xpos;
TY := WDpon[Sn].Ypos - Ypos;
if TX = 0 then
TDR := Pi / 2
else
TDR := ArcTan(TY / TX);
if ((TX <= 0) and (TY <= 0)) or ((TX < 0) and (TY > 0)) then
TDR := TDR + Pi;
if TDR < 0 then
TDR := TDR + 2 * Pi;
TDR := TDR - Trad;
if TDR < 0 then
TDR := TDR + 2 * Pi;
if TDR <> 0 then
begin
if TDR <= Pi then
Trad := Trad + Drad
else
Trad := Trad + (2 * Pi - Drad);
if Trad >= 2 * Pi then
Trad := Trad - 2 * Pi;
end;
if Xpos < Cwidth - 1 then
begin
Canvas.Pixels[Xpos, Ypos] := clBlack;
Canvas.Pixels[Xpos, Ypos + 1] := clBlack;
Canvas.Pixels[Xpos + 1, Ypos] := clBlack;
Canvas.Pixels[Xpos + 1, Ypos + 1] := clBlack;
end;
Xpos := Xpos + Round(Dbas * Cos(Trad));
Ypos := Ypos + Round(Dbas * Sin(Trad));
if Xpos < Cwidth - 1 then
begin
Canvas.Pixels[Xpos, Ypos] := Dcol;
Canvas.Pixels[Xpos, Ypos + 1] := Dcol;
Canvas.Pixels[Xpos + 1, Ypos] := Dcol;
Canvas.Pixels[Xpos + 1, Ypos + 1] := Dcol;
end;
if (Abs(Xpos - WDpon[Sn].Xpos) <= 3) and
(Abs(Ypos - WDpon[Sn].Ypos) <= 3) then
begin
Used := 3;
WDpon[Sn].Used := 0;
Canvas.Pixels[WDpon[Sn].Xpos, WDpon[Sn].Ypos] := clBlack;
Canvas.Pixels[WDpon[Sn].Xpos, WDpon[Sn].Ypos + 1] := clBlack;
Canvas.Pixels[WDpon[Sn].Xpos + 1, WDpon[Sn].Ypos] := clBlack;
Canvas.Pixels[WDpon[Sn].Xpos + 1, WDpon[Sn].Ypos + 1] := clBlack;
end;
end;
3: begin
if Dcol = clRed then
Dcol := clYellow
else
Dcol := clRed;
Canvas.Pixels[Xpos, Ypos] := Dcol;
Canvas.Pixels[Xpos, Ypos + 1] := Dcol;
Canvas.Pixels[Xpos + 1, Ypos] := Dcol;
Canvas.Pixels[Xpos + 1, Ypos + 1] := Dcol;
end;
end;
end;
procedure TRei40_33.Button1Click(Sender: TObject);
var
// 定义局部变量
Cn: Byte;
begin
// 猎捕白点或Reset的指示
case St of
1: begin
for Cn := 0 to 6 do
YDpon[Cn].Used := 2;
St := 2;
end;
2: St := 0;
end;
end;
procedure TRei40_33.ReDraw(Sender: TObject);
begin
// 重绘Form
Rect_D := Rect(0, 0, Cwidth, Cheight);
Rei40_33.Canvas.Brush.Color := clBlack;
Rei40_33.Canvas.FillRect(Rect_D);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -