📄 unit_main.pas
字号:
{******************************************************************************
* 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 + -