Delphi掃雷游戲主體控制部分代碼教程,上次是介紹了游戲界面的實現部分(Delphi掃雷主體界面部分代碼),現在來實現對游戲的控制,主要可以分為下面幾個部分:
1、 排布雷區
首先定義三個級別的雷數的常量,然後在這三個數的范圍之內,隨機顯示雷數,並排布在雷區中。
2、 掃雷鼠標事件
在本例中,掃雷的情況有三種:左鍵單擊、右鍵單擊和左右鍵同時按下。在掃雷時,先要判斷是否有雷,然後決定顯示的圖標。
3、 掃雷過程中的其他事件
掃雷過程中的其他事件包括計時器的處理、游戲開始和游戲結束的一些必要設置等。
游戲的主體部分詳細代碼和說明見【編程步驟】部分。由於篇幅有限,完整的代碼可以參考光中的內容。這裡只給出代碼的主要部分。
1.排布雷區:首先設置三個三個全局常量。
const
……
Easy_TotalBombNumber = 10;//設置雷的數目
Middle_TotalBombNumber = 30;
High_TotalBombNumber = 60;
然後,在按下“開始”後完成對雷數的初始化設置。因此,首先構造一個初始化雷數的函數InitBomb,然後再處理“開始”按鈕的OnClick事件。
procedure TMainForm.InitBomb;
var
i ,t ,number:integer;
begin
for i := 0 to 255 do BombArray[i] := 0;
for i := 0 to 255 do BombStatusArray[i] := bsNormal;
i := 0;
randomize;
number:=1; //設置一個大於0的初始值,非常關鍵,否則進入死循環
{根據設置的游戲級別來設置雷的數目 }
If RadioButton1.Checked Then
number:=Easy_TotalBombNumber;
If RadioButton2.Checked Then
number:=Middle_TotalBombNumber;
If RadioButton3.Checked Then
number:=High_TotalBombNumber;
while i<Number do
begin
t := random(256); //隨機雷數
if BombArray[t] = 0 then
begin
BombArray[t] := 1;
i := i+1;
end;
end;
end;
下面是“開始”按鈕的OnClick事件對應的代碼。
procedure TMainForm.StartBtnImageClick(Sender: TObject);
begin
//游戲開始按鈕按下的事件處理
Hour := 0;
Minute := 0;
Second := 0;
//根據設置的游戲級別來設置雷的數目
If RadioButton1.Checked Then
BombNumber :=Easy_TotalBombNumber;
If RadioButton2.Checked Then
BombNumber :=Middle_TotalBombNumber;
If RadioButton3.Checked Then
BombNumber :=High_TotalBombNumber;
Timer.Enabled := FALSE;
bGameOver := FALSE;
bGameRunning := FALSE;
InitBomb;
ShowBomb;
end;
2.掃雷鼠標事件:在下面的這段代碼中,對於不同條件,鼠標擊鍵事件會有不同的結果。鼠標事件包括:OnMouseDown和On MouseUp。
procedure TMainForm.ImageMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var t : integer;
begin
if bGameOver then exit;
if Button = mbLeft then
begin
bLeftBtnDown := TRUE;
ClickNumber := (y div 14)*16+(x div 14);
end
else
if (Button = mbRight) and (bLeftBtnDown = FALSE) then
begin
t := (y div 14)*16+(x div 14);
if BombStatusArray[t] = bsNormal then
begin
BombStatusArray[t]:= bsMaskAsBomb;
BombNumber := BombNumber - 1;
ShowBomb;
end
else if BombStatusArray[t] = bsMaskAsBomb then
begin
BombStatusArray[t]:= bsNormal;
BombNumber := BombNumber + 1;
ShowBomb;
end;
end;
if (Button = mbRight) then bRightBtnDown := TRUE;
end;
procedure TMainForm.ImageMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var t : integer;
begin
if bGameOver then
exit;
if Button = mbLeft then //左鍵按下
begin
if (bLeftBtnDown = TRUE) and (bRightBtnDown = TRUE) then //左右鍵同時按下
begin
t := (y div 14)*16+(x div 14);
CheckIt(t);
end;
bLeftBtnDown := FALSE;
t := (y div 14)*16+(x div 14);
if t = ClickNumber then
begin
Timer.Enabled := TRUE;
bGameRunning := TRUE;
DoTurnOver;
ShowBomb;
end;
end
else
if Button = mbRight then //右鍵按下
begin
if (bLeftBtnDown = TRUE) and (bRightBtnDown = TRUE) then
begin
t := (y div 14)*16+(x div 14);
CheckIt(t);
end;
bRightBtnDown := FALSE;
Timer.Enabled := TRUE;
bGameRunning := TRUE;
end;
ShowBomb;
if YouWin then
begin
PlaySound('SUCCESS', hInstance, SND_RESOURCE or SND_ASYNC);
bGameOver := TRUE;
bGameRunning := FALSE;
Timer.Enabled := FALSE
end
end;
在上面的這段代碼中,用到了幾個自定義的函數,這裡就不一一列舉了。
3.掃雷過程中的其他事件:篇幅的原因,這裡只給出游戲失敗和成功的代碼:
procedure TMainForm.GameOver;
var i : integer;
begin
{掃雷失敗後的一些處理}
for i := 0 to 255 do
begin
if ( i = ClickNumber) then BombStatusArray[i] := bsExploded
else
if (BombArray[i] = 0) and (BombStatusArray[i]=bsMaskAsBomb) then
BombStatusArray[i] := bsWrong
else
if (BombArray[i] = 0) and (BombStatusArray[i]=bsNormal) then
TurnItOver(i)
else
if (BombArray[i] = 1) and (BombStatusArray[i]=bsNormal) then
BombStatusArray[i] := bsShow;
end;
bGameOver := TRUE;
bGameRunning := FALSE;
Timer.Enabled := FALSE;
ShowBomb;
PlaySound('FAILURE', hInstance, SND_RESOURCE or SND_ASYNC);
end;
function TMainForm.YouWin:Boolean;
var i : integer;
begin
{掃雷正確的一些設置}
result := TRUE;
for i := 0 to 255 do
begin
if (BombStatusArray[i] = bsNormal) or (BombStatusArray[i] = bsWrong)
or (BombStatusArray[i] = bsExploded) or (BombStatusArray[i] = bsShow) then
begin
result := FALSE;
exit;
end;
end;
end;
這就是Delphi掃雷游戲主體部分的代碼,可以分為三個模塊來實現。本例有幾個特別值得注意的地方就是:1、設置掃雷的不同級別。2、雷區的排布。3、掃雷時的鼠標事件。