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

 

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