01_坦克大战案例演示
 * 略
    1. 创建游戏窗体
    2. 绘制地图(阻碍物,坦克)
    3. 坦克可以移动,也可以发射子弹
    4. 碰撞(坦克和阻碍物的碰撞,子弹和阻碍物的碰撞,子弹和子弹碰撞)

02_准备工作之新建工作空间
 * 步骤
     * 1.新建一个工作空间.
     * 2.把工作空间的字符编码改为: UTF-8.
     * 3.对工作空间进行基本设置.
         * 显示行号
         * 更改字体大小.
     * 注意:
         * 坦克大战案例要求大家使用的JDK版本必须是JDK1.8(或更高版本).

03_准备工作之非抽象方法里面可以调用抽象方法

04_坦克大战案例之坦克隐藏到草坪中
 * a. 先绘制坦克,在绘制草坪(扩展性不强,不推荐).  
 * b. 采用Comparator比较器接口的方式, 对集合中的元素按照渲染层级进行排序. 
     * 渲染层级越高,元素的顺序越靠后(Element#getOrder()).
     * 此处用CopyOnWriteArrayList集合实现.

05_坦克大战案例之坦克和砖墙的碰撞检测
 * 步骤

a. MyTank#checkHit(Steel steel); 在该方法中完成功能代码. 
       定义两个成员变量用于记录当前坦克不能移动的方向(badDirection)和碰撞的最小间隙(badSpeed),
       获取铁墙的坐标以及宽高, 同时获取当前坦克的坐标和宽高,
       预判坦克的下一步动作, 然后调用CollisionUtils#isCollisionWithRect();进行碰撞检测, 并用flag记录返回结果,
       判断flag的值, 如果为true,就将当前方向赋值给badDirection,并且根据坦克当前坐标计算 badSpeed的值,
       如果flag的值为false, 说明没碰上, 就重置badDirection和badSpeed的值, 并返回flag的值.
    b. MyTank#move(Direction direction); 在该方法中优化代码
       判断badDirection是否不等于空, 并且badDirection和direction是否相等,
       如果为true,说明撞上了, 就根据坦克方向将当前坦克坐标移动最小间隙, 并提示"不可移动",然后return, 如果为false,说明没撞上,什么都不操作,方法继续往下执行,
       判断传过来的方向和坦克当前方向是否相同,如果不相同,就将传过来的方向赋值给坦克方向,然后return, 如果相同,什么都不操作,方法继续往下执行,
       坦克正常移动代码(根据坦克方向,进行对应的坐标计算, 注意要有坦克坐标的越界处理)
    c. GameWindow#OnDisplayUpdate()中做测试, 嵌套遍历集合, 判断当前遍历到的元素是否分别是: 坦克和铁墙,
       如果是,就调用MyTank#checkHit(Steel steel);校验是否碰撞上, 如果碰撞上就直接break, 否则什么都不操作.

06_坦克大战案例之抽取接口,具有移动功能的事物和具有阻挡功能的事物
 * 步骤

a. 在包com.itheima.game.business中定义两个接口: Moveable, Blockable.
       其中Moveable接口中定义一个方法: public abstract boolean checkHit(Blockable block); 用于校验是否碰撞上.
    b. 让MyTank类实现Moveable接口, 然后将MyTank#checkHit();方法的形参类型从Steel类改为Blockable接口类型(对应方法体的代码修改下即可).
    c. 让Steel类,Wall类,Water类都实现Blockable接口.
    d. 修改下GameWindow#OnDisplayUpdate()方法中关于"移动功能事物和阻挡功能事物碰撞校验"的代码.
       从之前校验MyTank和Steel, 改为校验Moveable和Blockable.

07_坦克大战案例之子弹和铁墙的碰撞检测
 * 步骤

a. 在Bullet#checkAttack(Steel steel);方法中做校验, 获取到铁墙的坐标和宽高以及子弹的坐标和宽高, 然后调用CollisionUtils#isCollisionWithRect()判断是否撞上.
       撞上返回true, 没有撞上返回false.
    b. 在GameWindow#onDisplayUpdate();方法中调用, 循环嵌套遍历list集合, 然后判断当前遍历到的元素是否是子弹和铁墙,
       如果是,就调用Bullet#checkAttack()校验有没有碰上, 没有碰上就什么都不操作.
       如果碰上了, 针对于子弹: 销毁.  针对于铁墙: 给一个响应(调用Steel#showAttack()返回一个爆炸物, 创建爆炸物对象的时候,要播放声音)
       注意: 遗留的三个小Bug(爆炸物的坐标, 爆炸物的绘制次数, 爆炸图片的绘制个数)最后解决.

08_坦克大战案例之抽取接口,具有攻击能力的事物和具有挨打能力的事物
 * 步骤
    a. 在com.itheima.game.business包中创建两个接口: Attackable(攻击能力)和Hitable(阻挡能力).
       其中Attackable接口中定义一个方法: public abstract boolean checkAttack(Hitable hitable); 用于校验攻击事物是否打上挨打事物
       其中Hitable接口中定义一个方法: public abstract Blast showAttack();
    b. 让Bullet类实现Attackable接口, 然后将Bullet#checkAttack();方法的形参类型从Steel类改为Hitable接口类型(对应方法体的代码修改下即可).
    c. 让Steel类,Wall类都实现Hitable接口.
    d. 修改下GameWindow#OnDisplayUpdate()方法中关于"攻击功能事物和挨打功能事物碰撞校验"的代码.
       从之前校验Bullet和Steel, 改为校验Attackable和Hitable.

08_坦克大战案例之优化爆炸物的坐标问题(即: 按顺序逐步解决第15步遗留的三个小Bug)
 * 在Blast类的构造方法中完成代码, 根据挨打事物的坐标和宽高以及爆炸物的宽高, 计算爆炸物的坐标.

09_坦克大战案例之优化爆炸图片的绘制个数
 * 步骤:
     * 在Blast类的构造方法中完成代码, 即: 构造方法加一个参数boolean flag, 
     * 值为true代表挨打状态(绘制一部分爆炸图片即可),
     * 值为false, 代表销毁状态, 绘制所有的爆炸图片即可.

10_坦克大战案例之提取接口, 具有销毁功能的事物
 *步骤
    
    a. 在com.itheima.game.business包中创建一个接口: Destroyable(销毁能力).
       Destroyable接口中定义两个方法: 
        public abstract boolean isDestroy(); 用于校验销毁事物是否 需要销毁
        public abstract Blast showDestroy(); 用于销毁事物销毁时, 返回一个爆炸物对象
    b. 让Bullet类,Blast类,Steel类,Wall类都实现Destroyable接口, 重写接口中的两个方法.
       针对于showDestroy()方法, 类Steel,Wall重写该方法时返回一个爆炸物对象, 类Bullet,Blast重写该方法时, 返回一个null即可.
    d. 修改下GameWindow#OnDisplayUpdate()方法中关于"销毁功能事物 销毁时的"的代码.
       从之前校验Bullet或者Steel, 改为校验Destroyable.

分析:
    敌方坦克和自己的坦克都有挨打的能力和显示爆炸物的能力

坦克大战项目需求文档相关推荐

  1. 智慧果园系统——以水肥一体化系统功能为基础实现智慧果园系统项目 需求文档

    文章目录 一.引言 1.文档的作用 2.文档的标准 3.产品的范围 二.综合描述 1.项目前景 2.项目目标 3.项目功能 4.调研和面谈 A.硬数据采样 a)硬数据分析的形式 b)定量硬数据 c)定 ...

  2. 安卓收银系统小票打印机数据采集插件项目需求文档

    创建时间 2017-12-12 1  引言 1.1项目背景 针对线上消费与线下消费界线逐渐模糊的商业消费现状,我们团队提出"以轻量的方式接入实体商业,采集全面的线下消费数据,建立共享的线下会 ...

  3. 想做个项目练练手却不知道做啥?松哥准备了 50 个热门需求文档给大家!

    之前有好几位小伙伴向松哥反映,学完了微人事项目的技术点之后,想再做个项目练练手,但是却不知道该做啥!不了解业务就无从下手. 其实我理解大家的这种处境,因此,这个周末松哥花了两天时间,整理了 50+ 个 ...

  4. 产品需求文档(PRD)写作(一) 写前准备(信息结构图)

    由于公司需求,我竟然要开始"项目需求文档"之路了,搜罗了半天,发现一系列不错的文章,收录一下,方便自己日后查阅,原文地址. 当我们初次接触产品需求文档时,首先会从网络上寻找产品需求 ...

  5. 社区智能管理平台 需求文档【第一周】

    //本文档为北京理工大学21级软件需求工程课程11组的项目需求文档 a.引言 a.1目的 社区智能消息管理平台是指可以实现居民线上了解社区相关信息.办理社区相关业务功能的平台.在本项目中,该平台使用微 ...

  6. 社区智能管理平台 需求文档【第八周】

    //本文档为北京理工大学21级软件需求工程课程11组的项目需求文档 目录 a.引言 a.1目的 a.2文档约定 a.3预期的读者和阅读建议 a.4产品的范围 a.5参考文献 b.综合描述 b.1产品的 ...

  7. 《重大技术需求征集系统》项目目标文档

    分组:每四人一组 主题:xxx征集系统 成果: 讨论结束后,每组提交一份课堂讨论记录(电子版发表到博客上,纸质版小组成员签名,下节课提交). 每人根据课堂讨论结果提交一份系统利益相关者描述案例.撰写项 ...

  8. 测试项目启动与研读需求文档

    一. 测试团队 1. 测试团队中的角色 业务分析人员 辅助需求分析. 测试组长或测试经理 全面负责项目的测试工作,如协调测试计划.统筹资源.组织测试件的评审.监控 测试的执行等. 测试件(Test w ...

  9. 需求文档不明确,怎么处理?项目很紧急,也会写测试用例吗?

    需求文档不明确,应该怎么处理? 不管哪个公司,大公司还是小公司,一直以来都会有这种问题,也许是互联网行业的特色..其实现在很多互联网公司的这类问题很难解决. 产生需求不明确的情况分析: 1.客户不知道 ...

最新文章

  1. 美团某程序员爆料:绩效背c的都要签pip!网友:pip就是变相劝退!
  2. com关于IUnknown接口
  3. SpringBoot高级-消息-AmqpAdmin管理组件的使用
  4. python购物车实现的功能是什么_Python3实现购物车功能
  5. shiro 跨域登录_六个高Star开源项目,让你更懂OAuth和单点登录
  6. 将网址url中的参数转化为JSON格式的两种方法
  7. socket.io 消息发送
  8. 谁是应用软件商店急需的外援
  9. 海阔天空 在勇敢以后 --我的求职路
  10. 关于git push报hook declined
  11. android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@
  12. activemq学习记录(二)(使用p2p模式和使用发布订阅模式去生产以及消费数据)
  13. 深度学习(一):给你的数据集打标签
  14. 美国大选2020推特相关数据
  15. 搭建Iconic+angular混合APP开发环境
  16. 模拟电路设计的九段境界
  17. 想开水果店但是没有经验,想开水果店没有经验怎么办
  18. win7打开计算机一片空白,win7系统打开本地连接属性一片空白的解决方法
  19. c语言———定积分计算
  20. LPS和RAS坐标系

热门文章

  1. Linux学习-----Chapter eight
  2. python创意爱情代码-python创意内容
  3. Level4_Unit1_娱乐_休闲娱乐的选择
  4. 【计算机原理】负数的二进制
  5. oracle 重做日志内容,修改oracle重做日志文件大小
  6. SpringBoot+Euraka+Zuul实现服务路由的服务
  7. Creator3D:入门一定要会的几种资源加载
  8. 我的创作纪念日 -- 2022年7月25日
  9. GDOI2020 游记
  10. 如何处理好人际关系,思想是第一的。