首页 > 代码库 > 【原创】纯OO:从设计到编码写一个FlappyBird (六)

【原创】纯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;    }}

 

好了,此系列告一段落

(完)

【原创】纯OO:从设计到编码写一个FlappyBird (六)