第五部分请看这里

终于到了最后一个部分了!

这里使用SimpleJudge类来实现Judge接口。

首先是SimpleJudge需要的实例变量:

0、final LinkedList<Pillar> tmp; // 记录Obstacle返回的柱子列表
1、Pillar now; // 标记当前柱子
2、private int bottom; // 标记底部

SimpleJudge有一个比较重要的方法,就是isGameOver(Bing bing,Obstacle obs),该方法返回0时,游戏结束;返回1时,游戏继续;返回2时,继续的同时加个分。

下面分别讨论各种情况。

游戏结束:

0、小鸟(滨)碰到底部。

1、小鸟(滨)碰到柱子。

游戏加分:

0、刚刚通过【当前】柱子(当前柱子这个概念比较重要,一会说。)

游戏继续:

0、以外的其他情况

现在重点讲一下【当前】柱子这个概念。

所谓当前柱子,就是指或者正在过的、或者将要第一个过的柱子。哎呀,这么说比较拗口,举个例子吧。比如游戏刚开始时第一个柱子就是当前柱子,过完了以后第二个柱子就成为当前柱子了。

本来的想法是打算用迭代器,结果动态修改容器的话Java的迭代器会扔Exception,DAMN。。教练我要换Python!

这样只能退而求其次,使用一个now变量标记当前柱子,当通过当前柱子后,遍历LinkedList,返回第一个x值比Bing大的柱子作为新的当前柱子,同时加分。

这样也使得SimpleJudge类和SimpleObstacle类之间的耦合度大大增加。。这里的设计不是非常满意,但又没有别的方案,留着整改吧。

具体如何判断死活,可以参考源代码了。

SimpleJudge的全部代码:

import java.util.*;

interface Judge {
public int isGameOver(Bing fang,Obstacle obs);
} class SimpleJudge implements Judge { final LinkedList<Pillar> tmp;
Pillar now;
private int bottom; SimpleJudge(Bing fang,Obstacle obs)
{
tmp = obs.getObstacles();
this.bottom = 600 - fang.getHeight();
now = tmp.peek();
} public int isGameOver(Bing fang,Obstacle obs) // 0表示死,1表示活,2表示得分
{
if (fang.getY() + fang.getHeight() >= bottom) // 碰到底部
return 0;
if (now.getWidLmt() + now.getX() <= fang.getX()) // 刚好得分
{
for (Pillar p : tmp)
{
if (p.getX() > fang.getX())
{
now = p;
break;
}
}
return 2;
}
if (fang.getX() < now.getX()) // 没死也没得分
return 1;
if (fang.getY() > now.getHeight() && fang.getY() + fang.getHeight() < now.getHeight() + now.getHeiGap()) // 碰到柱子而死
return 1;
else
return 0;
}
}

好了,此系列告一段落

(完)

【原创】纯OO:从设计到编码写一个FlappyBird (六)的更多相关文章

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

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

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

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

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

    第三部分请点这里 这里来实现Obstacle类.其实flappybird的本质就是小鸟原地掉,然后几根柱子在走.这也是在Game类里,用obs.move()来实现游戏逻辑的原因. 我们首先必须确定几个 ...

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

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

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

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

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

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

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

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

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

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

  9. 是否有必要学习使用纯Verilog写一个SDRAM控制器

    在做这个SDRAM控制器之前,博主有一个疑问,对于学生来说,是否有必要学习用纯Verilog写一个SDRAM控制器?因为目前X家和A家都有了DDR IP Core,对于要实现一个应用可以直接调用IP ...

随机推荐

  1. schedule()函数的调用时机(周期性调度)

    今天纠正了一个由来已久的认识错误:一个进程的时间片用完之后,当再次发生时钟中断时内核会调用schedule()来进行调度,把当前的进程上下文切出CPU,并把选定的下一个进程切换进来运行.我一直以为sc ...

  2. Python基础 - 内建函数

    什么是内建函数 在Python的手册中,名叫build-in Functions,中文可以称为内建函数. 内建函数就像dos系统的内部命令,他不依赖于外部模块,也就是说: 内建函数就是:安装好Pyth ...

  3. MATLAB——scatter的简单应用

    scatter可用于描绘散点图. 1.scatter(X,Y) X和Y是数据向量,以X中数据为横坐标,以Y中数据位纵坐标描绘散点图,点的形状默认使用圈. 样例: X = [1:10];  Y = X ...

  4. linux使用进阶(一)

    本文依据<应该知道的Linux技巧>coolshell上的一篇文章提到的Linux技巧,结合自己掌握的情况进行扩展和总结得来.主要包含下面内容:     一.日常操作     二.数据处理 ...

  5. oracle 通过查询灵活插入数据 insert into ...select..

    insert into reg_user (id,name,password,area_code,reg_time,first_pswd,record_type) select l.reg_user_ ...

  6. Android推断程序前后台状态

    public class AppStatusService extends Service { private static final String TAG = "AppStatusSer ...

  7. MyEclipse导入主题文件epf后xml及jsp等页面中点击标签之后显示灰白

    MyEclipse导入主题文件epf后xml及jsp等页面中点击标签之后显示灰白,症状例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVVAxOT ...

  8. Android基于发展Service音乐播放器

    这是一个基于Service组件的音乐播放器,程序的音乐将会由后台的Service组件负责播放,当后台的播放状态改变时,程序将会通过发送广播通知前台Activity更新界面:当用户单击前台Activit ...

  9. MFC中模态对话框和非模态对话框的差别

    在MFC中有模态对话框和非模态对话框,那这两种有什么差别呢. 又都是用于什么场合呢. 首先,要弄清楚2种对话框是怎样创建的. 然后要弄清楚2种对话框有什么差别,可能从表面上看,模态会堵塞主对话框.可原 ...

  10. c++多态的案例分析

    近期在研究c++中多态的应用 ,当中遇到些许的疑问与问题,可是终于的结果是不容置疑的,以下记录下我的学习过程,以纪念本个知识点. 首先,是从一个案例開始的,题目大意是这种: 设定一个多边形的公共类,然 ...