程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi掃雷游戲主體控制部分代碼+講解

Delphi掃雷游戲主體控制部分代碼+講解

編輯:Delphi

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved