第五部分请看这里

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

这里使用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. STM32 + RT Thread OS 学习笔记[四]

    1.  补注 a)      硬件,打通通讯通道 若学习者购买了学习板,通常可以在学习板提供的示例代码中找到LCD的相关驱动代码,基本上,这里的驱动的所有代码都可以从里面找到. 从上面的示意图可见,M ...

  2. Company Story | Vistaprint

    Company Story | Vistaprint Company Story A Gap in the Small Business Marketplace It’s rare that a hi ...

  3. BAT笔试试题常见试题总结含答案(持续更新。。。)

    (1)试题例如以下: class A { int a; short b; int c; char d; }; class B { double a; short b; int c; char d; } ...

  4. Dark Side of Cloud Storage —— 数据对像的分块消重

    数据对像(可以通俗地认为是文件)的分块存储具有久远的历史.长久以来,单机文件系统一直将文件切分为若干固定大小的小块.其主要目的是为了进行有效的空间管理.互联网时代,大规模数据存储逐步发展起来.出于降低 ...

  5. cocos2D(三)---- 第一cocos2d的程序代码分析

    在第一讲中已经新建了第一个cocos2d程序,执行效果例如以下: 在这讲中我们来分析下里面的代码,了解cocos2d的工作原理,看看屏幕上的这个"Hello World"是怎样显示 ...

  6. linux下查看日志基本命令

    1.cat命令: 功能:1)显示整个文件. 演示样例: $ cat fileName 2)把文件串连接后传到基本输出,如将几个文件合并为一个文件或输出到屏幕. 演示样例: $ cat file1 fi ...

  7. extern int *a与extern int a[]

    extern int *a与int a[] Table of Contents 1. 问题: 2. 解答: 1 问题: 以下的声明取自某个源文件: int a[10]; int *b=a; 但在还有一 ...

  8. Learning Cocos2d-x for WP8(4)——中文显示

    原文:Learning Cocos2d-x for WP8(4)--中文显示 C#(wp7)兄弟篇Learning Cocos2d-x for XNA(4)——中文显示 Cocos2d-x中文显示,似 ...

  9. sharepoint 2013 userprofile 用户信息

    Sharepoint2013获得当前用户userfrofile 基本介绍: 什么使用户配置文件. 用户属性和用户配置文件属性提供有关 SharePoint 用户的信息,如显示名称.电子邮件.标题以及其 ...

  10. ok6410 u-boot-2012.04.01移植七完善u-boot移植(u-boot移植结束)

    继ok6410 u-boot-2012.04.01移植六后,开发板已支持MLC NAND.DM9000等.但还需要完善比如环境变量.mtdpart分区.裁剪.制作补丁等.下面的工作就是完善移植的u-b ...