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

📄 unit_main.pas

📁 扫雷
💻 PAS
📖 第 1 页 / 共 5 页
字号:
{******************************************************************************
*   Uint  Unit_Main
*   Function 程序的主要代码部分,是程序的主体部分
*
*   CopyRight (c) By 虹雨 (Huansun) 2002-8
*
*   Date    :
*       New Develop   : 2002-7-31
*       Modified      : 2002-9-10
******************************************************************************}

unit Unit_Main;

interface

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

const
  //数组的最大 最小的列数和行数
  g_MaxCol=50;
  g_MaxRow=26;

  g_MinCol=9;
  g_MinRow=9;

  //雷数最多情况下占总方块个数的比例
  g_MaxPer=0.926;

  ////最多和最少的雷数
  g_MaxCount=999;
  g_MinCount=10;

  //初 中 高 专业级的分别的列数 行数 雷数
  g_Level_1_Col=9;
  g_Level_1_Row=9;
  g_Level_1_Bombcount=10;  //12.3%

  g_Level_2_Col=16;
  g_Level_2_Row=16;
  g_Level_2_Bombcount=40;  //15.6%

  g_Level_3_Col=30;
  g_Level_3_Row=16;
  g_Level_3_Bombcount=99;  //20.6%

  g_Level_4_Col=40;
  g_Level_4_Row=26;
  g_Level_4_Bombcount=210;  //22%


  //每个方块的宽度 高度
  g_BlockWidth=16;
  g_BlockHeight=16;

  //每个显示的数字的宽度 高度
  g_NumWidth=13;
  g_NumHeight=23;

  //每张 Face 的宽度 高度
  g_FaceWidth = 24;
  g_FaceHeight = 24;

  //资源文件的路径 文件名
  g_ResourceName='resource\';
  g_HeroFileName='hero.ini';
  g_InfoFileName='info.ini';
  g_Sound_Second='second.wav';
  g_Sound_GameWin='GameWin.wav';
  g_Sound_GameLost='GameLost.wav';
  g_ChmFileName='mine.chm';
  g_HelpFileName='mine.hlp';
  g_SysHelpFileName='Syshelp.chm';

  //注册表文件的路径
  g_REG_InfoPath = '\MiniMine\MiniMine Info';
  g_REG_HeroPath = '\MiniMine\MiniMine Hero';

