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

📄 unit_main.pas

📁 扫雷
💻 PAS
📖 第 1 页 / 共 5 页
字号:
    BlockRow :=pixely div g_BlockHeight-1
  else
    BlockRow :=pixely div g_BlockHeight +1;
end;

procedure TFrm_Main.LevelMenuSelect(isLevel_B,isLevel_I,isLevel_E,isLevel_P,isLevel_C:boolean);
begin
  Menu_Lv_B .Checked :=isLevel_B ;
  Menu_Lv_I .Checked :=isLevel_I ;
  Menu_Lv_E .Checked :=isLevel_E ;
  Menu_Lv_P .Checked :=isLevel_P ;
  Menu_Lv_C .Checked :=isLevel_C;
end;

procedure TFrm_Main.initApplication(const i_level:TGameLevel ; UserCols, UserRows, UserBombs:integer;
              i_isHaveQuestion,i_isHaveColor,i_isHaveSound, i_isHaveStatusBar:boolean;
              var i_LanguageType:TLanguageType );
var
 i,j:integer;

  procedure initVar();
  begin
    FlagCount := 0;

    Timer_Display .Interval :=1000;
    Timer_Display .Enabled :=False;

    FlagCount:=0;
    BlockOpenCount:=0;               

    isFirstClick:=true ;
    isGameOver:=False ;
    isGameWin:=false;
    isGameLost:=false;
    isGamePaused :=false;

    isLeftBtnDown:=false;
    isRightbtnDown:=false;
    isLeftAndRightBtnDown:=false;
    GameStatus :=s_Waiting ;

    TotalTime :=0;
  end;


begin
  UserLevel :=i_level ;
  //调用unit_Hero 中的取得记录分数的函数。得到当前级别下的记录(不包括 ‘自定义’)
  unit_Hero.GetScore(UserLevel ,LocalScore );
  //定义地层 的结构
  DownGridArray .LocalTotalCols :=UserCols ;
  DownGridArray .LocalTotalRows :=UserRows ;
  UserBombCount :=UserBombs ;
  //
  checkArr(DownGridArray,UpGridArray,UserBombCount );
  //
  UserTotalCols :=DownGridArray .LocalTotalCols ;
  UserTotalRows :=DownGridArray .LocalTotalRows ;

//调用改变菜单的函数 ChangeMenu();
  ChangeMenu(i_LanguageType );

  case UserLevel of
    v_Beginner  :LevelMenuSelect(true,false,false,false,false);
    v_Middle  :LevelMenuSelect(false,true,false,false,false);
    v_Expert  :LevelMenuSelect(false,false,true,false,false);
    v_Professional  :LevelMenuSelect(false,false,false,true,false);
    v_UserDefine :LevelMenuSelect(false,false,false,false,true)

  end;
  //给变量赋值
  initVar ;
  //各个菜单项的状态
  Menu_Pause_Resume.Enabled :=false;
  Menu_Restart.Enabled :=false;
  Menu_Flag .Checked :=i_isHaveQuestion ;
  Menu_Color .Checked :=i_isHaveColor ;
  Menu_Sound .Checked :=i_isHaveSound ;

  //初始化窗体
  initform(DownGridArray.LocalTotalCols ,DownGridArray .LocalTotalRows ,UserBombCount, i_isHaveStatusBar );

  ChangeStatusBar(UserLevel,DownGridArray.LocalTotalCols,DownGridArray.LocalTotalRows,UserBombCount, s_Waiting,LocalScore,LanguageType);

  //显示层的两个数组的赋值.
  for i:= 1 to DownGridArray .LocalTotalCols do
    for j:=1 to DownGridArray .LocalTotalRows do
    begin
      UpGridArray .grid[i][j]:=11;
      LastUpGridArray .Grid [i][j]:=0;
    end;

  checkmainformposition(Frm_Main );
  DrawBackGround(UpGridArray ,false);
end;


procedure TFrm_Main.ChgSpbtnGlyph (FaceType:TFaceType );
var
  num:integer;
  comImage:TImage;
begin
  //根据传进来的 TFaceType 类型的值来确定笑脸的图片
  case FaceType of
    f_smileDown         : num := 1;
    f_glass             : num := 2;
    f_sad               : num := 3;
    f_o                 : num := 4;
    f_smile             : num := 5;
    else exit;
  end;
  if isHaveColor then
    comImage:=image_color_button
  else
    comImage:=Image_Gray_Button ;
  image_face.Canvas.CopyRect (rect (0,0,g_FaceWidth ,g_FaceHeight ),comImage.Canvas ,rect(0,(num-1)*g_FaceWidth ,g_FaceHeight ,num * g_FaceWidth ));
end;


procedure TFrm_Main.FormCreate(Sender: TObject);
var
  c_I_REG:TRegistry;
  c_H_REG:TRegistry;
