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

📄 unit1.pas

📁 delphi编写的扫雷小游戏源码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit Unit1;

interface

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

type
  TSaoLei = class(TForm)
    Panel1: TPanel;
    ImageList1: TImageList;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N14: TMenuItem;
    N15: TMenuItem;
    N16: TMenuItem;
    N17: TMenuItem;
    ImageList2: TImageList;
    Label1: TLabel;
    Timer1: TTimer;
    Label2: TLabel;
    StatusBar1: TStatusBar;
    N18: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    N11: TMenuItem;
    N12: TMenuItem;
    N5: TMenuItem;
    procedure ChuShiHua;
    procedure N3Click(Sender: TObject);
    function juadge(LeiYesNo:integer):integer;
    procedure ClickDraw(i,j:integer);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Timer1Timer(Sender: TObject);
    Procedure GameEnd(FalseI,FalseJ:integer);
    procedure N6Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
    procedure N8Click(Sender: TObject);
    procedure N9Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure N14Click(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure N15Click(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure HuiHua;
    procedure N17Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  SaoLei: TSaoLei;
  M:integer=9;
  N:integer=9;//默认游戏网格数
  L:integer=10;//默认雷数
  leftI:integer=2;
  topI:integer=32;
implementation
uses
  unit2;
var
  BombFlag:array of array of integer;//雷标,-1雷,0-8周围雷数
  CurrentFlag:array of array of integer;//状态,0初始,1雷2问3点开
  CurrentI,CurrentJ:integer;//当前鼠标位置
  MyTime:integer; //记时
  CurrentL:integer; //和当前雷数
  GameOver:integer=0;
{$R *.dfm}

procedure TSaoLei.ChuShiHua;
var
  i,j,b:integer;
begin
  Timer1.Enabled:=true;
  GameOver:=0;
  SaoLei.Width :=M*30+leftI+9;
  SaoLei.Height :=N*30 +Panel1.Height +Statusbar1.Height+topI+25 ;
  SaoLei.Left :=(Screen.Width -SaoLei.Width)div 2;
  SaoLei.Top  :=(Screen.Height -SaoLei.Height)div 2;
  CurrentL:=L;
  label1.Caption :='还有'+inttostr(CurrentL)+'个雷';
  MyTime:=0;
  huihua;
//**********下面随机布雷***************************
  b:=0;
  Randomize;
  While b<>L do
  Begin
    i:=random(M); //产生两个随机数
    j:=random(N);
    If BombFlag[i][j]<>-1 then //如果该位置不是雷,则定为雷
    Begin
      BombFlag[i][j]:=-1;
      b:=b+1;
    End;
  End;
//**********下面计算雷周围雷数***************************
  for i:=0 to M-1 do
    for j:=0 to N-1 do
      if BombFlag[i][j]<>-1 then
      begin
        if (i=0) and (j=0) then
          BombFlag[i][j]:=juadge(BombFlag[i+1][j])+ juadge(BombFlag[i][j+1])+juadge(BombFlag[i+1][j+1]);
        if (i=0) and (j=N-1) then
          BombFlag[i][j]:=juadge(BombFlag[i][j-1])+ juadge(BombFlag[i+1][j-1])+juadge(BombFlag[i+1][j]);
        if (i=M-1) and (j=0) then
          BombFlag[i][j]:=juadge(BombFlag[i-1][j])+ juadge(BombFlag[i-1][j+1])+juadge(BombFlag[i][j+1]);
        if (i=M-1) and (j=N-1) then
          BombFlag[i][j]:=juadge(BombFlag[i-1][j-1])+ juadge(BombFlag[i-1][j])+juadge(BombFlag[i][j-1]);
        if (i=0) and (j<>0)and (j<>N-1) then
          BombFlag[i][j]:=juadge(BombFlag[i][j-1])+ juadge(BombFlag[i+1][j-1])+juadge(BombFlag[i+1][j])+ juadge(BombFlag[i+1][j+1])+juadge(BombFlag[i][j+1]);
        if (j=0) and (i<>0)and (i<>M-1) then
          BombFlag[i][j]:=juadge(BombFlag[i-1][j])+ juadge(BombFlag[i-1][j+1])+juadge(BombFlag[i][j+1])+ juadge(BombFlag[i+1][j+1])+juadge(BombFlag[i+1][j]);
        if (j=N-1) and (i<>0)and (i<>M-1) then
          BombFlag[i][j]:=juadge(BombFlag[i-1][j])+ juadge(BombFlag[i-1][j-1])+juadge(BombFlag[i][j-1])+ juadge(BombFlag[i+1][j-1])+juadge(BombFlag[i+1][j]);
        if (i=M-1) and (j<>0)and (j<>N-1) then
          BombFlag[i][j]:=juadge(BombFlag[i][j-1])+ juadge(BombFlag[i-1][j-1])+juadge(BombFlag[i-1][j])+ juadge(BombFlag[i-1][j+1])+juadge(BombFlag[i][j+1]);
        if (i<>0)and (i<>M-1) and (j<>0) and (j<>N-1)then
        begin
          BombFlag[i][j]:=juadge(BombFlag[i-1][j-1])+ juadge(BombFlag[i-1][j])+juadge(BombFlag[i-1][j+1])+ juadge(BombFlag[i][j-1])+juadge(BombFlag[i][j+1]);
          BombFlag[i][j]:=BombFlag[i][j]+juadge(BombFlag[i+1][j-1])+ juadge(BombFlag[i+1][j])+juadge(BombFlag[i+1][j+1]);
        end;
     end;
  
end;

procedure TSaoLei.ClickDraw(i,j:integer);
begin
  If CurrentFlag[i][j]=0 then //当前标志为原状
    begin
       if BombFlag[i][j]<>0 then // 雷数不为零
           begin
            CurrentFlag[i][j]:=3; //标志当前位置已被点开
            inc(GameOver);
            imagelist1.Draw(SaoLei.Canvas,I*30+leftI,j*30+topI,BombFlag[i][j],true);
           end
         else   //雷数为零
           begin
              imagelist1.Draw(SaoLei.Canvas,I*30+leftI,j*30+topI,0,true);
              CurrentFlag[i][j]:=3;
              inc(GameOver);
              if (i=0) and (j=0) then
                 begin
                   ClickDraw(i+1,j);
                   ClickDraw(i,j+1);
                   ClickDraw(i+1,j+1);
                 end;
              if (i=0) and (j=N-1) then
                  begin
                   ClickDraw(i+1,j-1);
                   ClickDraw(i,j-1);
                   ClickDraw(i+1,j);
                 end;
              if (i=M-1) and (j=0) then
                  begin
                   ClickDraw(i-1,j);
                   ClickDraw(i-1,j+1);
                   ClickDraw(i,j+1);
                 end;
              if (i=M-1) and (j=N-1) then
                  begin
                   ClickDraw(i-1,j-1);
                   ClickDraw(i-1,j);
                   ClickDraw(i,j-1);
                 end;
              if (i=0) and (j<>0)and (j<>N-1) then
                 begin
                   ClickDraw(i,j-1);
                   ClickDraw(i+1,j-1);
                   ClickDraw(i+1,j);
                   ClickDraw(i+1,j+1);
                   ClickDraw(i,j+1);
                 end;
              if (j=0) and (i<>0)and (i<>M-1) then
                  begin
                   ClickDraw(i-1,j);
                   ClickDraw(i-1,j+1);
                   ClickDraw(i,j+1);
                   ClickDraw(i+1,j+1);
                   ClickDraw(i+1,j);
                 end;
              if (j=N-1) and (i<>0)and (i<>M-1) then
                 begin
                   ClickDraw(i-1,j);
                   ClickDraw(i-1,j-1);
                   ClickDraw(i,j-1);
                   ClickDraw(i+1,j-1);
                   ClickDraw(i+1,j);
                 end;
              if (i=M-1) and (j<>0)and (j<>N-1) then
                 begin
                   ClickDraw(i,j-1);
                   ClickDraw(i-1,j-1);
                   ClickDraw(i-1,j);
                   ClickDraw(i-1,j+1);
                   ClickDraw(i,j+1);
                 end;
               if (i<>0)and (i<>M-1) and (j<>0) and (j<>N-1)then
                  begin
                   ClickDraw(i-1,j-1);
                   ClickDraw(i-1,j);
                   ClickDraw(i-1,j+1);
                   ClickDraw(i,j-1);
                   ClickDraw(i,j+1);
                   ClickDraw(i+1,j-1);
                   ClickDraw(i+1,j);
                   ClickDraw(i+1,j+1);
                  end;
           end;
    end;//if

end;

procedure TSaoLei.GameEnd(FalseI,FalseJ:integer);
var i,j:integer;
begin
  for i:=0 to M-1 do
    for j:=0 to N-1 do
      begin
        if  BombFlag[i][j]=-1 then //YesBomb
            imagelist1.Draw(SaoLei.Canvas,i*30+leftI,j*30+topI,9)
        else     //NoBobm
          begin
            if CurrentFlag[i][j]=1 then
               imagelist1.Draw(SaoLei.Canvas,i*30+leftI,j*30+topI,12);
          end;
          imagelist1.Draw(SaoLei.Canvas,FalseI*30+leftI,FalseJ*30+topI,13);
          CurrentFlag[i][j]:=3;
      end;
end;

procedure TSaoLei.N3Click(Sender: TObject);
begin
  ChuShiHua;
  Saolei.Repaint;
  N3.Enabled :=false;
  N5.Enabled :=true;
  N6.Enabled :=false;
  N7.Enabled :=false;
  N8.Enabled :=false;
  N9.Enabled :=false;
end;

function TSaoLei.juadge(LeiYesNo:integer):integer;

⌨️ 快捷键说明

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