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

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

第三部分请点这里

 

这里来实现Obstacle类。其实flappybird的本质就是小鸟原地掉,然后几根柱子在走。这也是在Game类里,用obs.move()来实现游戏逻辑的原因。

我们首先必须确定几个数据。

0、柱子之间的间隙

1、柱子的最小值和最大值

2、柱子之间的间距

3、柱子的宽度

 

在屏幕高度确定的情况下,只要我们确定了上半部分的柱子的高度,那么根据间隙,就能画出两个柱子。(tip:做个减法而已)

因此,一个障碍需要两个数据来标示:

0、x值

1、高度

而move的实现,就是x的递减。

 

还需要实现一个重要的功能,就是 柱子的添加和删除。我们必须要决定,何时删除一个既有的柱子,并且何时添加一个新的柱子。

但是在那以前,我们必须要决定使用什么数据结构来储存柱子。

容易发现,柱子的动态添加和删除有先进先出的性质,那么自然就是实现了Queue接口的LinkedList了。

 

那么我们何时添加一个柱子?

答:当最后一个柱子,和最右距离差一个柱子间间隙的时候。

 

何时删除一个柱子:

答:当第一个柱子的x值加宽度小于0时。

 

注意:Judge类需要和Obstacle公用LinkedList,要不然没法算分。。这个耦合度还得在下一次重构中好好想想怎么解决。。

 

Obstacle类的全部代码:

import javax.swing.*;import java.util.LinkedList;import java.awt.*;import java.awt.event.*;public interface Obstacle {    public void move();    public LinkedList<Pillar> getObstacles();}class SimpleObstacle implements Obstacle {    private static final int SPEED = 2;    public LinkedList<Pillar> pillar = new LinkedList<Pillar> ();    int border;        SimpleObstacle(int border)    {        this.border = border;        init();    }        private static int getRandomHeight()    {        int res = (int)(Math.random() * (Pillar.getHeiLmt() - 100) + 100);        return res;    }        private void init()    {        pillar.add(new Pillar(this.border,getRandomHeight()));    }        public LinkedList<Pillar> getObstacles()    {        return pillar;    }        public void move()    {        boolean del = false;        for (Pillar p : pillar)        {            p.setX(p.getX() - SPEED);            if (p.getX() + Pillar.getWidLmt() <= 0)                del = true;        }        if (del)            pillar.remove();        Pillar tmp = pillar.getLast();        if (tmp.getX() + Pillar.getWidLmt() + Pillar.getWidGap() <= border)            pillar.add(new Pillar(this.border,getRandomHeight()));    }}class Pillar {    int height;    int x;    private static final int WIDGAP = 200;    private static final int HEIGAP = 150;    private static final int WIDLMT = 100;    private static final int HEILMT = 300;    Pillar(int x,int height)    {        this.x = x;        this.height = height;    }        public void setX(int x)    {        this.x = x;    }        public int getX()    {        return x;    }        public int getHeight()    {        return height;    }        public static int getWidGap()    {        return WIDGAP;    }        public static int getHeiGap()    {        return HEIGAP;    }        public static int getWidLmt()    {        return WIDLMT;    }        public static int getHeiLmt()    {        return HEILMT;    }}

 

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