Java面向对象 项目 飞机大战 Shoot

2023-11-20 16:40

本文主要是介绍Java面向对象 项目 飞机大战 Shoot,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

飞机大战 Shoot
最终版 Shoot


第一天 MeShoot

Shoot射击游戏第一天:
1.创建了6个对象类,创建World类测试

射击游戏需求:
1.所参与的角色:英雄机、子弹、小敌机、大敌机、小蜜蜂、天空
2.角色间的关系:
 1)英雄机发射子弹(单倍火力、双倍火力----发射一次双倍火力则火力值减2)
 2)子弹射击敌人(小敌机、大敌机、小蜜蜂),若击中了:
  2.1)子弹消失、敌人先爆破再消失
  2.2)若击中的是小敌机,则玩家得1分
    若击中的是大敌机,则玩家得3分
    若击中的是小蜜蜂,则英雄机得奖励(1条命或40火力值)
 3)敌人(小敌机、大敌机、小蜜蜂)撞英雄机,若撞上了:
  3.1)敌人先爆破再消失
  3.2)英雄机减1条命(命数为0时游戏结束),同时火力值归零
 4)英雄机、子弹、小敌机、大敌机、小蜜蜂都在天空上飞
 5)项目状态:启动、运行、暂停、游戏结束

设计射击游戏中的对象类:
1)先找对象:英雄机、小敌机、大敌机、小蜜蜂、子弹、天空
2)抽类:Hero、Airplane、BigAirplane、Bee、Bullet、Sky
3)设计类中的成员变量 和 方法
4)创建对象并测试

设计类中的成员变量和方法:
class Hero{ //英雄机
 int 宽、高、x、y、命、火力值;
 void step(){ //英雄机移动
   (启动状态下 英雄机两张图片的切换)
 }
 void moveTo(int x,int y){
   英雄机随着鼠标动
 }
}

class Airplane{
}
class BigAirplane{
}
class Bee{
}
class Bullet{
}
class Sky{
}

在这里插入图片描述


第二天 MeShoot

Shoot射击游戏第二天:
1.给6个类添加构造方法,并测试


第三天 MeShoot

Shoot射击游戏第三天:
1.设计小敌机数组、大敌机数组、小蜜蜂数组、子弹数组,并测试
2.设计FlyingObject超类,6个类继承超类
3.给FlyingObject设计了两个构造方法,6个派生类分别调用


第四天 MeShoot

Shoot射击游戏第四天:
1.将小敌机数组、大敌机数组、小蜜蜂数组统一组合为FlyingObject数组,并测试
2.在6个类中重写step()移动
3.画窗口:World类中-----4步(Ctrl C/V)
 1)import JFrame+JPanel
 2)设置World类继承JPanel
 3)main中代码Ctrl C/V
 4)将frame.setSize()的参数修改为400,700


第五天 MeShoot

Shoot射击游戏第五天:
1.给类中成员添加访问控制修饰符
2.设计Images图片工具类


第六天 MeShoot

