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

📄 unit1.pas

📁 这是我自己用DELPHI写的一个完全模仿WINDOWS扫雷的游戏
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit Unit1;

interface

uses
  
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, ExtCtrls,mmsystem, Buttons,inifiles, shellapi,
  ComCtrls, Registry;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    imgfield: TImage;
    Panel2: TPanel;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    MenNewGm: TMenuItem;
    Menchuji: TMenuItem;
    Menzhongji: TMenuItem;
    Mengaoji: TMenuItem;
    Menyxb: TMenuItem;
    Menexit: TMenuItem;
    N10: TMenuItem;
    N11: TMenuItem;
    N12: TMenuItem;
    N13: TMenuItem;
    N14: TMenuItem;
    N15: TMenuItem;
    Menbj: TMenuItem;
    N17: TMenuItem;
    N18: TMenuItem;
    Menzdy: TMenuItem;
    N19: TMenuItem;
    imgrefield: TImage;
    imgquest: TImage;
    imgNewGm: TImage;
    imgNewGmPressed: TImage;
    imgNewGmY: TImage;
    imgfieldpress: TImage;
    imgCry: TImage;
    imgWin: TImage;
    Timer1: TTimer;
    imgpressed: TImage;
    imgquestdown: TImage;
    imgNum: TImage;
    imgmineleft: TImage;
    imgtimeused: TImage;
    imgNums: TImage;
    procedure OnCreat(Sender: TObject);
    procedure initminefield;
    procedure formsize;
    procedure NewGmOnMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure NewGmOnMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure NewGmOnClick(Sender: TObject);
    procedure imgfieldOnMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure imgfieldOnMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Timer1Timer(Sender: TObject);
    procedure MenchujiClick(Sender: TObject);
    procedure MenzhongjiClick(Sender: TObject);
    procedure MenNewGmClick(Sender: TObject);
    procedure MengaojiClick(Sender: TObject);
    procedure Mencheck(A:integer);
    procedure MenzdyClick(Sender: TObject);
    procedure MenexitClick(Sender: TObject);
    procedure imgfieldOnMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure openblank(intY,intX:integer);
    procedure die(intY,intX:integer);
    procedure led(Num:integer;imgdisplay:Timage);
    procedure MenyxbClick(Sender: TObject);
    procedure Win();
    procedure Writetoreg(Name:string;usetime:integer;level:TMenuItem);
    procedure Readfromreg();
    procedure N13Click(Sender: TObject);
    procedure N10Click(Sender: TObject);
    procedure N11Click(Sender: TObject);
    procedure N12Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
     
  end;

var
  Form1: TForm1;
  Mine: array of array of integer;     //雷区的雷坐标
  Minelocation:array of array of integer;     //每个雷的坐标
  Mark:array of array of integer;     //鼠标右键所做的标记
  Wronglocation:array of array of integer;  //错误标记的坐标
  cols,rows:integer;       //帖图的坐标点
  Nummines:integer;        //雷的总数
  Ncols,Nrows:integer;    //游戏中的最大宽度和高度
  hitbegin:boolean;
  Leftbutton:boolean;
  Hits:integer;             //雷的正确标记的数量
  wrHits:integer;           //雷的错误标记数量
  leftandrightdown:boolean;    //判断双键是否按下
  timeused:integer;         //游戏所用时间
  mineleft:integer;         //游戏中的剩余雷数
  MineOpened:array of array of integer;  //双键里用的暂存数组
  psed:integer;                   //双键里用的计数器
  comdir:string;
const
buttonwidth=16;
g_ChmFileName='mine.chm';
g_HelpFileName='mine.hlp';
g_ResourceName='resource\';
g_SysHelpFileName='Syshelp.chm';

implementation
uses Unit2, Unit3,Unit_About;
{$R *.dfm}




procedure Tform1.Readfromreg();
var
  Reg: TRegistry;
begin
  Reg:= TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    Reg.OpenKey('\MinMine\MinMine Hero',true);


    form3.chutime.Caption:=inttostr(Reg.ReadInteger(Menchuji.Caption+'time'));
    form3.chuName.Caption:=Reg.Readstring(Menchuji.Caption+'name');

    form3.zhongtime.Caption:=inttostr(Reg.ReadInteger(Menzhongji.Caption+'time'));
    form3.zhongName.Caption:=Reg.Readstring(Menzhongji.Caption+'name');

    form3.gaotime.Caption:=inttostr(Reg.ReadInteger(Mengaoji.Caption+'time'));
    form3.gaoName.Caption:=Reg.Readstring(Mengaoji.Caption+'name');

    Reg.CloseKey;

  finally
    Reg.Free;
    
  end;

end;






procedure Tform1.Writetoreg(Name:string;usetime:integer;level:TMenuItem);
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKey('\MinMine\MinMine Hero', True) then
   begin
      Reg.WriteString(level.Caption+'name' ,Name);
      Reg.Writeinteger(level.Caption+'time' ,usetime);
      Reg.CloseKey;
    end;
  finally
    Reg.Free;

  end;

