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