Shoot射击游戏第六天:
1.将窗口的宽和高设计为常量,适当地方做修改
2.画对象:
 1)想画对象,需要获取对象的图片,每个对象都得获取图片,
   意味着获取图片行为为共有的行为,所以设计在FlyingObject超类中,
   每个对象获取图片的行为都是不一样的,所以设计为抽象方法
   ----在FlyingObject中设计抽象方法getImage()来获取对象的图片

 2)获取图片时,需要考虑对象的状态,因为在不同的状态下获取的图片是不同的,
  每个对象都有状态,意味着状态属性为共有属性,所以设计在FlyingObject超类中,
  状态一般设计为常量,同时设计state变量来表示当前状态
  ----在FlyingObject中设计LIVE、DEAD、REMOVE状态常量,state变量表示当前状态

  状态有了,还需要去判断状态,每个对象都得判断状态,
  意味着判断状态行为为共有行为,所以设计在FlyingObject超类中,
  每个对象判断状态的行为都是一样的,所以设计为普通方法
  ----在FlyingObject中设计isLive()、isDead()、isRemove()来判断状态

 3)重写getImage()获取图片:
   3.1)天空Sky,直接返回sky图片即可
   3.2)英雄机Hero,返回heros[0]和heros[1]的来回切换
   3.3)子弹Bullet:
     3.3.1)若活着的,直接返回bullet图片即可
     3.3.2)若死了的,直接删除(不返回图片)
   3.4)小敌机Airplane:
     3.4.1)若活着的,直接返回airs[0]图片即可
     3.4.2)若死了的,依次返回airs[1]到airs[4]爆破图片,4后删除(不返回图片)
   3.5)大敌机BigAirplane:
     3.5.1)若活着的,直接返回bairs[0]图片即可
     3.5.2)若死了的,依次返回bairs[1]到bairs[4]爆破图片,4后删除(不返回图片)
   3.6)小蜜蜂Bee:
     3.6.1)若活着的,直接返回bees[0]图片即可
     3.6.2)若死了的,依次返回bees[1]到bees[4]爆破图片,4后删除(不返回图片)

 4)在World类中,重写paint()画方法


第七天 MeShoot

Shoot射击游戏第七天:
1.敌人入场:

 1)敌人是由窗口产生的,所以在World类中设计nextOne()生成敌人对象
 2)敌人入场为定时发生的,所以在run()中调用enterAction()实现敌人入场

在enterAction()中:
 每400毫秒,获取敌人对象obj,enemies扩容,将obj装到最后一个元素上

2.子弹入场:

 1)子弹是由英雄机发射出来的,所以在Hero类中设计shoot()生成子弹对象
 2)子弹入场为定时发生的,所以在run()中调用shootAction()实现子弹入场

在shootAction()中:
 每300毫秒,获取子弹数组对象bs,bullets扩容,将bs追加到bullets的末尾

做功能的步骤:
1)先写行为/方法:
 1.1)若为某对象所特有的行为,则将方法设计在特定的类中
 1.2)若为所有对象所共有的行为,则将方法设计在超类中
2)窗口调用:
 2.1)若为定时发生的,则在定时器中调用
 2.2)若为事件触发的,则在侦听器中调用------明天上午第2节课讲

项目功能:

  1. 敌人入场:
    敌人是由窗口产生的,所以将创建敌人方法设计在World窗口类中
  2. 子弹入场:
    子弹是由英雄机发射出来的,所以将创建子弹方法设计在Hero英雄机类中
  3. 飞行物移动:
    飞行物移动为所有飞行物共有的行为,所以将飞行物移动设计在FlyingObject超类中

如下操作都是自动发生的:
1.敌人入场 2.子弹入场 3.飞行物移动 4.子弹打敌人 5.敌人和英雄机撞

实现自动发生常见的办法有两种:
1)定时器--------java做好的一个小零件
2)线程----------API时讲 (以毫秒为单位)

	timer.schedule( new TimerTask(){public void run(){ //定时干的事(每10毫秒走一次) } }, 10, 10); //定时计划表class Aoo extends TimerTask{ //定时任务 }第1个10:从程序启动开始到第1次触发的时间间隔 第2个10:从第1次触发到第2次触发的时间间隔 从第2次触发到第3次触发的时间间隔 从第3次触发到第4次触发的时间间隔 ......

第八天 MeShoot

Shoot射击游戏第八天:
1.飞行物移动:
 1)飞行物移动为对象所共有的行为,所以在FlyingObject中设计抽象step()方法,实现飞行物移动,派生类重写
 2)飞行物移动为定时发生的,所以在run()中调用stepAction()实现飞行物移动
在stepAction()中:
  天空动,遍历敌人敌人动,遍历子弹子弹动
2.英雄机移动(随着鼠标移动):
 1)英雄机移动为英雄机的行为,所以在Hero类中设计moveTo()实现英雄机移动
 2)英雄机移动为事件触发的,所以在侦听器中重写mouseMoved()鼠标移动事件
  在mouseMoved()中: -----------侦听器不要求掌握
  获取鼠标的x和y坐标,英雄机动
