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