main.pas

来自「Delphi7编程80例(完全版)」· PAS 代码 · 共 557 行 · 第 1/2 页

PAS
557
字号
unit Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, Menus,ImgList, MMSystem;

const
     WM_TRAYICON = WM_USER + 1;
     Easy_TotalBombNumber = 10;     //设置雷的数目
     Middle_TotalBombNumber = 30;
     High_TotalBombNumber = 60;
type
    BombStatus = (bsNormal, bsMaskAsBomb, bsNumber0, bsNumber1, bsNumber2,bsNumber3,
     bsNumber4, bsNumber5, bsNumber6, bsNumber7, bsNumber8, bsExploded, bsWrong, bsShow);

    TMainForm = class(TForm)
    ImageLedLNum: TImageList;
    CloseImage: TImage;
    Timer: TTimer;
    Image: TImage;
    StartBtnImage: TImage;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    RadioButton3: TRadioButton;
    procedure FormPaint(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure CloseImageClick(Sender: TObject);
    procedure CloseImageMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure CloseImageMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure TimerTimer(Sender: TObject);
    procedure ImageMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ImageMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure StartBtnImageMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure StartBtnImageMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure StartBtnImageClick(Sender: TObject);

  private
    { Private declarations }
    procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHITTEST;
  public
    { Public declarations }
    BackGroundBitmap : TBitmap;                             //背景画面
    BombStatusBitmap : array [bsNormal..bsShow] of TBitmap; //雷的状态
    BombStatusBitmapName : array [bsNormal..bsShow] of integer;
    BombNumber, Hour, Minute, Second : integer;
    BombArray : array [0..255] of -1..1;
    BombStatusArray : array [ 0..255] of BombStatus;
    ClickNumber : integer;
    bGameOver : Boolean;
    bGameRunning : Boolean;
    bLeftBtnDown : Boolean;
    bRightBtnDown : Boolean;

    procedure DrawTimeAndBombNumber;      //绘制剩余时间和扫雷数目
    procedure InitBomb;                   //初始化雷的设置
    procedure ShowBomb;                   //显示扫中的雷
    procedure DoTurnOver;                 //是否掀开雷
    procedure TurnItOver(n : integer);    //掀开雷的个数
    procedure CheckAll;                   //扫雷过程中的全盘监测
    procedure CheckIt(n : integer);       //扫雷监测
    procedure GameOver;                   //游戏结束
    function YouWin:Boolean;              //判断是否扫雷成功

  end;

var
  MainForm: TMainForm;
implementation

{$R *.DFM}
procedure TMainForm.FormPaint(Sender: TObject);
begin
  Canvas.Draw(0,0,BackGroundBitmap); // 绘制背景
  DrawTimeAndBombNumber;             //
  ShowBomb;                          //
end;

procedure TMainForm.FormCreate(Sender: TObject);
var
   loop : BombStatus;
begin
     bGameOver := FALSE;
     bGameRunning := FALSE;
     Timer.Enabled := FALSE;
     BombStatusBitmapName[bsNormal] := 113;
     BombStatusBitmapName[bsMaskAsBomb] := 112;
     BombStatusBitmapName[bsNumber0] := 102;
     BombStatusBitmapName[bsNumber1] := 103;
     BombStatusBitmapName[bsNumber2] := 104;
     BombStatusBitmapName[bsNumber3] := 105;
     BombStatusBitmapName[bsNumber4] := 106;
     BombStatusBitmapName[bsNumber5] := 107;
     BombStatusBitmapName[bsNumber6] := 108;
     BombStatusBitmapName[bsNumber7] := 109;
     BombStatusBitmapName[bsNumber8] := 110;

     BombStatusBitmapName[bsExploded] := 111;
     BombStatusBitmapName[bsWrong] := 115;
     BombStatusBitmapName[bsShow] := 114;

     SetWindowLong(Handle,GWL_STYLE, GetWindowLong(Handle,GWL_STYLE) and not WS_CAPTION);
     BackGroundBitmap := TBitmap.Create;
     BackGroundBitmap.LoadFromResourceID(hInstance, 121);
     ClientWidth := BackGroundBitmap.Width;
     ClientHeight := BackGroundBitmap.Height;
     CloseImage.Left := 383;
     CloseImage.Top := 1;

     StartBtnImage.Left := 298;
     StartBtnImage.Top := 172;
     StartBtnImage.Picture.Bitmap.LoadFromResourceID(hInstance, 127);
     StartBtnImage.Width := StartBtnImage.Picture.Bitmap.Width;
     StartBtnImage.Height := StartBtnImage.Picture.Bitmap.Height;
     Hour := 0;
     Minute := 0;
     Second := 0;
      //根据设置的游戏级别来设置雷的数目
     If RadioButton1.Checked Then
       BombNumber :=Easy_TotalBombNumber;
     If RadioButton2.Checked Then
       BombNumber :=Middle_TotalBombNumber;
     If RadioButton3.Checked Then
       BombNumber :=High_TotalBombNumber;

     InitBomb;
     Image.Left := 24;
     Image.Top := 53;
     Image.Width := 224;
     Image.Height := 224;
       //加载位图文件
     for loop := bsNormal to bsShow do
     begin
          BombStatusBitmap[loop] := TBitmap.Create;
          BombStatusBitmap[loop].LoadFromResourceID(hInstance, BombStatusBitmapName[loop]);
     end;
end;

procedure TMainForm.DrawTimeAndBombNumber;
var
   s1, s2, s3, s : string;
   x, y : integer;
begin
  s1 := IntToStr(Second);
  if Second < 10 then
    begin
      S1[2] := s1[1];
      S1[1] := '0';
    end;
  s2 := IntToStr(Minute);
  if Minute < 10 then
    begin
      S2[2] := s2[1];
      S2[1] := '0';
    end;
  s3 := IntToStr(Hour);
  if Hour < 10 then
    begin
      S3[2] := s3[1];
      S3[1] := '0';
    end;
   if BombNumber < 0 then BombNumber := 0;
     s := IntToStr(BombNumber);
   if BombNumber < 10 then
     begin
       s[2] := s[1];
       s[1] := '0';
     end;
   x := 283;
   y := 75;
   with ImageLedLNum do
     begin
        Draw(Canvas, x, y, 10);
        Draw(Canvas, x+10, y, StrToInt(s2[1]));
        Draw(Canvas, x+10+18, y, StrToInt(s2[2]));
        Draw(Canvas, x+10+18+18, y, 11);
        Draw(Canvas, x+10+18+18+10, y, StrToInt(s1[1]));
        Draw(Canvas, x+10+18+18+18+10, y, StrToInt(s1[2]));
     end;
   x := 303;
   y := 132;
   with ImageLedLNum do
     begin
       Draw(Canvas, x+10, y, StrToInt(s[1]));
       Draw(Canvas, x+10+18, y, StrToInt(s[2]));
     end;
end;

procedure TMainForm.CloseImageClick(Sender: TObject);
begin
  Close;
end;

procedure TMainForm.CloseImageMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
     if Button = mbLeft then
     begin
       CloseImage.Picture.Bitmap.LoadFromResourceID(hInstance, 116);
       CloseImage.Width := CloseImage.Picture.Bitmap.Width;
       CloseImage.Height := CloseImage.Picture.Bitmap.Height;
     end;
end;

procedure TMainForm.CloseImageMouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
     if Button = mbLeft then
      CloseImage.Picture := nil;
end;

procedure TMainForm.TimerTimer(Sender: TObject);
begin
  {计时器计算剩余时间}
     Second := Second + 1;
     if Second >= 60 then
     begin
          Minute := Minute + 1;
          Second := 0;
     end;
     if Minute >= 60 then
     begin
          Hour := Hour + 1;
          Minute := 0;
     end;
     DrawTimeAndBombNumber;
end;


procedure TMainForm.WMNCHitTest(var Msg : TWMNCHitTest);
begin
  {拖动游戏主窗口界面}
     inherited;
     with Msg do
          with ScreenToClient(Point(XPos,YPos)) do
               if not PtInRect(CloseImage.BoundsRect, Point(X,Y))
               and not PtInRect(Image.BoundsRect, Point(X,Y))
               and not PtInRect(StartBtnImage.BoundsRect, Point(X,Y)) then
                  Result := htCaption;
end;

procedure TMainForm.InitBomb;
var
   i : integer;
   t : integer;
   number:integer;
begin
     for i := 0 to 255 do BombArray[i] := 0;
     for i := 0 to 255 do BombStatusArray[i] := bsNormal;
     i := 0;
     randomize;
     number:=1;    //设置一个大于0的初始值,非常关键,否则进入死循环
   {根据设置的游戏级别来设置雷的数目 }
     If RadioButton1.Checked Then
       number:=Easy_TotalBombNumber;
     If RadioButton2.Checked Then
       number:=Middle_TotalBombNumber;
     If RadioButton3.Checked Then
       number:=High_TotalBombNumber;
    while i<Number do
     begin
          t := random(256);    //随机雷数
          if BombArray[t] = 0 then
          begin
               BombArray[t] := 1;
               i := i+1;
          end;
     end;
end;

procedure TMainForm.ShowBomb;
var

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?