3.删除越界的敌人和子弹:
 1)在FlyingObject中设计isOutOfBounds()检测敌人是否越界
  在Bullet中重写isOutOfBounds()检测子弹是否越界
 2)删除越界的敌人和子弹是定时发生的,所以在run()中调用outOfBoundsAction()实现删除越界敌人和子弹

在outOfBoundsAction()中:
 遍历敌人数组,判断若敌人越界了,
 ----则将越界敌人替换为最后一个敌人,缩容
 遍历子弹数组,判断若子弹越界了,
 ----则将越界子弹替换为最后一个子弹,缩容

4.设计EnemyScore得分接口,Airplane和BigAirplane实现得分接口
 设计EnemyAward奖励接口,Bee实现奖励接口

设计规则:
1)将所有派生类所共有的属性和行为,抽到超类中------------抽共性
2)派生类的行为都一样,设计为普通方法
派生类的行为不一样,设计为抽象方法
3)将部分派生类所共有的属性和行为,抽到接口中
接口是对继承的单根性的扩展-----------实现多继承

继承: 超类是亲爹,只能有一个
接口: 接口是干爹,可以有多个


第九天 MeShoot

Shoot射击游戏第九天:
1.子弹与敌人的碰撞:
 1)在FlyingObject中设计isHit()检测碰撞、goDead()飞行物去死
 在Hero中设计addLife()增命、addFire()增火力
 2)子弹与敌人的碰撞是定时发生的,所以在run()中调用bulletBangAction()实现子弹与敌人的碰撞
 在bulletBangAction()中:
  遍历子弹得子弹,判断敌人得敌人,判断若都活着并且还撞上了:
    子弹去死、敌人去死
 判断若被撞敌人能得分,则强转为得分接口,玩家得分
 判断若被撞敌人能得奖励,则强转为奖励接口,获取奖励类型,英雄机得不同奖励
2.画分和画命:
 1)在Hero中设计getLife()用于获取英雄机的命数
 2)在World的paint()方法中: 画分和画命


第十天 MeShoot

Shoot射击游戏第十天:
1.英雄机与敌人的碰撞:
 1)借用FlyingObject中的isHit()检测碰撞、goDead()飞行物去死
  在Hero中设计subtractLife()减命、clearFire()清空火力值
2)英雄机与敌人的碰撞为定时发生的,所以在run()中调用heroBangAction()实现英雄机与敌人 的碰撞
 在heroBangAction()中:
  遍历敌人得敌人,判断若都活着并且和英雄机撞上了:
  敌人去死、英雄机减命、英雄机清空火力值

2.检测游戏结束:
 1)借助于Hero的getLife()获取命数
 2)检测游戏结束为定时发生的,所以在run()中调用checkGameOverAction()检测游戏结束
 在checkGameOverAction()中:
  判断若英雄机的命数<=0,表示游戏结束,则将当前状态修改为GAME_OVER游戏结束状态

3.画状态:
 1)在World中设计START、RUNNING、PAUSE、GAME_OVER状态常量,state变量表示当前状态
  在Images中设计state、pause、gameover状态图,并赋值
  在World类的paint()方法中,设计在不同的状态下画不同的图
 2)将run()中那一堆action设计为 仅在运行状态下执行
  将mouseMoves()中英雄机随着鼠标移动设计为 仅在运行状态下执行
 3)重写mouseClicked()鼠标点击事件:
  启动状态时变运行状态,游戏结束状态时先清理现场再变启动状态
  重写mouseExited()鼠标移出事件:
  运行状态时变为暂停状态
  重写mouseEntered()鼠标移入事件:
  暂停状态时变为运行状态

这篇关于Java面向对象 项目 飞机大战 Shoot的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/395994

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.