begin
//如果注册表里还没有信息,则向注册表里添加初始的值
  //游戏信息的相关键值
  c_I_REG:=TRegistry.Create;
  c_I_REG.RootKey:=HKEY_CURRENT_USER;
  with c_I_REG do
    if not KeyExists(g_REG_InfoPath ) then
    begin
      CreateKey(g_REG_InfoPath);
      OpenKey(g_REG_InfoPath ,False);

      WriteInteger('Language',10);
      WriteInteger('Pos_Left',Screen .Width  div 2 - ((g_Level_2_Col  div 2)*g_BlockWidth ));
      WriteInteger('Pos_Top',Screen .Height  div 2 - ((g_Level_2_Row  div 2)*g_BlockHeight )-100);

      WriteInteger('Level',12 );
      WriteInteger('LocalCols',g_Level_2_Col );
      WriteInteger('LocalRows',g_Level_2_Row );
      WriteInteger('BombCount',g_Level_2_Bombcount );
      WriteBool('IsHaveQuestion',true);
      WriteBool('IsHaveColor',True);
      WriteBool('IsHaveSound',True);
      WriteBool('IsHaveStatusBar',False);

      CloseKey;
      Free;
    end;

    //英雄榜的相关键值
    c_H_REG:=TRegistry.Create;
    c_H_REG.RootKey:=HKEY_CURRENT_USER;
    with c_H_REG do
      if not KeyExists(g_REG_HeroPath ) then
      begin
        CreateKey(g_REG_HeroPath );
        OpenKey(g_REG_HeroPath,false );

        WriteString('Level_B_Name','匿名');
        WriteInteger('Level_B_Score',999);
        WriteString('Level_I_Name','匿名');
        WriteInteger('Level_I_Score',999);
        WriteString('Level_E_Name','匿名');
        WriteInteger('Level_E_Score',999);
        WriteString('Level_P_Name','匿名');
        WriteInteger('Level_P_Score',999);

        closekey;
        free;
      end;

  //在Delphi 6 下要用到 CopyRect函数时就需要将其(TImage) 的父控件的 DoubleBufered 设置为 True;
  //这样才能确保图片区域不抖动.
  Panel_top.DoubleBuffered :=true;
  Panel_bottom.DoubleBuffered :=true;

  //开始的第一局不是重新开局的雷区.
  isGameofRestart :=false;
  ExportIniFile(UserLevel ,UserTotalCols ,UserTotalRows ,UserBombCount ,isHaveQuestion ,isHaveColor ,isHaveSound ,isHaveStatusBar ,LanguageType);
  initApplication (UserLevel ,UserTotalCols ,UserTotalRows ,UserBombCount ,isHaveQuestion ,isHaveColor ,isHaveSound ,isHaveStatusBar ,LanguageType);
end;

procedure TFrm_Main.Image_BackGroundMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  keystate:TKeyboardState;
begin
  //采用判断当前鼠标按键情况的方法确认鼠标的按键
  GetKeyboardState (keystate );
  //左键是否按下
  if keystate[vk_lbutton] and $80 <> 0 then
    isLeftBtnDown :=true
  else
    isLeftBtnDown :=False;

  //右键是否按下
  if keystate[vk_rbutton] and $80 <> 0 then
    isRightbtnDown :=true
  else
    isRightbtnDown :=false;

  //左右键是否同时按下
  if keystate[vk_lbutton] and keystate[vk_rbutton] and $80 <> 0 then
    isLeftAndRightBtnDown :=true
  else
    isLeftAndRightBtnDown :=false;

  if isGameOver or isGamePaused  then
    exit;

  //转换鼠标的点击 X Y 成方块号
  ChangePixelToBlock(X,Y,LocalCol,LocalRow);

  //如果触发事件的鼠标按键的点在 Image之外的话,则只是改变鼠标按键状态.随即退出
  if (LocalCol < 1 ) or (LocalRow < 1 ) or (LocalCol > UserTotalCols ) or (LocalRow > UserTotalRows )then
  begin
    case Button of
      mbleft :  isLeftBtnDown :=true;
      mbRight : isRightbtnDown :=true;
    end;
    exit;
  end;


  case Button of
    //左键被按下
    mbLeft :
      begin
        //判断右键是否已经被按下了,是则执行左右键一起按下的操作
        if isRightbtnDown = false then
        begin
          isLeftBtnDown :=true;
          ChgSpbtnGlyph(f_O );
          LeftBtnDown(DownGridArray ,UpGridArray ,LocalCol,LocalRow );

        end else
        begin
          isLeftBtnDown :=true;
          isLeftAndRightBtnDown :=true;
          ChgSpbtnGlyph(f_O );
          LeftAndRightBtnDown(DownGridArray ,UpGridArray ,LocalCol ,LocalRow );
        end;
      end;

    //右键被按下
    mbRight:
      begin
        //判断左键是否被按下了,是则执行左右键一起按下的操作
        if isLeftBtnDown = false then
        begin
          isRightbtnDown :=true;
          RightBtnDown(DownGridArray ,UpGridArray ,LocalCol ,LocalRow );

        end else
        begin
          isRightbtnDown :=true;
          isLeftAndRightBtnDown :=true;
          ChgSpbtnGlyph(f_O );
          LeftAndRightBtnDown(DownGridArray ,UpGridArray ,LocalCol ,LocalRow );

        end;
      end;
  end;

  DrawBackGround(UpGridArray ,false);
