【原创】纯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 (四)的更多相关文章
- 【原创】纯OO:从设计到编码写一个FlappyBird (一)
说起来,自学计算机也有2年多的时间了,自己还没有从设计到编码,完完整整的设计一个基于面向对象的软件的经历..囧 于是,就有了这个系列.首先选用的语言是Java,没别的原因,HeadFirst设计模式是 ...
- 【原创】纯OO:从设计到编码写一个FlappyBird (六)
第五部分请看这里 终于到了最后一个部分了! 这里使用SimpleJudge类来实现Judge接口. 首先是SimpleJudge需要的实例变量: 0.final LinkedList<Pilla ...
- 【原创】纯OO:从设计到编码写一个FlappyBird (五)
第四部分请点这里 本文将实现DrawBoard. 如前文所述,Obstacle类和Bing类仅仅提供给DrawBoard必要的信息,如何绘制则完全委托给了DrawBoard,也就是说游戏关键类的细节和 ...
- 【原创】纯OO:从设计到编码写一个FlappyBird (三)
第二部分请点这里 下面首先来实现Bing接口! 实现Bing接口的类取名SimpleBing. 容易发现,SimpleBing类总的来说要向下,但点击一下又得向上,向上到了一定界限又得向下,但我们又只 ...
- 【原创】纯OO:从设计到编码写一个FlappyBird (二)
第一部分请点这里. 续结前文,本文将实现Game类. 首先是实例变量.由上次的类图可以看出,Game类首先得具有如下实例变量: 0.Judge judge;1.SimpleDraw draw; // ...
- Qt 利用XML文档,写一个程序集合 四
接上一篇https://www.cnblogs.com/DreamDog/p/9214067.html 启动外部程序 这里简单了,直接上代码吧 connect(button,&MPushBut ...
- 后端开发实践系列之二——领域驱动设计(DDD)编码实践
Martin Fowler在<企业应用架构模式>一书中写道: I found this(business logic) a curious term because there are f ...
- 领域驱动设计(DDD)编码实践
写在前面 Martin Fowler在<企业应用架构模式>一书中写道: I found this(business logic) a curious term because there ...
- 【设计模式系列】之OO面向对象设计七大原则
1 概述 本章叙述面向向对象设计的七大原则,七大原则分为:单一职责原则.开闭原则.里氏替换原则.依赖倒置原则.接口隔离原则.合成/聚合复用原则.迪米特法则. 2 七大OO面向对象设计 2.1 单一 ...
随机推荐
- win7+vs2008+opencv
1.下载安装VS2008,然后直接下载opencv的windows的安装版, 2.把opencv解压出来,我的路径为:D:\Program\opencv 3.配置PATH:电脑--属性--高级系统设置 ...
- [IDEs]Eclipse自动格式化代码
格式化代码快捷键:Ctrl + Shift + F 一般情况: 1).Ctrl + A 2).Ctrl + Shift + F ps: 格式化之后发现代码换行了,因为已经达到最大长度,可修改设置,增加 ...
- 一个发送邮件的C++库–jwsmtp
接收邮件的,暂时没搞定,不过在SF上找到了这个发送邮件的库文件.它提供了一个比较完整的类,可以简单的调用发送邮件.下面是作者提供的一个例子,不过由于连SMTP发邮件需要密码,所以代码我改了一下.// ...
- hdu 4963(中途相遇法)
题目链接:Dividing a String 题意:给定一个2*n(n<=20)的字符串及每个位置的字符包含的权重,求将该字符串分成两个子序列S1.T1,要求S1=T1且abs(weight1- ...
- Mod in math
An Introduction to Modular Math When we divide two integers we will have an equation that looks like ...
- 【Java&Android开源库代码剖析】のAndroid-Universal-Image-Loader-part1
做Android app开发的同学应该都听说过或者用过nostra13的Android-Universal-Image-Loader开源库,它在图片异步加载.缓存和显示等方面提供了强大灵活的框架.之前 ...
- MSF连环攻击实验
MSF连续攻击实验 一.实验拓扑 二.实验环境 Windows XP BT 5 32位 三.实验原理 通过扫描 XP主机,利用扫描出的漏洞建立 TCP会话,通过进程的提权,进一步获取目标机的控制权限 ...
- hdu1881(贪心+dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1881 分析:按照结束时间从小到大排序,然后以每个结束点为容量进行01背包,选入的必定符合条件的. 因为 ...
- GEF的MVC体系结构
摘要: 本文首先介绍了标准的 MVC 体系构架,同时也介绍了最常见的一类 MVC 模式的变种.之后,文章重点介绍了 MVC 结构在 gef 框架中的体现与应用,以及 gef 是如何综合利用工厂模式.命 ...
- SetCookies, cookie规范注册表和cookie存储将会优先于设置在HTTP客户端级别中默认的那些
遇到下面问题解决方法: Hey? 404 抱歉,你输入的网址可能不正确,或者该网页不存在. 7 秒后返回首页 使用独立的本地执行上下文来实现对每个用户(或每个线程)状态的管理. 定义在本地内容中的co ...