?? unit_main.pas
字號:
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 ;
//調(diào)用unit_Hero 中的取得記錄分?jǐn)?shù)的函數(shù)。得到當(dāng)前級別下的記錄(不包括 ‘自定義’)
unit_Hero.GetScore(UserLevel ,LocalScore );
//定義地層 的結(jié)構(gòu)
DownGridArray .LocalTotalCols :=UserCols ;
DownGridArray .LocalTotalRows :=UserRows ;
UserBombCount :=UserBombs ;
//
checkArr(DownGridArray,UpGridArray,UserBombCount );
//
UserTotalCols :=DownGridArray .LocalTotalCols ;
UserTotalRows :=DownGridArray .LocalTotalRows ;
//調(diào)用改變菜單的函數(shù) 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 ;
//各個(gè)菜單項(xiàng)的狀態(tài)
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);
//顯示層的兩個(gè)數(shù)組的賦值.
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
//根據(jù)傳進(jìn)來的 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
//如果注冊表里還沒有信息,則向注冊表里添加初始的值
//游戲信息的相關(guān)鍵值
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;
//英雄榜的相關(guān)鍵值
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函數(shù)時(shí)就需要將其(TImage) 的父控件的 DoubleBufered 設(shè)置為 True;
//這樣才能確保圖片區(qū)域不抖動(dòng).
Panel_top.DoubleBuffered :=true;
Panel_bottom.DoubleBuffered :=true;
//開始的第一局不是重新開局的雷區(qū).
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
//采用判斷當(dāng)前鼠標(biāo)按鍵情況的方法確認(rèn)鼠標(biāo)的按鍵
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;
//左右鍵是否同時(shí)按下
if keystate[vk_lbutton] and keystate[vk_rbutton] and $80 <> 0 then
isLeftAndRightBtnDown :=true
else
isLeftAndRightBtnDown :=false;
if isGameOver or isGamePaused then
exit;
//轉(zhuǎn)換鼠標(biāo)的點(diǎn)擊 X Y 成方塊號
ChangePixelToBlock(X,Y,LocalCol,LocalRow);
//如果觸發(fā)事件的鼠標(biāo)按鍵的點(diǎn)在 Image之外的話,則只是改變鼠標(biāo)按鍵狀態(tài).隨即退出
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
//判斷右鍵是否已經(jīng)被按下了,是則執(zhí)行左右鍵一起按下的操作
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
//判斷左鍵是否被按下了,是則執(zhí)行左右鍵一起按下的操作
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 );
//在區(qū)域之外的情況下,只改變鼠標(biāo)狀態(tài)和笑臉,就退出
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;
//當(dāng)時(shí)間是處于停止?fàn)顟B(tài),但是又不是由于暫停所觸發(fā)的,而此時(shí)松開的是左鍵的時(shí)候
//即是第一次展開方塊區(qū)域
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) //當(dāng)前方塊不是"標(biāo)有旗幟的方塊"
and (UpGridArray .grid[LocalCol][LocalRow] <> 32) //當(dāng)前方塊不是"沒有被按下的標(biāo)有問好的方塊"
and (UpGridArray .grid[LocalCol][LocalRow] <> 11) then //當(dāng)前方塊不是"沒有被按下方塊"
begin
//初始化數(shù)組的值
initGridArray(UserBombCount ,LocalCol ,LocalRow ,DownGridArray ,UpGridArray );
isFirstClick :=false;
//游戲狀態(tài)的設(shè)定
GameStatus :=s_Sweeping;
ChangeStatusBar(UserLevel ,UserTotalCols,UserTotalRows ,UserBombCount,GameStatus,LocalScore,LanguageType);
//再設(shè)置成 False,以使以后 N1Click事件時(shí)的 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 :
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -