纯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;
    }
}

 

好了,此系列告一段落

(完)

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。