?? 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);
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
全屏模式
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -