⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rei_33.pas

📁 《Delphi经典游戏设计40例》书中40个游戏的源代码
💻 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 + -