【原创】纯OO:从设计到编码写一个FlappyBird (六)
第五部分请看这里
终于到了最后一个部分了!
这里使用SimpleJudge类来实现Judge接口。
首先是SimpleJudge需要的实例变量:
0、final LinkedList<Pillar> tmp; // 记录Obstacle返回的柱子列表
1、Pillar now; // 标记当前柱子
2、private int bottom; // 标记底部
SimpleJudge有一个比较重要的方法,就是isGameOver(Bing bing,Obstacle obs),该方法返回0时,游戏结束;返回1时,游戏继续;返回2时,继续的同时加个分。
下面分别讨论各种情况。
游戏结束:
0、小鸟(滨)碰到底部。
1、小鸟(滨)碰到柱子。
游戏加分:
0、刚刚通过【当前】柱子(当前柱子这个概念比较重要,一会说。)
游戏继续:
0、以外的其他情况
现在重点讲一下【当前】柱子这个概念。
所谓当前柱子,就是指或者正在过的、或者将要第一个过的柱子。哎呀,这么说比较拗口,举个例子吧。比如游戏刚开始时第一个柱子就是当前柱子,过完了以后第二个柱子就成为当前柱子了。
本来的想法是打算用迭代器,结果动态修改容器的话Java的迭代器会扔Exception,DAMN。。教练我要换Python!
这样只能退而求其次,使用一个now变量标记当前柱子,当通过当前柱子后,遍历LinkedList,返回第一个x值比Bing大的柱子作为新的当前柱子,同时加分。
这样也使得SimpleJudge类和SimpleObstacle类之间的耦合度大大增加。。这里的设计不是非常满意,但又没有别的方案,留着整改吧。
具体如何判断死活,可以参考源代码了。
SimpleJudge的全部代码:
import java.util.*; interface Judge { public int isGameOver(Bing fang,Obstacle obs); } class SimpleJudge implements Judge { final LinkedList<Pillar> tmp; Pillar now; private int bottom; SimpleJudge(Bing fang,Obstacle obs) { tmp = obs.getObstacles(); this.bottom = 600 - fang.getHeight(); now = tmp.peek(); } public int isGameOver(Bing fang,Obstacle obs) // 0表示死,1表示活,2表示得分 { if (fang.getY() + fang.getHeight() >= bottom) // 碰到底部 return 0; if (now.getWidLmt() + now.getX() <= fang.getX()) // 刚好得分 { for (Pillar p : tmp) { if (p.getX() > fang.getX()) { now = p; break; } } return 2; } if (fang.getX() < now.getX()) // 没死也没得分 return 1; if (fang.getY() > now.getHeight() && fang.getY() + fang.getHeight() < now.getHeight() + now.getHeiGap()) // 碰到柱子而死 return 1; else return 0; } }
好了,此系列告一段落
(完)
posted on 2014-11-07 22:31 shadowmydx'sLab 阅读(417) 评论(0) 编辑 收藏 举报