格子游戏类型实践(二)

发表于2018-10-15
评论0 2.8k浏览
接上篇格子游戏类型实践(一)框架部分,这篇继续给大家介绍格子游戏类型实践的第二篇,我们总共要写这几种格子类型的游戏,像保卫萝卜类型的塔防,其实我个人倾向于一个经典塔防——矢量塔防,贪吃蛇,扫雷,三消(三消我就不多讲了),格子类型的泡泡龙,赛车,吃豆人,坦克大战等一系列的游戏。这里我就只做了几种,至于没做的大家可以自己去做,因为没那么多时间同时也觉得没必要。

我们现讲扫雷吧,这里我们就只用一个scence来管理这么多个游戏。例如这里我们把数据封装到了miandata里面,对于不同的格子类型的游戏他们的操作方法是不一样,我说的操作是说的对miandata数据操作,同时每个格子类型的游戏玩法也不一样,大家先想想一个scence怎么管理这么多个游戏呢,当然他们肯定是有共同点,当然也有不同点嘛。这里我们的做法是建一个数据操作的基类,和一个玩家操作的基类。

分别如下:
这个是数据操作的基类:
 publicabstractclassBaseAdapter  
{  
  publicvirtualvoidInilizedByJosn()  
  {  
  }  
  publicvirtualvoidUpdateGridArray(ManageOnTypeTetriscurTypeTetris,IUpdateUIupdateUi)  
  {  
  }  
  publicvirtualvoidIntilizedPrefence(BasePlayerbasePlayer,ISetCurTetrissetCurTetris,TransformparentTransform,  
    IPlayAudiClipplayAudiClip)  
  {  
  }  
}  

这个是玩家操作的基类:
publicabstractclassBasePlayer  
{  
  publicabstractvoidOnPlay();  
  publicabstractvoidOnRestart();  
  publicabstractvoidOnFailOver();  
  publicabstractvoidOnWinOver();  
  publicabstractvoidOnAwake();  
  publicabstractvoidIntilizedObj(GameObjecttparent,GameObjectbparent);  
  publicabstractvoidIntilizedPef(BaseAdapterbaseAdapter,ITertrisViewBindbind,IUpdateUIui);  
}  

同时我们在数据操作类主要为玩家操作类服务的。所以主游戏类中我们的写法也挺简单的,如下: 
 privatevoidUpdate()  
  {  
    if(GameState.Playing==_curGameState)  
    {  
      _basePlayer.OnPlay();  
    }  
    elseif(GameState.Restart==_curGameState)  
    {  
       _basePlayer.OnRestart();  
    }  
    elseif(GameState.WinOver==_curGameState)  
    {      
      _basePlayer.OnWinOver();  
    }  
    elseif(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的。理解和敲,然后仔细品味这些东西才是你的。来自:https://blog.csdn.net/u012565990/article/details/51727724

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引