第三部分请点这里

这里来实现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. Keywords Search (ac 自己主动机)

    Keywords Search Problem Description In the modern time, Search engine came into the life of everybod ...

  2. 齐博软件(地方门户系统) 文件加密破解工具

    原文:齐博软件(地方门户系统) 文件加密破解工具 本程序为针对"齐博软件地方门户系统5.0官方原版"的破解工具,一个垃圾系统居然弄出这么恶心的加密方式,有个鸟用!以后见一个破一个! ...

  3. [转]解决get方法传递URL参数中文乱码问题

    来自:http://www.javaeye.com/topic/483158 应用一:解决tomcat下中文乱码问题(先来个简单的) 在tomcat下,我们通常这样来解决中文乱码问题: 过滤器代码: ...

  4. The tempfile module

    The tempfile module The tempfile module This module allows you to quickly come up with unique names ...

  5. RSD和wlwmanifest是什么

    今天小博发现header.php文件里<?php wp_head(); ?>显示有以下的两句代码,因为小博的网站打开速度实在太慢了,换空间怕麻烦,那就只有优化代码了. <link r ...

  6. poj 2769 Reduced ID Numbers(memset使用技巧)

    Description T. Chur teaches various groups of students at university U. Every U-student has a unique ...

  7. SharePoint 2013的HTML5特性之响应式布局

    今天偶然看到一本书<Pro SharePoint 2013 Branding and Responsive Web Development>,看到SharePoint 2013基于HTML ...

  8. Java LinkedBlockingQueue和ArrayBlockingQueue分析

    LinkedBlockingQueue是一个链表实现的堵塞队列,在链表一头增加元素,假设队列满.就会堵塞.还有一头取出元素.假设队列为空.就会堵塞. LinkedBlockingQueue内部使用Re ...

  9. Hama学习总结

    Hama学习笔记 1.       Hama定义 Hama是基于HDFS上的BSP模型实现,其执行不须要MapReduce. 例证例如以下: 在单点调试的Hama系统上,仅仅执行NameNode.Da ...

  10. 让window命令行支持自己主动补全[相似Linux的Tab键]

    打开注冊表,找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor下 项"CompletionChar"(REG_DWO ...