end;

procedure TFrm_Main.Image_BackGroundMouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  LocalCol,LocalRow:integer;
begin

  if isGameOver or isGamePaused  then
    exit;

  ChangePixelToBlock(X,Y,LocalCol ,LocalRow );

  //在区域之外的情况下,只改变鼠标状态和笑脸,就退出
  if (LocalCol < 1 ) or (LocalRow < 1 ) or (LocalCol > UserTotalCols ) or (LocalRow > UserTotalRows )then
  begin
    ChgSpbtnGlyph(f_smile );
    case Button of
      mbleft :  isLeftBtnDown :=false;
      mbRight : isRightbtnDown :=false;
    end;
    isLeftAndRightBtnDown :=false;
    exit;
  end;

  //当时间是处于停止状态,但是又不是由于暂停所触发的,而此时松开的是左键的时候
  //即是第一次展开方块区域
  if (not Timer_Display.Enabled ) and (not isGamePaused  ) and (button = mbLeft ) then
  begin
    Begin_Time :=GetTickCount;
    TotalTime :=1;
    if isHaveSound then
      sndPlaySound(pchar(comdir+g_ResourceName +g_sound_second),SND_ASYNC );
    DrawHead(TotalTime ,d_right );
    Timer_Display.Enabled:=True;
  end;

  case Button of
    mbLeft:
      begin
        if isFirstClick                                                 //是否是第一次按键
          and (not isLeftAndRightBtnDown )                              //不是左右键一起按下
          and (UpGridArray .grid[LocalCol][LocalRow] <> 31)             //当前方块不是"标有旗帜的方块"
          and (UpGridArray .grid[LocalCol][LocalRow] <> 32)             //当前方块不是"没有被按下的标有问好的方块"
          and (UpGridArray .grid[LocalCol][LocalRow] <> 11) then        //当前方块不是"没有被按下方块"
        begin
          //初始化数组的值
          initGridArray(UserBombCount ,LocalCol ,LocalRow ,DownGridArray ,UpGridArray );
          isFirstClick :=false;
          //游戏状态的设定
          GameStatus :=s_Sweeping;
          ChangeStatusBar(UserLevel ,UserTotalCols,UserTotalRows ,UserBombCount,GameStatus,LocalScore,LanguageType);

          //再设置成 False,以使以后 N1Click事件时的 isGameofRestart 为False;
          isGameofRestart :=false;

          //使’暂停‘按钮可用。
          Menu_Pause_Resume.Enabled :=true;
        end;

        if isRightbtnDown then
        begin
          isLeftBtnDown :=false;
          isLeftAndRightBtnDown :=false;
          ChgSpbtnGlyph(f_smile );
          LeftAndRightBtnUp(DownGridArray ,UpGridArray ,LocalCol ,LocalRow );

        end else
        begin
          isLeftBtnDown :=false;
          ChgSpbtnGlyph(f_smile );
          LeftBtnUp(DownGridArray ,UpGridArray ,LocalCol ,LocalRow );
        end;
      end;

    mbRight :
      begin
        if isLeftBtnDown  then
        begin
          isRightbtnDown :=false;
          isLeftAndRightBtnDown :=false;
          ChgSpbtnGlyph(f_smile );
          LeftAndRightBtnUp(DownGridArray ,UpGridArray ,LocalCol ,LocalRow );
        end else
          isRightbtnDown :=false;
      end;
  end;

  //判断是否取得了游戏的胜利
  if BlockOpenCount = DownGridArray .LocalTotalCols *DownGridArray .LocalTotalRows - UserBombCount then
    GameWin(DownGridArray ,UpGridArray )
  else
    DrawBackGround(UpGridArray ,false);

end;

procedure leftBtnMoveOut(lm_DownGridArray:TGridArray ;var lm_UpGridArray:TGridArray ;lm_Col,lm_row:integer);
begin
  case lm_UpGridArray .Grid [lm_Col][Lm_Row] of
    13 : lm_UpGridArray .Grid [lm_Col][Lm_Row] := 11;
    33 : lm_UpGridArray .Grid [lm_Col][Lm_Row] := 32;
    else exit;
  end;
end;


procedure LeftAndRightBtnMoveOut(lrm_DownGridArray:TGridArray ;var lrm_UpGridArray:TGridArray ;lrm_Col,lrm_row:integer);
var
  lrm_i,lrm_j:integer;
begin
  case lrm_UpGridArray .Grid [lrm_Col ][lrm_Row ] of
    12 : exit;
    13 :

⌨️ 快捷键说明

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