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、掃雷時的鼠標事件。