end;





procedure Tform1.Win();
var
Name:string;
begin
   imgfield.Enabled:=false;
   imgNewGm.Canvas.Draw(0,0,imgWin.Picture.Graphic);
   timer1.Enabled:=false;

    if Menchuji.Checked and (timeused<strtoint(form3.chutime.Caption)) then
    begin
     Name:= InputBox('恭喜恭喜', '尊姓大名', '匿名');
     writetoreg(Name,timeused,Menchuji);
     form3.chutime.Caption:=inttostr(timeused);
     form3.chuname.Caption:=Name;
    end;

    if Menzhongji.Checked and (timeused<strtoint(form3.zhongtime.Caption)) then
     begin
     Name:= InputBox('恭喜恭喜', '尊姓大名', '匿名');
     writetoreg(Name,timeused,Menzhongji);
     form3.zhongtime.Caption:=inttostr(timeused);
     form3.zhongname.Caption:=Name;
    end;

    if Mengaoji.Checked and (timeused<strtoint(form3.gaotime.Caption)) then
     begin
      Name:= InputBox('恭喜恭喜', '尊姓大名', '匿名');
      writetoreg(Name,timeused,Mengaoji);
      form3.gaotime.Caption:=inttostr(timeused);
      form3.gaoname.Caption:=Name;
     end;
end;



procedure Tform1.led(Num:integer;imgdisplay:Timage);


begin

  if Num>=0 then
    begin
      case Num of
        0..9:
           begin
             imgdisplay.Canvas.CopyRect(rect(0,0,13,23),imgNum.Canvas,rect(0,253,13,276));
             imgdisplay.Canvas.CopyRect(rect(13,0,26,23),imgNum.Canvas,rect(0,253,13,276));
             imgdisplay.Canvas.CopyRect(rect(26,0,39,23),imgNum.Canvas,rect(0,253-Num*23,13,253-(Num-1)*23));
           end;
       10..99:
           begin
             imgdisplay.Canvas.CopyRect(rect(0,0,13,23),imgNum.Canvas,rect(0,253,13,276));
             imgdisplay.Canvas.CopyRect(rect(13,0,26,23),imgNum.Canvas,rect(0,253-(Num div 10)*23,13,253-(Num div 10-1)*23));
             imgdisplay.Canvas.CopyRect(rect(26,0,39,23),imgNum.Canvas,rect(0,253-(Num mod 10)*23,13,253-(Num mod 10-1)*23));
           end;
       100..999:
           begin
              imgdisplay.Canvas.CopyRect(rect(0,0,13,23),imgNum.Canvas,rect(0,253-(Num div 100)*23,13,253-(Num div 100-1)*23));
              imgdisplay.Canvas.CopyRect(rect(13,0,26,23),imgNum.Canvas,rect(0,253-((Num mod 100) div 10)*23,13,253-((Num mod 100) div 10-1)*23));
              imgdisplay.Canvas.CopyRect(rect(26,0,39,23),imgNum.Canvas,rect(0,253-(Num mod 10)*23,13,253-(Num mod 10-1)*23));
           end;
      end;
    end;

  if Num<0 then
    begin
      case Num of
        -9..-1:
           begin
             imgdisplay.Canvas.CopyRect(rect(0,0,13,23),imgNum.Canvas,rect(0,23,13,46));
             imgdisplay.Canvas.CopyRect(rect(13,0,26,23),imgNum.Canvas,rect(0,0,13,23));
             imgdisplay.Canvas.CopyRect(rect(26,0,39,23),imgNum.Canvas,rect(0,253+Num*23,13,253+(Num+1)*23));
           end;
        -99..-10:
           begin
             imgdisplay.Canvas.CopyRect(rect(0,0,13,23),imgNum.Canvas,rect(0,0,13,23));
             imgdisplay.Canvas.CopyRect(rect(13,0,26,23),imgNum.Canvas,rect(0,253+(Num div 10)*23,13,253+(Num div 10+1)*23));
             imgdisplay.Canvas.CopyRect(rect(26,0,39,23),imgNum.Canvas,rect(0,253+(Num mod 10)*23,13,253+(Num mod 10+1)*23));
           end;
     end;
   end;


end;


