第三部分请点这里

这里来实现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 (四)的更多相关文章

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

    说起来,自学计算机也有2年多的时间了,自己还没有从设计到编码,完完整整的设计一个基于面向对象的软件的经历..囧 于是,就有了这个系列.首先选用的语言是Java,没别的原因,HeadFirst设计模式是 ...

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

    第五部分请看这里 终于到了最后一个部分了! 这里使用SimpleJudge类来实现Judge接口. 首先是SimpleJudge需要的实例变量: 0.final LinkedList<Pilla ...

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

    第四部分请点这里 本文将实现DrawBoard. 如前文所述,Obstacle类和Bing类仅仅提供给DrawBoard必要的信息,如何绘制则完全委托给了DrawBoard,也就是说游戏关键类的细节和 ...

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

    第二部分请点这里 下面首先来实现Bing接口! 实现Bing接口的类取名SimpleBing. 容易发现,SimpleBing类总的来说要向下,但点击一下又得向上,向上到了一定界限又得向下,但我们又只 ...

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

    第一部分请点这里. 续结前文,本文将实现Game类. 首先是实例变量.由上次的类图可以看出,Game类首先得具有如下实例变量: 0.Judge judge;1.SimpleDraw draw; // ...

  6. Qt 利用XML文档,写一个程序集合 四

    接上一篇https://www.cnblogs.com/DreamDog/p/9214067.html 启动外部程序 这里简单了,直接上代码吧 connect(button,&MPushBut ...

  7. 后端开发实践系列之二——领域驱动设计(DDD)编码实践

    Martin Fowler在<企业应用架构模式>一书中写道: I found this(business logic) a curious term because there are f ...

  8. 领域驱动设计(DDD)编码实践

    写在前面 Martin Fowler在<企业应用架构模式>一书中写道: I found this(business logic) a curious term because there ...

  9. 【设计模式系列】之OO面向对象设计七大原则

    1  概述 本章叙述面向向对象设计的七大原则,七大原则分为:单一职责原则.开闭原则.里氏替换原则.依赖倒置原则.接口隔离原则.合成/聚合复用原则.迪米特法则. 2  七大OO面向对象设计 2.1 单一 ...

随机推荐

  1. 冒泡排序 JAVA版

    冒泡排序 算法思想是每次从数组末端开始比较相邻俩元素,把第i小的冒泡到数组的第i个位置.i从0一直到N-1从而完成排序.当然也可以从数组开始端开始比较相邻两元素,把第i大的冒泡到第N-i个位置.I从0 ...

  2. 关于NSArray的几种排序:

    #利用数组的sortedArrayUsingComparator调用 NSComparator  当中NSComparator事实上就是一个返回NSComparisonResult的block. ty ...

  3. CS0433: 类型“BasePage”同一时候存在于“c:\Windows\Microsoft.NETxxxxxxxxxxxxxxxx

    网上常见的我就不说了. 假设其他地址的方法解决不了你的问题,那么请往下看. 该类是否存放于 App_Code 下,假设是把该类从App_Code中拉出来,然后再次执行试试.

  4. nodejs启动守护程序pm2

    nodejs启动守护程序pm2 by 伍雪颖 做了个应用,server放阿里云,只是server总会自己断,后来写了个心跳程序,就是检測应用线程是否还在,不在就再启动, 这种方法好笨重啊,后来发现no ...

  5. 使用Swing实现简易而不简单的文档编辑器

    本文通过Swing来实现文档简易而不简单的文档编辑器,该文档编辑器的功能包括: 设置字体样式:粗体,斜体,下划线,可扩展 设置字体:宋体,黑体,可扩展 设置字号:12,14,18,20,30,40, ...

  6. UML简单介绍

    UML的全称是统一建模语言:Unified Modeling Language. 是用来为面向对象开发系统的产品进行说明可视化和编制文档的方法. 它是一种标准的图形化建模语言,是面向对象分析与设计的一 ...

  7. CMake Intro - CMakeLists.txt

    Notes:  directory structure:  cmake, cmake/Tutorial, cmake/Tutorial/MathLibs 1. File lists in cmake/ ...

  8. ASA基本配置

    拓扑如下: ASA5520# show running-config : Saved:ASA Version 8.0(2) !hostname ASA5520enable password 2KFQn ...

  9. 使用MYCAT作为Mysql HA的中间件(转)

    记得在上一篇文章“Java集群--大型网站是怎样解决多用户高并发访问的”的结尾处本人阐述了数据库的高可用的一种方案----实现主从部署,那么今天,就让我聊聊本人关于数据库的一些所思所想吧! 下面是本人 ...

  10. hdu1254(bfs+dfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1254 分析: 真正移动的是箱子,但是要移动箱子需要满足几个条件. 1.移动方向上没有障碍. 2.箱子后 ...