格子游戏类型实践—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的。理解和敲,然后仔细品味这些东西才是你的。

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