procedure Tform1.die(intY,intX:integer);
var
i:integer;
wrongintX,wrongintY:integer;
begin
   imgpressed.Left:=5000;
   imgquestdown.Left:=5000;
   wrongintX:=intX;
   wrongintY:=intY;
   imgNewGm.Canvas.Draw(0,0,imgCry.Picture.Graphic);
   timer1.Enabled:=false;
   for i:=0 to Nummines-1 do
      begin
         intY:=minelocation[i,0];
         intX:=minelocation[i,1];
         cols:=intX*buttonwidth;
         rows:=intY*buttonwidth;
         imgfield.Canvas.CopyRect(rect(cols,rows,cols+16,rows+16),imgNums.Canvas,rect(0,80,16,96));
      end;
      imgfield.Canvas.CopyRect(rect(wrongintX*16,wrongintY*16,(wrongintX+1)*16,(wrongintY+1)*16),imgNums.Canvas,rect(0,48,16,64));

  for i:=1 to wrHits do
      begin
        intY:=wronglocation[i,1];
        intX:=wronglocation[i,2];
      if mark[intY,intX]=2 then
        begin
        cols:=intX*buttonwidth;
        rows:=intY*buttonwidth;
        imgfield.Canvas.CopyRect(rect(cols,rows,cols+16,rows+16),imgNUms.Canvas,rect(0,64,16,80));
        end;
      end;


      imgfield.Enabled:=false;
end;



procedure Tform1.openblank(intY,intX:integer);
var
ndx,ndy:boolean;
h,i,j,k:integer;
opened:boolean;

begin


repeat

begin
 opened:=false;
 for h:=0 to Nrows-1  do
    for i:=0 to Ncols-1  do
     begin
       if mine[h,i]=10 then
          begin

            for j:=-1 to 1 do
               for k:=-1 to 1 do
                 begin
                     ndx:=(i+k>=0) and (i+k<Ncols);
                     ndy:=(h+j>=0) and (h+j<Nrows);

                     if ndx and ndy and (mine[h+j,i+k]<9) and (mark[h+j,i+k]=0) then
                       begin
                          imgfield.Canvas.CopyRect(rect((i+k)*16,(h+j)*16,(i+k+1)*16,(h+j+1)*16),imgNums.Canvas,rect(0,240-mine[h+j,i+k]*16,16,240-(mine[h+j,i+k]-1)*16));
                          mine[h+j,i+k]:=10+mine[h+j,i+k];
                          opened:=true;
                       end;

               end;

          end;
     end;
  imgfield.Canvas.CopyRect(rect(intX*16,intY*16,(intX+1)*16,(intY+1)*16),imgNUms.Canvas,rect(0,240,16,256));
end;
until opened=false;

end;





procedure Tform1.Mencheck(A:integer);
var
i:integer;
begin
for i:=0 to 5 do
 N1.Items[i].Checked:=false;
end;


procedure Tform1.formsize;
var
NL:variant;
begin
//窗体大小及其他控件位置
imgfield.Width :=buttonwidth*Ncols;
imgfield.Height :=buttonwidth*Nrows;

NL:=(imgfield.width-imgNewGm.width)/2+imgfield.Left;
imgNewGm.Left:=NL;

imgtimeused.Left:=imgNewGm.Left+imgNewGm.Width+imgNewGm.Left-(imgmineleft.Left+imgmineleft.Width);

panel1.Width :=imgfield.Width +14;
panel1.Height :=imgfield.Height +14;

form1.Width :=panel1.Width+13;
form1.Height :=panel1.Height+panel2.Height +50;

panel2.Width :=panel1.Width ;
//窗体大小及其他控件位置
end;



procedure Tform1.initminefield;
var
i,j,k:integer;
ndx,ndy:boolean;
intX,intY:integer;

//初始化雷区
begin

psed:=0;
leftandrightdown:=false;
Leftbutton:=false;
timer1.Enabled:=false;
imgfield.Canvas.Draw(0,0,imgrefield.Picture.Graphic );
imgNewGm.Canvas.Draw(0,0,imgNewGmY.Picture.Graphic);
imgpressed.Left:=5000;
timeused:=0;
wrHits:=0;
Hits:=Nummines;
mineleft:=Nummines;
led(mineleft,imgmineleft);
led(timeused,imgtimeused);


setlength(Mark,0,0);
setlength(Mark,Nrows,Ncols);
setlength(mine,0,0);
setlength(mine,Nrows,Ncols);
setlength(minelocation,0,0);
setlength(minelocation,Nummines,Nummines);
setlength(wronglocation,0,0);
setlength(wronglocation,Nrows*Ncols,3);




randomize;
for i:=0 to Nummines-1 do

  begin

   intY:=random(Nrows);
   intX:=random(Ncols);
     randomize;
     while mine[intY,intX]=9 do

       begin
         intY:=random(Nrows);
         intX:=random(Ncols);
       end;

       mine[intY,intX]:=9;
       minelocation[i,0]:=intY;
       minelocation[i,1]:=intX;

       for j:=-1 to 1 do
         begin
           for k:=-1 to 1 do

           begin
            ndx:=(intX+k>=0) and (intX+k<Ncols);
            ndy:=(intY+j>=0) and (intY+j<Nrows);

               if ndx and ndy then
                  begin
                  if mine[intY+j,intX+k]<>9 then mine[intY+j,intX+k]:=mine[intY+j,intX+k]+1;
                  end;

⌨️ 快捷键说明

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