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 + -
显示快捷键?