type
  //在运用四连通算法进行展开区域时使用到的记录类型的指针类型
  BlockPointer=^TBlockRec;
  TBlockRec=Record
          BlockX   :integer;
          BlockY   :integer;
          preBlock :BlockPointer;
          nextBlock:BlockPointer;
        end;

  //Grid 中的数组大小已经扩大了各一个方块
  //用于记录当前列数 行数 以及 标识雷区和显示区的数组 的一个记录类型
  TGridArray= record
    LocalTotalCols :integer;
    LocalTotalRows :integer;
    Grid           :Array[1..g_MaxCol +1,1..g_MaxRow +1] of integer;
  end;

  //用于在GameOver时记录哪些方块标错了雷.
  TOverColAndRow=array[1..8] of integer;

  //用于在显示 d_left --显示雷的个数  d_right --显示时间
  TDisplayDir=(d_left,d_right);

  //用于显示按钮上笑脸的类型
  TFaceType=(f_smile,f_o,f_glass,f_sad,f_smileDown);

  //用于显示的语言类型
  TLanguageType=(l_Chinese_Simplified,l_Chinese_Traditional,l_English);

  //游戏目前的状态
  TGameStatus=(s_Waiting, s_Sweeping, s_pausing, s_Win, s_Lost);

  //游戏的级别
  TGameLevel=(v_Beginner,v_Middle,v_Expert,v_Professional,v_UserDefine);

  TFrm_Main = class(TForm)
    MainMenu: TMainMenu;
    G1: TMenuItem;
    N1: TMenuItem;
    N2: TMenuItem;
    Menu_Lv_B: TMenuItem;
    Menu_Lv_I: TMenuItem;
    Menu_Lv_E: TMenuItem;
    Menu_Lv_C: TMenuItem;
    N3: TMenuItem;
    T1: TMenuItem;
    N4: TMenuItem;
    X1: TMenuItem;
    H1: TMenuItem;
    C2: TMenuItem;
    S1: TMenuItem;
    N5: TMenuItem;
    A1: TMenuItem;
    H2: TMenuItem;
    Menu_Flag: TMenuItem;
    N6: TMenuItem;
    Menu_Color: TMenuItem;
    Menu_Sound: TMenuItem;
    Panel_top: TPanel;
    Panel_bottom: TPanel;
    Image_BackGround: TImage;
    Timer_Display: TTimer;
    Panel_Display_right: TPanel;
    Panel_Display_left: TPanel;
    Image_Dis_BombCount: TImage;
    Image_Dis_Time: TImage;
    Image_Color_block: TImage;
    Image_Color_Button: TImage;
    Image_Color_Num: TImage;
    Image_Gray_block: TImage;
    Image_Gray_Button: TImage;
    Image_Gray_Num: TImage;
    Image_Face: TImage;
    L1: TMenuItem;
    m_Chinese_Simplified: TMenuItem;
    m_English: TMenuItem;
    N13: TMenuItem;
    Menu_Restart: TMenuItem;
    C1: TMenuItem;
    Menu_StatusBar: TMenuItem;
    StatusBar_Mine: TStatusBar;
    Menu_Pause_Resume: TMenuItem;
    Timer_NowTime: TTimer;
    m_Chinese_Traditional: TMenuItem;
    Menu_Lv_P: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure X1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Image_BackGroundMouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure Image_BackGroundMouseUp(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure Image_BackGroundMouseMove(Sender: TObject;
      Shift: TShiftState; X, Y: Integer);
    procedure Timer_DisplayTimer(Sender: TObject);
    procedure Panel_topMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Panel_topMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Menu_Lv_BClick(Sender: TObject);
    procedure Menu_Lv_IClick(Sender: TObject);
    procedure Menu_Lv_EClick(Sender: TObject);
    procedure N1Click(Sender: TObject);
    procedure Menu_FlagClick(Sender: TObject);
    procedure Menu_ColorClick(Sender: TObject);
    procedure Menu_SoundClick(Sender: TObject);
    procedure Menu_Lv_CClick(Sender: TObject);
    procedure T1Click(Sender: TObject);
    procedure A1Click(Sender: TObject);
    procedure C2Click(Sender: TObject);
    procedure Image_FaceMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image_FaceMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Panel_topMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Image_Dis_BombCountMouseMove(Sender: TObject;
      Shift: TShiftState; X, Y: Integer);
    procedure Image_Dis_TimeMouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    procedure Image_Dis_BombCountMouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure Image_Dis_TimeMouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure Image_Dis_BombCountMouseUp(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure Image_Dis_TimeMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Panel_Display_leftMouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure Panel_Display_leftMouseMove(Sender: TObject;
      Shift: TShiftState; X, Y: Integer);
    procedure Panel_Display_leftMouseUp(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure Panel_Display_rightMouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure Panel_Display_rightMouseMove(Sender: TObject;
      Shift: TShiftState; X, Y: Integer);
    procedure Panel_Display_rightMouseUp(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure H2Click(Sender: TObject);
    procedure S1Click(Sender: TObject);
    procedure m_EnglishClick(Sender: TObject);
    procedure Panel_bottomMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Panel_bottomMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Panel_bottomMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Menu_RestartClick(Sender: TObject);
    procedure Menu_StatusBarClick(Sender: TObject);
    procedure Menu_Pause_ResumeClick(Sender: TObject);

    procedure CustomizeFrmClientRange(const c_isHaveStatusBar:boolean);
    procedure Timer_NowTimeTimer(Sender: TObject);
    procedure m_Chinese_SimplifiedClick(Sender: TObject);
    procedure StatusBar_MineMouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure StatusBar_MineMouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    procedure StatusBar_MineMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure m_Chinese_TraditionalClick(Sender: TObject);
    procedure Menu_Lv_PClick(Sender: TObject);

  protected
   { Protected declarations }

  private
    { Private declarations }
    //改变笑脸的图片
    procedure ChgSpbtnGlyph (FaceType:TFaceType );

    //改变状态栏的显示内容
    procedure ChangeStatusBar(const c_Level: TGameLevel ;const c_Cols,c_Rows,c_Bombs:integer;
      const c_GameStatus:TGameStatus ;const c_LocalScore:integer;
      const c_LanguageType:TLanguageType );

    //改变菜单
    procedure ChangeMenu(const m_LanguageType:TLanguageType );

  public
    { Public declarations }

    //根据传进来的UpGridArray的值画地图,于全局变量LastGridArray 的逐个方格进行比较,画地图
    //isColor 的作用时,时由于按动了'颜色'菜单触发的话,则强行全部重画.
    procedure DrawBackGround(const d_UpGridArray:TGridArray; const isColorForce:boolean);

    //根据传进来的Count 值和需要 Draw 的是左边的雷数还是右边的时间值
    procedure DrawHead(const Count:integer;d_Dir:TDisplayDir );

    //难度级别的菜单标注
    procedure LevelMenuSelect(isLevel_B,isLevel_I,isLevel_E,isLevel_P,isLevel_C:boolean);

    //获胜
    procedure GameWin(w_DownGridArray:TGridArray ;var w_UpGridArray:TGridArray);

    //游戏失败
    procedure GameLost(l_DownGridArray:TGridArray ;var l_UpGridArray:TGridArray;l_Col,l_Row:TOverColAndRow);

    //初始化窗体以及其中各个panel  button 的位置初始化
    procedure initForm(const totalCol,totalRow,i_bombCount:integer; const i_isHaveStatusBar:boolean);

    //初始化整个程序的各个变量
    procedure initApplication(const i_level:TGameLevel ; UserCols, UserRows, UserBombs:integer;i_isHaveQuestion,i_isHaveColor,i_isHaveSound, i_isHaveStatusBar:boolean; var i_LanguageType:TLanguageType );

  end;

var
  Frm_Main: TFrm_Main;

  comdir:string;        //用于保存路径
  LanguageType:TLanguageType; //当前语言的类型
  GameStatus:TGameStatus;

  isHaveQuestion:boolean;     //是否有标志(?) 存在
  isHaveColor:boolean;        //是否是彩色显示
  isHaveSound:boolean;        //是否有声音
  isHaveStatusBar:boolean;    //是否有状态栏

  UserLevel:TGameLevel ;         //当前级别(初 中 高)
  UserTotalCols:integer;     //当前列数
  UserTotalRows:integer;     //当前行数
  UserBombCount:integer;     //当前雷的总个数

  DownGridArray:TGridArray;	//底层数组
  UpGridArray:TGridArray;	//显示层数组
  LastUpGridArray:TGridArray ;  //上次显示层的数组,在 重新画地图的时候使用
  LastDownGridArray:TGridArray; //用于在‘重新扫本局’的功能处使用

  TotalTime:integer;    //当前所使用的时间
  Begin_Time:DWORD;     //开始计时的时间
  LocalScore:integer;   //本级别(除了自定义)的记录时间

  LocalCol,LocalRow:integer;   //当前列号  当前行号

  isFirstClick:boolean;		//是否时左键第一次点击
  isGameStarted:boolean;        //判断游戏是否开始了
  isGameOver:boolean;		//是否游戏结束
  isGameWin:Boolean;         //是否获胜
  isGameLost:Boolean;        //是否失败
  isGamePaused :boolean;              //程序是否被暂停
  isGameofRestart:boolean;            //是否是‘重新扫本局’的一局

  isLeftBtnDown,isRightbtnDown:boolean;    //
  isLeftAndRightBtnDown:boolean;           //

  FlagCount:integer;                    //已经标志了雷的方块的数目
  BlockOpenCount:integer;               //已经打开的方块的数目

  //初始化底层阵列数组的值
  procedure initGridArray( const BombCount, localx, localy:integer;var s_DownGridArray, s_UpGridArray:TGridArray);

  //用八连通算法对空格以外的连通区域展开
  procedure SeekBlackBlock(s_DownGridArray:TGridArray;var s_UpGridArray:TGridArray;s_Col,s_Row:integer);

  //左右键其中有一个键弹起时触发
  procedure LeftAndRightBtnUp(lru_DownGridArray:TGridArray ;var lru_UpGridArray:TGridArray;lru_Col,lru_Row:integer );

  //左键按下时触发
  procedure LeftBtnDown(ld_DownGridArray:TGridArray ;var ld_UpGridArray:TGridArray ;ld_Col,ld_Row:integer);

  //左键Up时触发
  procedure LeftBtnUp(lu_DownGridArray:TGridArray ;var lu_UpGridArray:TGridArray ;lu_Col,lu_Row:integer);

  //右键按下时触发
  procedure RightBtnDown(rd_DownGridArray:TGridArray ;var rd_UpGridArray:TGridArray ;rd_Col,rd_Row:integer);

  //对数组的值进行检验
  procedure checkArr(var c_downGridArray,c_UpGridArray:TGridArray ;var c_BombCount:integer);

  //左右键都按下了时触发
  procedure LeftAndRightBtnDown(lrd_DownGridArray :TGridArray ;var lrd_UpGridArray:TGridArray;lrd_Col,lrd_Row:Integer );

  //将象素转变成方块的块号
  procedure ChangePixelToBlock(pixelx,pixely:integer;var BlockCol,BlockRow:integer);

  //检查窗体的位置,以确保其存在于显示区域内
  procedure checkMainFormPosition(frm_check:TForm );

  //按下了的左键从此方块上移开时触发
  procedure leftBtnMoveOut(lm_DownGridArray:TGridArray ;var lm_UpGridArray:TGridArray ;lm_Col,lm_row:integer);

  //左右键同时按下时从此方块上移开时触发
  procedure LeftAndRightBtnMoveOut(lrm_DownGridArray:TGridArray ;var lrm_UpGridArray:TGridArray ;lrm_Col,lrm_row:integer);

  //从注册表中读取相关信息
  procedure ExportIniFile(var i_level:TGameLevel ;var i_totalCols,i_totalRows,i_bombCount:integer;var i_isHaveQuestion,i_isHaveColor,i_isHaveSound, i_isHaveStatusBar:boolean; var i_LanguageType:TLanguageType );

implementation

uses Unit_Choose, Unit_Hero,Unit_About, Unit_HeroName;

{$R *.dfm}

procedure initGridArray( const BombCount, localx, localy:integer;var s_DownGridArray, s_UpGridArray:TGridArray);
var

⌨️ 快捷键说明

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