📄 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 ;
//调用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 + -