Java面向对象程序设计 课件 项目8 飞机大战游戏_第1页
Java面向对象程序设计 课件 项目8 飞机大战游戏_第2页
Java面向对象程序设计 课件 项目8 飞机大战游戏_第3页
Java面向对象程序设计 课件 项目8 飞机大战游戏_第4页
Java面向对象程序设计 课件 项目8 飞机大战游戏_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

项目8飞机大战游戏学习目标知识技能目标:掌握接口的定义;掌握类实现接口的方法;掌握继承和多态的方法;能用两种方式创建线程的方法;职业素养目标:具备较强的职业道德和责任心,提高代码审查和质量控制的能力具备软件产品零BUG的质量意识,提升代码质量和程序性能课证融通学习内容与“大数据应用开发(Java)”职业技能等级标准(初级)对应关系工作任务职业技能要求1.3面向对象代码编写(初级)1.3.2能熟练运用继承和多态机制编写复用度高的Java代码;1.3.3能熟练运用接口机制设计灵活的Java程序;1.2Java高级机制编程(中级)1.2.3能运用Java异常处理机制编写更健壮的Java程序;1.2.5能运用Java8的新特性完成函数式编程,提升编程效率。2.2多线程并发优势应用2.2.1能熟练使用Java的多线程API创建线程类;任务8.1搭建系统框架1飞机大战游戏中类设计如图所示,根据类图设计,完成项目框架的搭建,包括包的定义、接口的定义。任务详解任务描述任务8.1搭建系统框架1技术准备技能点1:面向接口编程思想面向接口编程思想是指在设计软件应用时,应该先定义接口,然后再实现接口。接口定义了一组操作的规范,而实现类则负责具体实现这些操作。当需要更改某个功能的实现时,只需要修改对应的实现类,而不需要修改其他使用这个功能的代码。最终实现内部变动而不影响外部与其他实现交互。其优点是提高代码的可读性、可复用性、可维护性和可扩展性,以及降低代码之间的耦合度。面向接口编程也是面向对象编程体系中的思想精髓之一。任务8.1搭建系统框架1微课1-1Java前世今生技能点1:面向接口编程思想(1)语法:interface接口名{//常量和抽象方法}技术准备1.JDK8以前接口(2)使用说明:①接口中的抽象方法,可以不加abstract。②接口中的常量,可以不加final和static,系统默认会加上。(3)接口特性①接口不可以被实例化,接口通常作为类型来使用。②实现类必须实现接口的所有方法,否则接口的实现类定义为抽象类。③实现类可以实现多个接口,实现Java中的多重继承。④接口中的变量都是静态常量。⑤接口可以多重继承,也就是说一个接口可以有多个父接口。任务8.1搭建系统框架1技能点1:面向接口编程思想技术准备接口新特性——JDK8.0之后,接口中除了有抽象方法以外,允许有默认方法和静态方法示例代码:UsbInterface接口中有1个默认方法和一个抽象方法。publicinterfaceUsbInterface{

//模拟连接USB设备

defaultvoidpreService(){

System.out.println("USB设备已连接");}

//模拟USB设备工作

voidservice();

//模拟拔出USB设备

defaultvoidafterService(){

System.out.println("USB设备已拔出");}}(1)默认方法接口中的默认方法用default关键字修饰,并提供方法的默认实现。这一特性可以在不修改现有实现的基础上添加新的方法,增强的接口的可扩展性。任务8.1搭建系统框架1技能点1:面向接口编程思想技术准备接口新特性——JDK8.0之后,接口中除了有抽象方法以外,允许有默认方法和静态方法示例代码:在JDK8.0中,Function接口中包含static方法identity()。publicinterfaceFunction<T,R>{static<T>Function<T,T>identity(){returnt->t;}}(2)JDK8中,允许接口中包含静态方法,提供与接口相关的实用功能。JDK9.0之后,接口中允许有私有方法,私有方法只能在接口内被调用。私有方法用于辅助默认方法和静态方法的实现,隐藏实现细节,提高代码的可读性和可维护性。JDK9.0中接口新特性任务8.1搭建系统框架1技能点2:抽象类的定义(1)定义抽象方法的语法[访问控制符]abstract[返回值类型]方法名([形参列表]);(2)抽象方法的特点:①抽象方法没有方法体,没有{},方法头后以分号结束②抽象方法必须在抽象类或者接口中,普通类中不能有抽象方法③抽象方法必须在子类中实现,除非子类也是抽象类技术准备1.抽象方法:是一种特殊的方法,它在抽象类或接口中声明。抽象方法主要用于定义子类必须实现的特定行为,但不提供这些行为的具体实现。任务8.1搭建系统框架1技能点2:抽象类的定义(1)定义抽象类的语法[访问控制符]abstractclass类名{public类名(){

//构造方法}//抽象方法publicabstractvoidabstractMethodName();//非抽象方法的定义

}技术准备2.抽象类的定义:抽象类是一种特殊的类,不能被实例化,通常用于定义一组具有共同特性的对象或作为一组子类的通用父类。抽象类可以包含抽象方法和非抽象方法,但如果一个类中包含抽象方法,那么这个类就必须被声明为抽象类。(2)抽象类的特点①抽象类不能实例化②抽象类中可以有抽象方法,但不是必需的③抽象类应该被继承,不能定义成final的④抽象类的构造方法不能是private任务8.1搭建系统框架1练一练阅读下列代码,分析类的定义有没有错误?publicabstractclassPet{publicvoidprint(){//…}}

正确

原因:

错误

原因:

publicclassPet{publicabstractvoidprint();}

正确

原因:

错误

原因:

任务实施任务8.1搭建系统框架1第一步:任务分析(1)根据图8.1中的类图,写出项目所涉及的包名及类名:(2)写出接口名和接口中的抽象方法接口名:抽象方法:(3)抽象类GameObject中包含的属性和方法第二步:编写代码(1)新建一个Java项目(2)新建包(3)新建接口IGameObject(4)新建抽象类GameObject第三步:验证结果AEBCD小组协作,完成任务评价测试任务8.1搭建系统框架1评价指标评价标准分值得分创建项目正确创建Java项目10

包的创建正确定义包,包名命名准确10

接口定义正确定义接口IGameObject30

抽象类的定义正确定义抽象类GameObject30

编码规范包名、接口名、抽象类命名规范、有合理的注释20

任务8.1搭建系统框架1拓展提升——函数式接口Lambda表达式的本质是实现了一个函数式接口。函数接口也是JDK8的新特性之一,用于支持Lambda表达式。函数式接口是只有一个抽象方法的接口,可以用@FunctionalInterface注解来显式标记,当接口中多于一个抽象方法时,编译会报错。ActionListener接口和Lambda表达式是兼容的,因此添加事件监听时可以用Lambda表达式来实现。任务8.1搭建系统框架1案例:定义一个函数式接口,包含一个抽象方法say教师演示第一步:创建函数式接口//定义函数式接口@FunctionalInterfacepublicinterfaceMyInterface{//包含一个抽象方法publicvoidsay(Stringcontent);}第二步:调用接口中的方法

//创建Lambda表达式MyInterfacemi=content->System.out.println("say:"+content);//调用函数式接口的方法mi.say("Hello!FunctionInterface.");第三步:运行程序任务描述任务8.2定义接口的实现类2根据项目类图可知,GameObject类实现Image接口,子弹类Bullet,敌机类Enemy,玩家飞机类Plane都是GameObject的子类。本任务:根据类图,实现GameObject类实现IGameObject接口,并创建GameObject的三个子类。具体任务任务8.2定义接口的实现类2技能点1:创建接口的实现类语法:class子类名implements接口列表{//给出接口中所有抽象方法的}使用说明:(1)如果类实现了接口,那么它必须提供该接口中声明的所有方法的具体实现,除非这个类本身是抽象的。(2)Java中,一个类可以实现一个或者多个接口,中间用逗号分隔。技术准备类实现接口使用implements关键字,并且该类需要提供接口中所有方法的具体实现。技能点2:继承的实现任务8.2定义接口的实现类2创建子类语法: class

子类名

extends

父类{ }使用说明:(1)父类必须是已经存在的类,可以是JDK中定义的类,也可以是用户自己定义或者第三方的类。(2)Java中不支持类的多重继承,一个类只能有一个直接父类。(3)子类拥有父类所有非私有的属性和方法。(4)final修饰的类不能作为父类(不能被继承)。(5)子类也叫派生类,父类又称为基类或者超类。面向对象的三大特征是封装性、继承性和多态性。继承性是指在现有类的基础上创建子类,新增程序的功能。继承性是面向对象程序设计非常重要的特性,其好处是可以减少代码的冗余,便于系统升级和维护。技术准备任务8.2定义接口的实现类2案例:编写圆类,可以计算圆的面积和周长;编写一个圆柱体类,可以计算圆柱体的体积、底面面积和底面周长。教师演示第一步:任务分析(1)识别所用到的类:圆类(Circle)、圆柱体类(Cylinder)和测试类Test;(2)识别圆类(Circle)包含的属性和方法:(3)识别圆柱体类(Cylinder)包含的属性和成员方法第二步:编码实现(1)新建Java项目(2)新建Circle类(3)编写圆柱体类(4)编写测试类第三步:测试运行程序技能点3:多态的实现任务8.2定义接口的实现类2在面向对象程序设计理论中,多态性是面向对象程序设计的重要特征之一。多态性是指:相同的消息发送给不同类的对象,可能产生多种不同的行为。多态性分为编译时的多态性(静态多态性)和运行时的多态性(动态多态性)。静态多态性:通过方法的重载来实现,程序在编译时就清楚调用哪一个方法;动态多态性:通过方法的覆盖来实现,程序在执行过程中才清楚调用哪一个方法。技术准备任务8.2定义接口的实现类2方法重载:指在同一个类中出现多个同名的方法,要求方法特征(参数类型、参数个数、参数顺序)不完全相同。方法重载在JDK提供的类中应用特别广泛,java.io.PrintStream类中包含多个print方法,其参数类型不同。

技术准备——用重载实现静态多态性任务8.2定义接口的实现类2案例:定义一个类,满足以下要求:教师演示(1)包含编写一个方法average,该方法以两个整数为参数,并以浮点数形式返回两个整数的平均值;(2)重载average方法,使得输入参数为3个整数,然后返回这三个数的平均值;(3)重载average方法,使其返回四个参数的平均值。任务8.2定义接口的实现类2技术准备——用覆盖实现动态多态性方法覆盖时应遵循的原则有:(1)覆盖后的方法(子类中的方法)不能比被覆盖的方法(父类中的方法)有更严格的访问权限;(2)覆盖后的方法不能比被覆盖的方法产生更多的异常。方法覆盖又称为方法重写是指在子类中出现与父类的方法名、返回类型、函数特征完全相同的方法。方法覆盖的作用是:当父类中的方法不能满足需要,覆盖使得在子类中可以重新定义父类中已有的方法,从而体现出子类自己的行为。任务8.2定义接口的实现类2技术准备——用super调用父类构造方法创建子类对象会先调用父类的构造方法(默认调用父类无参构造方法),再调用子类的构造方法。也可以通过在子类构造方法中通过super()调用父类构造方法。语法:调用父类无参构造方法:

super();调用父类有参构造方法:

super([参数列表]);

使用说明:调用父类构造方法的语句只能是子类构造方法的第一条语句。子类中没有通过super调用父类构造方法,默认调用父类无参构造方法。任务8.2定义接口的实现类2练一练:阅读下列代码,分析程序存在的问题,并给出解决方案classSuperClass{

publicSuperClass(Stringstr){//有参构造方法

System.out.println("TheSuperCalssConstructorisinvoked!");}}classSubClassextendsSuperClass{

publicSubClass(){//无参构造方法

System.out.println("TheSubClassConstructorisinvoked!");}}classMainClass{

publicstaticvoidmain(String[]args){

SubClassobj=newSubClass();}}任务8.2定义接口的实现类2技术准备——动态多态性的实现实现动态多态性的步骤:第一步:编写父类第二步:编写子类,子类重写(覆盖)父类方法第三步:运行时,使用父类的类型,子类的对象任务8.2定义接口的实现类2案例:编写一个顾客类,包括ID,姓名,电话,地址,购买力,输入客户信息和输出客户信息的方法。编写一个员工类,包括ID,姓名,电话,地址,工资,输入员工信息和输出客户信息的方法。要求:增加代码的重用。教师演示任务实施任务8.2定义接口的实现类2第一步:创建接口的实现类创建IGameObject的实现类GameObject,该类为抽象类。第二步:创建GameObject类的子类(1)创建子弹类。(2)创建敌机类。(3)创建玩家飞机类。第三步:验证程序根据类图,验证包和接口的定义是否完整、准确。AEBCD小组协作,完成任务评价测试任务8.2定义接口的实现类2评价指标评价标准分值得分创建项目正确创建Java项目10

类实现接口正确定义GameObject,实现IGameObject接口10

敌机类正确定义Enemy类,继承GameObject类20

子弹类正确定义Bullet类,继承GameObject类20

玩家飞机类正确定义Plane类,继承GameObject类20

编码规范代码编写规范、有合理的注释20

拓展提升——用可变参数减少方法的重载任务8.2定义接口的实现类2要实现计算两个整数、三个整数、四个整数和五个整数的平均数,我们可以用到方法的重载,定义四个average()方法。在JDK5.0之后,可以使用方法的可变参数,将上述四个average方法用一个方法来替换。可变参数的形式:数据类型...可变参数名使用说明:(1)可变参数的本质是数组,多个参数是当做数组传递的。(2)一个方法最多只能有一个可变参数,而且必须是最后一个参数。拓展提升——用可变参数减少方法的重载任务8.2定义接口的实现类2示例代码:用可变参数实现计算两个整数、三个整数、四个整数和五个整数的平均数publicintaverage(int...nums){

intsum=0;

for(intn:nums){

sum+=n;}

returnsum/nums.length;}任务描述任务8.3创建游戏界面3本任务创建游戏界面,具体要求:(1)窗口大小500×500,点击窗体关闭按钮结束游戏(2)加载游戏背图片(3)在游戏窗口底部显示玩家飞机具体任务任务8.3创建游戏界面3技能点1:将图片文件转换成Image对象技术准备1.读取图像staticBufferedImageImageIO.read(Fileinput):从文件中读取图像staticBufferedImageImageIO.read(URLinput):从URL中读取图像2.写入图像ImageIO.write(RenderedImageim,StringformatName,Fileoutput)方法将图像写入文件。参数说明:(I)im可以是BufferedImage或其他实现了该接口的对象(2)formatName是要写入的图像格式(如"jpg”或"png")(3)output是输出文件的File对象javax.imageio.ImageIO是Java标准库中的一个类,它提供了一个简单的接口来读取、写入和创建图像。任务8.3创建游戏界面3案例:编写GameUtil类,实现将文件转换成Image教师演示第一步:任务分析实现读图像,用到javax.imageio.ImageIO类的read()方法。第二步:编码实现publicclassGameUtil{publicstaticImagegetImage(Stringpath){//读图像BufferedImageimage=null;URLurl=GameUtil.class.getClassLoader().getResource(path);try{image=ImageIO.read(url);}catch(IOExceptione){thrownewRuntimeException(e);}returnimage;}}任务8.3创建游戏界面3案例:在窗体中加载背景图片教师演示第一步:任务分析图片资源存放在Maven项目resources下,调用案例1中的类,实现读图像。第二步:编码实现

关键技术:在JFrame中显示图片,可以重写paint(Graphicsg)方法,调用Graphics类中的drawImage()方法实现(1)新建一个Maven项目,在resources下新建images文件夹,将背景图片存放到该文件夹中。(2)新建GameWindow,继承自JFrame(3)在Main类中,创建GameWindow对象第三步:运行程序任务实施任务8.3创建游戏界面3第一步:任务分析在任务8.2的基础上,编写GameUtil类用于实现读取图像文件,编写GameWindow类,用于显示飞机大战游戏界面。GameWindow类实现显示主界面,初始化玩家飞机,在主界面显示背景图片和玩家飞机。第二步:编码实现(1)打开任务8.2的项目。(2)新建GameWindow类,继承自JFrame,根据提示,完善代码。(3)在main方法中创建GameWindow的对象第三步:运行程序AEBCD小组协作,完成任务评价测试任务8.3创建游戏界面3评价指标评价标准分值得分创建项目正确创建Java项目10

显示背景图片正确在窗体中显示背景图片20

窗体显示窗体居中、大小500*500、大小不可变20

显示玩家飞机正确显示玩家飞机30

编码规范变量命名规范、有合理的注释20

拓展提升——日志处理任务8.3创建游戏界面31.输出日志信息java.util.logging.Logger类提供了输出日志信息的方法2.日志级别java.util.logging.Level类定义了一组可用于控制日志输出的标准日志记录级别。按照级别从高到低分别是:Level.SEVERE:表示严重故障的消息级别;Level.WARNING:表示潜在问题的消息级别;Level.INFO:表示信息性消息的消息级别;Level.CONFIG:表示静态配置消息的消息级别;Level.FINE:提供跟踪信息的消息级别;Level.FINER:表示想当详细的跟踪消息;Level.FINEST:表示高度详细的跟踪信息;3.关闭日志Logger.getGlobal().setLevel(Level.OFF);可实现不输出日志信息。任务描述任务8.4用线程实现显示游戏元素3在任务8.3中,完成了飞机大战游戏主界面构建,接下来用线程实现在游戏中同时加载玩家飞机、敌机和子弹。具体任务:(1)创建一个子弹线程,用于管理玩家发射的子弹(2)创建一个敌机线程,用于管理敌机(3)创建一个线程,用于每个50毫秒刷新游戏界面(4)创建一个倒计时线程,用于记录游戏时间具体任务任务8.4用线程实现显示游戏元素3技能点1:线程及生命周期1.进程和线程线程又称为“轻量级”的进程。一个进程中可以有一个或者多个线程,如果进程中只有一个线程,是单线程程序,如果进程中有多个线程为多线程程序。2.线程的生命周期(1)新建状态(2)可运行状态(3)运行状态(4)不可运行状态(阻塞、睡眠等)(5)死亡状态技术准备任务8.4用线程实现显示游戏元素3技能点2:用继承Thread类方式创建线程(1)常用构造方法Thread():创建一个新的线程对象。Thread(Runnabletarget):创建一个新的线程对象,用于执行Runnable对象的任务。(2)常用方法start():启动线程,线程进入就绪状态。run():线程执行的主体,当CPU空闲时,从就绪队列中取优先级最高的线程,执行run()方法,此时,线程进入运行状态。interrupt():中断线程wait():让线程进入等待状态sleep(longs):线程进入睡眠状态,参数的单位是毫秒setPriority(intpriority):设置线程的优先级技术准备1.通过继承Thread类任务8.4用线程实现显示游戏元素3技术准备技能点2:用继承Thread类方式创建线程示例代码:创建线程类classMyThreadextendsThread{

//线程要完成的任务publicvoidrun(){}}启动线程:

MyThreadthread=newMyThread();thread.start();任务8.4用线程实现显示游戏元素3案例:在窗体显示以“yyyy-MM-ddhh:mm:ss”格式动态显示系统时间教师演示第一步:任务分析(1)创建Thread类的子类TimeThread,用于动态显示系统时间(2)按照指定格式显示系统日期和时间,用到SimpleDateFormat类,对系统当前时间进行格式化(3)动态显示时间,用到无限循环,避免时间不停刷新,可通过Thread.sleep(1000);让线程睡眠1秒钟第二步:编码实现(1)新建一个Java项目(2)新建MainForm类,包含JPanel,JLabel等组件(3)在MainForm类中新建一个内部类TimeThread,用于显示系统时间(4)在MainForm类构造方法中,创建TimeThread类的对象,并启动start()方法(5)在main方法中创建MainForm类的对象第三步:运行程序技能点3:用实现Runnable接口创建线程任务8.4用线程实现显示游戏元素3Java中类不支持多重继承,因此,当线程类已经有父类的情况,可通过实现Runnable接口创建线程类。技术准备第二步:动线程第一步:创建一个类,实现Runnable接口0201实现Runnable接口创建线程的步骤classMyThreadimplementsRunnable{publicvoidrun(){//线程要完成的任务}}MyThreadth=newMyThread();newThread(th).start();任务8.4用线程实现显示游戏元素3案例:为避免沉迷游戏,为游戏窗口主界面添加倒计时提醒教师演示第一步:任务分析GameWindow类已经继承了JFrame类,只能通过实现Runnable接口创建线程实现倒计时。在游戏主界面显示倒计时,20分钟后游戏结束。倒计时格式:“倒计时:XX分钟XX秒”第二步:编码实现(1)打开任务8.2的项目(2)修改GameWindow类,实现Runnable接口,重写run()方法第三步:运行程序任务实施任务8.4用线程实现显示游戏元素3第一步:任务分析根据任务描述,本任务涉及到多个线程,可以将四个线程单独放到org.example.planegame.service包中。第二步:编码实现(1)编写BulletThread类,实现管理玩家发射的子弹。(2)编写EnemyThread类,实现管理敌机和敌机发射的子弹。(3)编写CountDownSecondThread类,实现游戏倒计时管理。(4)编写PaintThread类,实现对界面定时刷新第三步:运行程序AEBCD小组协作,完成任务

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论