格子游戲類型實踐—2

      我們總共要寫這幾種格子類型的遊戲,像保衛蘿蔔類型的塔防,其實我個人傾向於一個經典塔防——矢量塔防,貪吃蛇,掃雷,三消(三消我就不多講了),格子類型的泡泡龍,賽車,吃豆人,坦克大戰等一系列的遊戲。這裏我就只做了幾種,至於沒做的大家可以自己去做,因爲沒那麼多時間同時也覺得沒必要。

    我們現講掃雷吧,這裏我們就只用一個scence來管理這麼多個遊戲。例如這裏我們把數據封裝到了miandata裏面,對於不同的格子類型的遊戲他們的操作方法是不一樣,我說的操作是說的對miandata數據操作,同時每個格子類型的遊戲玩法也不一樣,大家先想想一個scence怎麼管理這麼多個遊戲呢,當然他們肯定是有共同點,當然也有不同點嘛。這裏我們的做法是建一個數據操作的基類,和一個玩家操作的基類。

  分別如下:

這個是數據操作的基類:

 public abstract class BaseAdapter
{
    public virtual void InilizedByJosn()
    {
        
    }
    public virtual void UpdateGridArray(ManageOnTypeTetris curTypeTetris, IUpdateUI updateUi)
    {
        
    }
    public virtual void IntilizedPrefence(BasePlayer basePlayer, ISetCurTetris setCurTetris, Transform parentTransform,
        IPlayAudiClip playAudiClip)
    {
        
    }
}

這個是玩家操作的基類:

public abstract class BasePlayer
{
    public abstract void OnPlay();
    public abstract void OnRestart();
    public abstract void OnFailOver();
    public abstract void OnWinOver();
    public abstract void OnAwake();
    public abstract void IntilizedObj(GameObject tparent, GameObject bparent);
    public abstract void IntilizedPef(BaseAdapter baseAdapter, ITertrisViewBind bind, IUpdateUI ui);
}

同時我們在數據操作類主要爲玩家操作類服務的。所以主遊戲類中我們的寫法也挺簡單的,如下:

 private void Update()
    {
        if (GameState.Playing == _curGameState)
        {
            _basePlayer.OnPlay();
        }
        else if (GameState.Restart == _curGameState)
        {
            _basePlayer.OnRestart();
           
        }
        else if (GameState.WinOver == _curGameState)
        {      
            _basePlayer.OnWinOver();
        }
        else if (GameState.FailOver == _curGameState)
        {         
            _basePlayer.OnFailOver();
        }
    }

   這裏這麼多if else寫的不是很好,如果可能的話換成有限狀態機,如果我有時間的話 和大家講講有限狀態機(有限狀態機並不是大家說的 簡單的if else作用)

還有初始化的時候,對其進行初始化,如果我們這裏做掃雷的那麼我們就要開始新建2個類,一個MineAdapter類和一個 MinePlayer類,他們分別繼承BaseAdapter和BasePlayer。

首先我們先把整個雷 和數字生成出來吧,我把這個方法寫在MineAdapter類中,這裏必須放到這裏,這個類要和maindata發生交互,所以寫在這裏比較合適。這裏的格子我採用的大下是12*22格子。這個遊戲分爲3個等級,分別爲簡單,適中  困難。不同等級只是代表初始化雷的個數不同。這個生成雷的代碼就很簡單,然後根據雷生成相應的數字,例如我們掃描[0,0]的時候,先訪問8個方向格子中是否有雷,統計雷的個數,格局雷的個數來填寫相應的數字。是不是很簡單啊,接下來講講如何MinePlayer中的操作。當我們鼠標按下(或者觸屏的時候)我們通過鼠標的位置計算出我們點到格子中格子所在的行數和列數。假如求得行數爲a,列數爲b,我們首先要判斷這個格子中是否有雷

_mainData.AllInts[point.X,point.Y]=1表示有雷 否則就沒有。當我們點擊當前位置的時候,首先判斷上面是不是有標誌旗子,如果有旗子的話 我們單擊是沒有用,我們可以重新標誌數組來標記旗子的情況。如果不是旗子,判斷有沒有雷 如果有雷就直接遊戲結束,如果沒有雷 並且啥也沒有的話 我們遞歸找周圍的沒有雷知道有數字就結束遞歸。思路其實不用講大家也明白,思路其實是根據你的需求來的嘛 ,這個遊戲要這樣玩你就這樣去設計你的代碼。對於後面的遊戲我只會說思路,大家可以根據思路大家自己去寫,具體的代碼我們給大家link的。理解和敲,然後仔細品味這些東西纔是你的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章