main.pas
来自「Delphi7编程80例(完全版)」· PAS 代码 · 共 557 行 · 第 1/2 页
PAS
557 行
x, y : integer;
i : integer;
begin
DrawTimeAndBombNumber;
for i := 0 to 255 do
begin
x := i mod 16;
y := i div 16;
Canvas.Draw(x*14+24, y*14+53, BombStatusBitmap[BombStatusArray[i]]);
end;
end;
procedure TMainForm.ImageMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var t : integer;
begin
if bGameOver then exit;
if Button = mbLeft then
begin
bLeftBtnDown := TRUE;
ClickNumber := (y div 14)*16+(x div 14);
end
else
if (Button = mbRight) and (bLeftBtnDown = FALSE) then
begin
t := (y div 14)*16+(x div 14);
if BombStatusArray[t] = bsNormal then
begin
BombStatusArray[t]:= bsMaskAsBomb;
BombNumber := BombNumber - 1;
ShowBomb;
end
else
if BombStatusArray[t] = bsMaskAsBomb then
begin
BombStatusArray[t]:= bsNormal;
BombNumber := BombNumber + 1;
ShowBomb;
end;
end;
if (Button = mbRight) then bRightBtnDown := TRUE;
end;
procedure TMainForm.ImageMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
t : integer;
begin
if bGameOver then
exit;
if Button = mbLeft then
begin
if (bLeftBtnDown = TRUE) and (bRightBtnDown = TRUE) then
begin
t := (y div 14)*16+(x div 14);
CheckIt(t);
end;
bLeftBtnDown := FALSE;
t := (y div 14)*16+(x div 14);
if t = ClickNumber then
begin
Timer.Enabled := TRUE;
bGameRunning := TRUE;
DoTurnOver;
ShowBomb;
end;
end
else
if Button = mbRight then
begin
if (bLeftBtnDown = TRUE) and (bRightBtnDown = TRUE) then
begin
t := (y div 14)*16+(x div 14);
CheckIt(t);
end;
bRightBtnDown := FALSE;
Timer.Enabled := TRUE;
bGameRunning := TRUE;
end;
ShowBomb; //
if YouWin then
begin
PlaySound('SUCCESS', hInstance, SND_RESOURCE or SND_ASYNC);
bGameOver := TRUE;
bGameRunning := FALSE;
Timer.Enabled := FALSE
end
end;
procedure TMainForm.DoTurnOver;
begin
{}
if (BombStatusArray[ClickNumber] <> bsMaskAsBomb) and (BombArray[ClickNumber] = 1) then
begin
GameOver;
end
else
begin
if BombStatusArray[ClickNumber] = bsNormal then
TurnItOver(ClickNumber);
ShowBomb;
end;
end;
procedure TMainForm.CheckAll;
var
i, j, k : integer;
x, y : integer;
begin
{对扫雷过程的全盘监测}
for i := 0 to 255 do
begin
x := i mod 16;
y := i div 16;
if ((BombStatusArray[i] = bsNumber0) and (BombArray[i] <> -1)) then
begin
BombArray[i] := -1;
for j := -1 to 1 do
begin
for k := -1 to 1 do
begin
if (x+k>=0) and (x+k<=15) and (y+j>=0) and (y+j<=15) then
TurnItOver(i+j*16+k);
end;
end;
end;
end;
end;
procedure TMainForm.TurnItOver(n : integer);
var
i, j : integer;
Num : integer;
x, y : integer;
begin
{扫雷掀翻时的处理}
if BombStatusArray[n] = bsMaskAsBomb then exit;
Num := 0;
x := n mod 16;
y := n div 16;
for j := -1 to 1 do
begin
for i := -1 to 1 do
begin
if (x+i>=0) and (x+i<=15) and (y+j>=0) and (y+j<=15) and ((i<>0) or (j<>0)) then
if BombArray[n+j*16+i] = 1 then Num := Num+1;
end;
end;
BombStatusArray[n] := BombStatus(2+Num);
CheckAll;
end;
procedure TMainForm.StartBtnImageMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
{单击"开始"的图片切换}
if Button = mbLeft then
begin
StartBtnImage.Picture.Bitmap.LoadFromResourceID(hInstance,126);
end;
end;
procedure TMainForm.StartBtnImageMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
{松开"开始"的图片切换}
if Button = mbLeft then
StartBtnImage.Picture.Bitmap.LoadFromResourceID(hInstance,127);
end;
procedure TMainForm.GameOver;
var
i : integer;
begin
{扫雷失败后的一些处理}
for i := 0 to 255 do
begin
if ( i = ClickNumber) then BombStatusArray[i] := bsExploded
else
if (BombArray[i] = 0) and (BombStatusArray[i]=bsMaskAsBomb) then BombStatusArray[i] := bsWrong
else
if (BombArray[i] = 0) and (BombStatusArray[i]=bsNormal) then TurnItOver(i)
else
if (BombArray[i] = 1) and (BombStatusArray[i]=bsNormal) then BombStatusArray[i] := bsShow;
end;
bGameOver := TRUE;
bGameRunning := FALSE;
Timer.Enabled := FALSE;
ShowBomb;
PlaySound('FAILURE', hInstance, SND_RESOURCE or SND_ASYNC);
end;
procedure TMainForm.StartBtnImageClick(Sender: TObject);
begin
//游戏开始按钮按下的事件处理
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;
Timer.Enabled := FALSE;
bGameOver := FALSE;
bGameRunning := FALSE;
InitBomb;
ShowBomb;
end;
function TMainForm.YouWin:Boolean;
var i : integer;
begin
{扫雷正确的一些设置}
result := TRUE;
for i := 0 to 255 do
begin
if (BombStatusArray[i] = bsNormal)
or (BombStatusArray[i] = bsWrong)
or (BombStatusArray[i] = bsExploded)
or (BombStatusArray[i] = bsShow)
then
begin
result := FALSE;
exit;
end;
end;
end;
procedure TMainForm.CheckIt(n : integer);
label L1, L2;
var
i, j, Num : integer;
x, y : integer;
begin
{判断地雷的检测}
if (BombStatusArray[n]<bsNumber1) or (BombStatusArray[n]>bsNumber8)then exit;
Num := 0;
x := n mod 16;
y := n div 16;
for j := -1 to 1 do
begin
for i := -1 to 1 do
begin
if (x+i>=0) and (x+i<=15) and (y+j>=0) and (y+j<=15) and ((i<>0) or (j<>0))then
if BombStatusArray[n+j*16+i] = bsMaskAsBomb then Num := Num+1;
end;
end;
if BombStatusArray[n] = BombStatus(2+Num) then
begin
for j := -1 to 1 do
begin
for i := -1 to 1 do
begin
if (x+i>=0) and (x+i<=15) and (y+j>=0) and (y+j<=15) and ((i<>0) or (j<>0)) then
begin
if (BombArray[n+j*16+i] = 1) and (BombStatusArray[n+j*16+i] <> bsMaskAsBomb) then
begin
ClickNumber := n+j*16+i;
goto L1;
end;
if BombStatusArray[n+j*16+i] = bsNormal then TurnItOver(n+j*16+i);
end;
end;
end;
end;
goto L2;
L1:
GameOver;
L2:
end;
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?