Java(GUI)飞机大战
- 格式:doc
- 大小:189.00 KB
- 文档页数:16
java小项目飞机大战课程设计一、课程目标知识目标:1. 理解Java编程语言的基本语法和结构,掌握面向对象编程的基本概念;2. 学会使用Java编写简单的图形用户界面(GUI)应用程序;3. 掌握事件处理机制,实现游戏中的交互功能;4. 了解游戏开发的基本流程和技巧,如游戏循环、碰撞检测等。
技能目标:1. 能够运用所学知识独立设计并实现一个简单的飞机大战游戏;2. 提高编程实践能力,培养解决问题的思维方式和调试技巧;3. 学会合作与沟通,通过团队协作完成一个完整的游戏项目。
情感态度价值观目标:1. 激发学生对计算机编程的兴趣,培养创新意识和动手能力;2. 培养学生勇于面对挑战、克服困难的意志品质;3. 增强学生的团队协作精神,学会相互尊重、共同进步;4. 通过游戏项目的设计与实现,让学生体会到编程的乐趣和价值。
本课程针对初高中年级学生,结合Java学科特点和教学要求,注重理论与实践相结合,以培养学生实际动手能力为核心。
课程目标具体、可衡量,旨在帮助学生掌握Java编程基础,提高编程实践技能,同时培养团队协作和解决问题的能力,使学生在愉快的游戏开发过程中,收获知识、技能和成长。
二、教学内容1. Java基本语法与结构:变量、数据类型、运算符、控制流程(条件语句、循环语句);2. 面向对象编程基础:类与对象、构造方法、封装、继承、多态;3. Java图形用户界面(GUI):Swing组件、布局管理器、事件处理;4. 游戏开发技巧:游戏循环、碰撞检测、动画实现、音效处理;5. 项目实践:设计并实现飞机大战游戏,包括敌机生成、飞机移动、射击与爆炸效果等。
教学内容依据课程目标进行选择和组织,确保科学性和系统性。
教学大纲安排如下:1. Java基础(2课时):复习基本语法和结构,为后续游戏开发打下基础;2. 面向对象编程(2课时):学习类与对象的使用,理解封装、继承、多态等概念;3. Java GUI(2课时):掌握Swing组件和布局管理器,学习事件处理机制;4. 游戏开发技巧(2课时):讲解游戏开发中的常用技巧和方法;5. 项目实践(4课时):分组进行飞机大战游戏的设计与实现,教师指导与解答。
java编程飞机大战课程设计一、课程目标知识目标:1. 让学生理解Java编程基本概念,掌握面向对象编程思想;2. 让学生掌握Java中数组、循环、条件语句等基本语法结构;3. 让学生了解游戏开发的基本流程和原理。
技能目标:1. 培养学生运用Java编程语言设计飞机大战游戏的能力;2. 培养学生分析问题、解决问题的能力;3. 培养学生团队协作、沟通交流的能力。
情感态度价值观目标:1. 激发学生对编程的兴趣和热情,培养计算机科学素养;2. 培养学生勇于尝试、克服困难的精神,提高自信心;3. 培养学生遵守游戏规则,树立公平竞争的意识。
分析课程性质、学生特点和教学要求,将课程目标分解为以下具体学习成果:1. 学生能够独立编写Java程序,实现飞机大战游戏的基本功能;2. 学生能够运用所学知识,优化飞机大战游戏的性能和体验;3. 学生能够在团队合作中发挥积极作用,共同完成任务;4. 学生能够表达自己对编程和游戏的看法,分享学习心得和经验。
二、教学内容本课程教学内容主要包括以下几部分:1. Java编程基础:回顾Java基本语法,如数据类型、变量、运算符、数组等,为学生编写飞机大战游戏打下基础。
2. 面向对象编程:介绍类、对象、继承、多态等概念,使学生能够运用面向对象编程思想设计游戏。
教材章节:第1章 Java概述,第2章 面向对象编程基础。
内容列举:数据类型、变量、运算符、数组、类、对象、继承、多态。
3. Java图形用户界面:讲解Swing图形用户界面编程,使学生能够为飞机大战游戏设计界面。
教材章节:第6章 Java图形用户界面。
内容列举:JFrame、JPanel、事件处理、绘图。
4. 游戏开发原理:介绍游戏开发的基本流程、设计模式,使学生了解游戏开发的一般方法。
教材章节:第10章 游戏开发。
内容列举:游戏循环、游戏状态、游戏设计模式。
5. 飞机大战游戏设计:结合所学知识,指导学生进行飞机大战游戏的设计与实现。
java课课程设计飞机大战一、教学目标本节课的教学目标是让学生掌握Java编程的基本语法和面向对象编程思想,能够运用Java编写简单的游戏程序。
具体来说,知识目标包括:1.理解Java编程语言的基本语法和数据结构。
2.掌握面向对象编程的基本概念,如类、对象、封装、继承和多态。
3.了解Java的图形用户界面编程技术。
技能目标包括:1.能够使用Java编写简单的控制台程序。
2.能够运用面向对象编程思想设计和实现简单的游戏程序。
3.能够利用Java的图形用户界面编程技术创建游戏界面。
情感态度价值观目标包括:1.培养学生的编程兴趣,提高学生对计算机科学的热爱。
2.培养学生解决问题的能力和团队合作精神。
3.培养学生良好的编程习惯和职业道德。
二、教学内容本节课的教学内容主要包括Java编程语言的基本语法、面向对象编程思想和图形用户界面编程技术。
具体安排如下:1.引入Java编程语言的基本语法,如变量、数据类型、运算符、控制语句等。
2.讲解面向对象编程的基本概念,并通过实例让学生理解类和对象的关系。
3.介绍Java的图形用户界面编程技术,如Swing和AWT,并演示如何创建简单的游戏界面。
4.引导学生运用所学的知识编写一个简单的飞机大战游戏程序,巩固所学内容。
三、教学方法为了激发学生的学习兴趣和主动性,本节课将采用多种教学方法,如讲授法、案例分析法和实验法等。
具体安排如下:1.采用讲授法讲解Java编程语言的基本语法和面向对象编程思想。
2.通过案例分析法让学生了解Java的图形用户界面编程技术,并引导学生动手实践。
3.利用实验法让学生分组合作,编写一个简单的飞机大战游戏程序,培养学生的实际编程能力。
四、教学资源为了支持教学内容和教学方法的实施,本节课将准备以下教学资源:1.教材:《Java编程思想》或《Java核心技术》。
2.参考书:《Java编程指南》或《Java编程实战》。
3.多媒体资料:教学PPT、Java编程教程视频。
java飞机大战的课程设计一、课程目标知识目标:1. 让学生掌握Java基本语法和程序结构,特别是循环结构、条件语句和面向对象编程基础;2. 使学生了解游戏开发中的坐标系、图形用户界面(GUI)设计以及事件处理机制;3. 帮助学生理解游戏开发中的线程概念及其运用。
技能目标:1. 培养学生运用Java语言编写简单的飞机大战游戏的能力;2. 培养学生分析问题、解决问题的能力,特别是在游戏逻辑设计方面的应用;3. 提高学生在团队合作中沟通协调和共同开发的能力。
情感态度价值观目标:1. 培养学生对编程和计算机科学的兴趣,激发学生的创新精神和实践能力;2. 培养学生面对困难时勇于尝试、积极进取的态度,增强学生的自信心;3. 通过团队合作,培养学生的团队精神,提高学生的集体荣誉感。
课程性质分析:本课程为信息技术相关课程,旨在通过实践性项目——飞机大战游戏开发,让学生将所学的Java编程知识应用于实际项目中,提高学生的实践能力和创新能力。
学生特点分析:考虑到学生所在年级,已具备一定的Java编程基础,对游戏开发有一定兴趣,但可能缺乏实际项目经验,需要通过本课程进一步巩固知识,提高实践技能。
教学要求:根据课程性质和学生特点,课程目标应具体、可衡量,注重理论与实践相结合。
在教学过程中,注重启发式教学,引导学生主动思考,培养学生解决问题的能力。
同时,关注学生的情感态度,营造积极、和谐的学习氛围。
通过分解课程目标为具体的学习成果,便于后续教学设计和评估。
二、教学内容1. Java基本语法回顾:包括变量定义、数据类型、运算符、循环结构(for、while)、条件语句(if-else、switch)等;2. 面向对象编程基础:类与对象、构造方法、封装、继承、多态等;3. 图形用户界面(GUI)设计:AWT和Swing图形用户界面组件、布局管理器、事件处理机制;4. 游戏开发中的线程概念:线程的创建、同步、生命周期等;5. 游戏设计:游戏逻辑、坐标系、角色控制、碰撞检测、得分系统等;6. 项目实践:分组进行飞机大战游戏的开发,结合所学知识,完成游戏设计、编码、测试和优化。
package com;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Image;import java.awt.Rectangle;import java.awt.event.KeyEvent;import java.io.IOException;import javax.imageio.ImageIO;public class Plane {Image feijiImage = null;int x = 300;int y = 700;int lifeCount=5;public Plane() {try {feijiImage = ImageIO.read(Plane.class.getClassLoader().getResourceAsStream("images/feiji.png"));} catch (IOException e) {e.printStackTrace();}}public void draw(Graphics g) {//画飞机图片g.drawImage(feijiImage, x, y, null);//飞机移动this.move();// 血条if(lifeCount>0){g.setColor(Color.WHITE);g.fillRect(20, 80, 100, 10);g.setColor(Color.red);g.fillRect(20, 80, (100/5)*lifeCount, 10);g.setColor(Color.blue);g.setFont(new Font("幼圆", Font.BOLD, 30));g.drawString("Score:"+Play01.count, 20, 60);}}public void move(){if(isUP && !isDown && !isLeft && !isRight){//上y=y-5;}else if(!isUP && isDown && !isLeft && !isRight){ //下y=y+5;}else if(!isUP && !isDown && isLeft && !isRight){ //左x=x-5;}else if(!isUP && !isDown && !isLeft && isRight){ //右x=x+5;}else if(isUP && !isDown && isLeft && !isRight){ //左上x=x-5;y=y-5;}else if(!isUP && isDown && isLeft && !isRight){ //左下x=x-5;y=y+5;}else if(isUP && !isDown && !isLeft && isRight){ //右上x=x+5;y=y-5;}else if(!isUP && isDown && !isLeft && isRight){ //右下x=x+5;y=y+5;}}boolean isUP = false;boolean isDown = false;boolean isLeft = false;boolean isRight = false;// 摁下public void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();if (keyCode == KeyEvent.VK_RIGHT || keyCode == KeyEvent.VK_D) {isRight=true;} else if (keyCode == KeyEvent.VK_LEFT || keyCode == KeyEvent.VK_A) {isLeft=true;} else if (keyCode == KeyEvent.VK_UP || keyCode == KeyEvent.VK_W) {isUP=true;} else if (keyCode == KeyEvent.VK_DOWN || keyCode == KeyEvent.VK_S) { isDown=true;}}// 放开public void keyReleased(KeyEvent e) {int keyCode = e.getKeyCode();if (keyCode == KeyEvent.VK_RIGHT || keyCode == KeyEvent.VK_D) {isRight=false;} else if (keyCode == KeyEvent.VK_LEFT || keyCode == KeyEvent.VK_A) {isLeft=false;} else if (keyCode == KeyEvent.VK_UP || keyCode == KeyEvent.VK_W) {isUP=false;} else if (keyCode == KeyEvent.VK_DOWN || keyCode == KeyEvent.VK_S) { isDown=false;}}public Rectangle getRectangle(){return new Rectangle(x,y,feijiImage.getWidth(null),feijiImage.getHeight(null));}}package com;public class PlaneStatus {public static int roleNum = 1;public static int playStatus = 0;// 0 游戏开始前 1 第一关-1 游戏结束}package com;import java.awt.Graphics;import java.awt.Image;import java.awt.event.KeyEvent;import java.io.IOException;import javax.imageio.ImageIO;public class Power {Image PowerImage = null;int x = 20;int y = 0;public Power() {this.x=(int)(Math.random()*540)+20;try {PowerImage = ImageIO.read(Gift.class.getClassLoader().getResourceAsStream("images/power.png"));} catch (IOException e) {e.printStackTrace();}}public void draw(Graphics g) {//画血瓶图片g.drawImage(PowerImage, x, y, null);//血瓶移动y++;}public Rectangle getRectangle(){return new Rectangle(x,y,PowerImage.getWidth(null),PowerImage.getHeight(null));}}package com;import java.awt.Graphics;import java.awt.Image;import java.awt.Rectangle;import java.awt.event.KeyEvent;import java.util.ArrayList;import java.util.List;import javax.imageio.ImageIO;// 第一关public class Play01 {static int count=0;Image bgImage = null;// 战机Plane plane = new Plane();// 战机子弹List<MyZiDan> mzds = new ArrayList<MyZiDan>();// 敌机List<Diji> dijis = new ArrayList<Diji>();// 敌机子弹//List<DijiZiDan> dijizidans = new ArrayList<DijiZiDan>();// 血瓶List<Gift> gifts = new ArrayList<Gift>();List<Power> powers = new ArrayList<Power>();public Play01() {try {bgImage = ImageIO.read(Play01.class.getClassLoader().getResourceAsStream("images/bg_01.jpg"));} catch (IOException e) {e.printStackTrace();}}int bgY1 = 0;int bgY2 = -600;int fireTime = 0;boolean flag=false;public void draw(Graphics g) {// 画背景图片g.drawImage(bgImage, 0, bgY1, null);bgY1 += 5;if (bgY1 <= 600) {bgY1 = 0;}g.drawImage(bgImage, 0, bgY2, null);bgY2 += 5;if (bgY2 >= 0) {bgY2 = -600;}// 清理战机子弹for (int i = 0; i < mzds.size(); i++) {MyZiDan myZidan = mzds.get(i);if (myZidan.x > 800) {mzds.remove(i);}}// 添加子弹if (isFire1 == true && flag==false) {if (fireTime % 8 == 0) {mzds.add(new MyZiDan(plane.x + 25, plane.y + 0));}fireTime++;}if (isFire1== true && flag==true) {if (fireTime % 4 == 0) {mzds.add(new MyZiDan(plane.x +8, plane.y +0));mzds.add(new MyZiDan(plane.x +52, plane.y +0));}fireTime++;}// 画战机子弹for (int i = 0; i < mzds.size(); i++) {MyZiDan myZidan = mzds.get(i);myZidan.draw(g);}// 清理敌机for (int i = 0; i < dijis.size(); i++) {Diji dj = dijis.get(i);if (dj.x < -100) {dijis.remove(i);}}// 抽奖:添加敌机if ((int) (Math.random() * 20) == 5) {dijis.add(new Diji());}// 抽奖:添加血瓶if ((int) (Math.random() * 1000) == 5) {gifts.add(new Gift());}for (int i = 0; i < gifts.size(); i++) {Gift gift = gifts.get(i);gift.draw(g);}//// 抽奖:添加powerif ((int) (Math.random() * 1000) == 5) {powers.add(new Power());}for (int i = 0; i < powers.size(); i++) {Power power = powers.get(i);power.draw(g);}// 画敌机for (int i = 0; i < dijis.size(); i++) {Diji dj = dijis.get(i);dj.draw(g);}// 画飞机plane.draw(g);// 判断战机相撞for (int i = 0; i < dijis.size(); i++) {// 先得到每一个敌机Diji dj = dijis.get(i);Rectangle r1 = dj.getRectangle();Rectangle r2 = plane.getRectangle();if (r1.intersects(r2)) {dijis.remove(i);plane.lifeCount = plane.lifeCount - 1;if(plane.lifeCount>0)flag=false;if(plane.lifeCount<1){ PlaneStatus.playStatus=-1; }}// 判断战机和血瓶相撞for (int i = 0; i < gifts.size(); i++) {// 先得到每一个血瓶Gift gift = gifts.get(i);Rectangle r1 = gift.getRectangle();Rectangle r2 = plane.getRectangle();if (r1.intersects(r2)) {gifts.remove(i);if (plane.lifeCount <5) {plane.lifeCount = plane.lifeCount + 1;}}}//// 判断战机和Power相撞for (int i = 0; i < powers.size(); i++) {// 先得到每一个powerPower power = powers.get(i);Rectangle r1 = power.getRectangle();Rectangle r2 = plane.getRectangle();if (r1.intersects(r2)) {powers.remove(i);flag=true;}}// 判断敌机在中弹for (int i = 0; i < mzds.size(); i++) {// 得到每个战机子弹MyZiDan myzidan = mzds.get(i);Rectangle r1 = myzidan.getRectangle();for (int j = 0; j < dijis.size(); j++) {// 每一个敌机Diji diji = dijis.get(j);Rectangle r2 = diji.getRectangle();if (r1.intersects(r2)) {mzds.remove(i);dijis.remove(j);count++;}}}boolean isFire1 = false;boolean isFire2 = false;public void keyPressed(KeyEvent e) {plane.keyPressed(e);if (e.getKeyCode() == KeyEvent.VK_J) {isFire1 = true;}/*if (e.getKeyCode() == KeyEvent.VK_K) {isFire2 = true;}*/}public void keyReleased(KeyEvent e) {plane.keyReleased(e);if (e.getKeyCode() == KeyEvent.VK_J) {isFire1 = false;fireTime = 0;}/*if (e.getKeyCode() == KeyEvent.VK_K) {isFire2 = false;fireTime = 0;}*/if( e.getKeyCode()==KeyEvent.VK_P){for(int i=0;i<dijis.size();i++)dijis.remove(i);}}}package com;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Image;import java.awt.event.KeyEvent;import java.io.IOException;import javax.imageio.ImageIO;// 游戏结束public class Over {Image obg=null;Image ng=null;public Over() {try {obg = ImageIO.read(Before.class.getClassLoader().getResourceAsStream("images/obg.jpg"));ng = ImageIO.read(Before.class.getClassLoader().getResourceAsStream("images/ng.png"));} catch (IOException e) {e.printStackTrace();}}public void draw(Graphics g){g.drawImage(obg, 0, 0, null);g.drawImage(ng, 120,100, null);g.setColor(Color.black);g.setFont(new Font("幼圆", Font.BOLD, 40));g.drawString("游戏结束啦!",200 ,600 );}public void keyPressed(KeyEvent e) {}public void keyReleased(KeyEvent e) {}}package com;import java.awt.Color;import java.awt.Graphics;import java.awt.Image;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import javax.swing.JFrame;public class MainFrame extends JFrame {Before before =new Before();Play01 play01 = new Play01();Over over = new Over();public MainFrame() {//设置标题this.setTitle(" 让子弹飞一会~"); //设置大小this.setSize(600, 800);//定位居中this.setLocationRelativeTo(null);//添加关闭操作this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //禁止重置大小zthis.setResizable(false);//添加键盘监听器//KeyListener --> KeyAdapterthis.addKeyListener(new KeyAdapter(){@Overridepublic void keyPressed(KeyEvent e) {if(PlaneStatus.playStatus == 0){before.keyPressed(e);}else if(PlaneStatus.playStatus ==1){play01.keyPressed(e);}else if(PlaneStatus.playStatus==-1){over.keyPressed(e);}}@Overridepublic void keyReleased(KeyEvent e) {if(PlaneStatus.playStatus == 0){before.keyReleased(e);}else if(PlaneStatus.playStatus ==1){play01.keyReleased(e);}else if(PlaneStatus.playStatus==-1){over.keyReleased(e);}}});//启动一个线程:每隔20 毫秒执行一次new Thread(){public void run(){while(true){MainFrame.this.repaint();try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}}}}.start();//显示this.setVisible(true);}Image bufferImage =null;//这个方法也是20毫秒执行一次public void paint(Graphics g){if(bufferImage==null){bufferImage = this.createImage(600, 800);}Graphics g4Image = bufferImage.getGraphics();g4Image.setColor(Color.BLACK);g4Image.fillRect(0, 0, 600, 800);this.draw(g4Image);g.drawImage(bufferImage, 0, 0, null);}public void draw(Graphics g){if(PlaneStatus.playStatus == 0){before.draw(g);}else if(PlaneStatus.playStatus ==1){play01.draw(g);}else if(PlaneStatus.playStatus==-1){over.draw(g);}}public static void main(String[] args) {new MainFrame();}}package com;import java.awt.Graphics;import java.awt.Image;import java.awt.Rectangle;import java.io.IOException;import javax.imageio.ImageIO;public class MyZiDan {Image zidanImage = null;int x ;int y ;public MyZiDan(int x,int y) {this.x=x;this.y=y;try {zidanImage = ImageIO.read(MyZiDan.class.getClassLoader().getResourceAsStream("images/zidan.png"));} catch (IOException e) {e.printStackTrace();}}public void draw(Graphics g) {//画我军子弹图片g.drawImage(zidanImage, x, y, null);//我的飞机子弹移动速度y-=20;}public Rectangle getRectangle(){return new Rectangle(x,y,zidanImage.getWidth(null),zidanImage.getHeight(null));}}package com;import java.awt.Graphics;import java.awt.Image;import java.awt.Rectangle;import java.awt.event.KeyEvent;import java.io.IOException;import javax.imageio.ImageIO;public class Diji {Image dijiImage = null;int y = -20;int x = 10;//20 ~ 760int r;public Diji() {this.x=(int)(Math.random()*540)+40;try {r = (int)(Math.random()*3)+1;dijiImage = ImageIO.read(Diji.class.getClassLoader().getResourceAsStream("images/diji_"+r+".png"));} catch (IOException e) {e.printStackTrace();}}public void draw(Graphics g) {//画敌机图片g.drawImage(dijiImage, x, y, null);//敌机移动if(r==1){y+=4;}else if(r==2){y+=4;}else if(r==3){y+=7;}}public Rectangle getRectangle(){return new Rectangle(x,y,dijiImage.getWidth(null),dijiImage.getHeight(null));}}package com;import java.awt.Graphics;import java.awt.Image;import java.awt.Rectangle;import java.awt.event.KeyEvent;import java.io.IOException;import javax.imageio.ImageIO;public class Gift {Image GiftImage = null;int x = 20;int y = 0;public Gift() {this.x=(int)(Math.random()*540)+20;try {GiftImage = ImageIO.read(Gift.class.getClassLoader().getResourceAsStream("images/blood.png"));} catch (IOException e) {e.printStackTrace();}}public void draw(Graphics g) {//画血瓶图片g.drawImage(GiftImage, x, y, null);//血瓶移动y++;}public Rectangle getRectangle(){return new Rectangle(x,y,GiftImage.getWidth(null),GiftImage.getHeight(null));}}package com;import java.awt.Graphics;import java.awt.Image;import java.awt.Rectangle;import java.io.IOException;import javax.imageio.ImageIO;public class DijiZiDan {Image zidanImage = null;int x ;int y ;int fangxiang =0;public DijiZiDan(int x,int y) {this.x=x;this.y=y;fangxiang = (int)(Math.random()*5);//0 ~ 7try {zidanImage = ImageIO.read(DijiZiDan.class.getClassLoader().getResourceAsStream("images/dijizidan.jpg"));} catch (IOException e) {e.printStackTrace();}}public void draw(Graphics g) {//画敌机子弹图片g.drawImage(zidanImage, x, y, null);//移动this.move();}public void move(){if(fangxiang==0){//下y=y+2;}else if(fangxiang==1){//左x=x-2;}else if(fangxiang==2){//右x=x+2;}else if(fangxiang==3){//左下x=x-2;y=y+2;}else if(fangxiang==4){//右下x=x+2;y=y+2;}}public Rectangle getRectangle(){return new Rectangle(x,y,zidanImage.getWidth(null),zidanImage.getHeight(null));}}package com;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Image;import java.awt.event.KeyEvent;import java.io.IOException;import javax.imageio.ImageIO;// 游戏开始之前public class Before {Image bg=null;Image wfeiji=null;Image kdiji1=null;Image kdiji2=null;Image kdiji3=null;public Before() {try {bg = ImageIO.read(Before.class.getClassLoader().getResourceAsStream("images/bg.jpg"));wfeiji = ImageIO.read(Before.class.getClassLoader().getResourceAsStream("images/feiji_1.png"));kdiji1 = ImageIO.read(Before.class.getClassLoader().getResourceAsStream("images/kdiji_01.png"));kdiji2 = ImageIO.read(Before.class.getClassLoader().getResourceAsStream("images/kdiji_02.png"));kdiji3 = ImageIO.read(Before.class.getClassLoader().getResourceAsStream("images/kdiji_03.png"));} catch (IOException e) {e.printStackTrace();}}int time=0;public void draw(Graphics g){if(PlaneStatus.roleNum==1){// 画妹妹g.drawImage(bg, 0, 0, null);g.drawImage(wfeiji, 260, 600, null);g.drawImage(kdiji1, 200, 50, null);g.drawImage(kdiji1, 400, 50, null);g.drawImage(kdiji1, 150, 480, null);g.drawImage(kdiji1, 400, 480, null);g.drawImage(kdiji2, 100, 200, null);g.drawImage(kdiji2, 300, 100, null);g.drawImage(kdiji2, 480, 200, null);g.drawImage(kdiji3, 300, 300, null);g.drawImage(kdiji3, 70, 400, null);g.drawImage(kdiji3, 510, 400, null);}//画回车符time++;g.setColor(Color.YELLOW);g.setFont(new Font("幼圆", Font.BOLD, 30));if(time<=10){g.drawString("[Enter]>>", 50, 750);}else if(time<=20){g.drawString("[Enter] >>", 50, 750);}else if(time<=30){g.drawString("[Enter] >>", 50, 750);if(time==30){time=0;}}}public void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();if(keyCode == KeyEvent.VK_ENTER){PlaneStatus.playStatus=1;}if(keyCode ==KeyEvent.VK_LEFT ||keyCode==KeyEvent.VK_RIGHT ){ PlaneStatus.roleNum = 3-PlaneStatus.roleNum;//1~2 互换}}public void keyReleased(KeyEvent e) {}}。
淮阴工学院实验报告2016 ------- 2017 学年第 1 学期学院计算机与软件工程学院课程名称算法实训班级达内1151学号 1151331134姓名陈龙指导教师达内讲师算法实训实验报告一、实训目的及意义进一步了解java开发的相关知识,掌握java开发的基本技术,丰富java 开发的实战经验。
学习java的基础知识及正确的运用方法,和有用的相关技术,提高自己的工作效率。
通过实习,巩固大二所学专业的基本知识,提高分析、判断和处理实际问题的能力,锻炼自己的实际动手能力,增强自己的团队协作意识,了解软件开发的思考角度和主要流程。
为毕业之后能够更快地进入工作状态并且能够更好的工作,打好一定的基础。
二、实训任务实习期间,通过学习一个简单的Java程序——飞机大战,了解和掌握Java 编程的基础,如构造器、API接口等。
最后可以独立完成一个小程序。
三、实习训语言Java的特点1.Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用Java。
另一方面,Java丢弃了C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。
特别地,Java 语言不使用指针,并提供了自动的废料收集,不必为内存管理而担忧。
2、Java语言是一个面向对象的Java语言提供类、接口和继承等原语,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。
Java语言全面支持动态绑定,而C++ 语言只对虚函数使用动态绑定。
总之,Java语言是一个纯的面向对象程序设计语言。
3、Java语言是分布式的Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。
packagecom;importimportimportfeijiImage=.getResourceAsStream("images/feiji.png"));}catch(IOExceptione){e.printStackTrace();}}publicvoiddraw(Graphicsg){// 画飞机图片g.drawImage(feijiImage,x,y,null);// 飞机移动publicvoidmove(){if(isUP&&!isDown&&!isLeft&&!isRight){// 上y=y-5;}elseif(!isUP&&isDown&&!isLeft&&!isRight){// 下y=y+5;}elseif(!isUP&&!isDown&&isLeft&&!isRight){ // 左x=x-5;// 右上x=x+5;y=y-5;}elseif(!isUP&&isDown&&!isLeft&&isRight){ // 右下x=x+5;y=y+5;}}booleanisUP=false;nt.VK_A){isLeft=true;}elseif(keyCode==KeyEvent.VK_UP||keyCode==KeyEvent .VK_W){isUP=true;}elseif(keyCode==KeyEvent.VK_DOWN||keyCode==KeyE vent.VK_S){isDown=true;isLeft=false;}elseif(keyCode==KeyEvent.VK_UP||keyCode==KeyEvent .VK_W){isUP=false;}elseif(keyCode==KeyEvent.VK_DOWN||keyCode==KeyE vent.VK_S){isDown=false;}}packagecom;importimportimportimportimportimportpublicclassPower{ImagePowerImage=null;publicvoiddraw(Graphicsg){// 画血瓶图片g.drawImage(PowerImage,x,y,null); // 血瓶移动y++;}publicRectanglegetRectangle(){returnnewRectangle(x,y,PowerImage.getWidth(null),Pow erImage.getHeight(null));publicclassPlay01{staticintcount=0;ImagebgImage=null;//战机Planeplane=newPlane();//战机子弹List<MyZiDan>mzds=newArrayList<MyZiDan>(); //敌机List<Diji>dijis=newArrayList<Diji>();//敌机子弹intbgY1=0;intbgY2=-600;intfireTime=0;booleanflag=false;publicvoiddraw(Graphicsg){//画背景图片g.drawImage(bgImage,0,bgY1,null);bgY1+=5;if(bgY1<=600){bgY1=0;}//添加子弹if(isFire1==true&&flag==false){if(fireTime%8==0){mzds.add(newMyZiDan(plane.x+25,plane.y+0));}fireTime++;}if(isFire1==true&&flag==true){ if(fireTime%4==0){Dijidj=dijis.get(i);if(dj.x<-100){dijis.remove(i);}}//抽奖:添加敌机if((int)(Math.random()*20)==5){ dijis.add(newDiji());}//抽奖:添加血瓶for(inti=0;i<powers.size();i++){Powerpower=powers.get(i);power.draw(g);}//画敌机for(inti=0;i<dijis.size();i++){Dijidj=dijis.get(i);dj.draw(g);}//画飞机if(plane.lifeCount<1){PlaneStatus.playStatus=-1;} }}//判断战机和血瓶相撞for(inti=0;i<gifts.size();i++){//先得到每一个血瓶Giftgift=gifts.get(i);Rectangler1=gift.getRectangle();Rectangler2=plane.getRectangle();if(r1.intersects(r2)){if(r1.intersects(r2)){powers.remove(i);flag=true;}}//判断敌机在中弹for(inti=0;i<mzds.size();i++){//得到每个战机子弹MyZiDanmyzidan=mzds.get(i);Rectangler1=myzidan.getRectangle();booleanisFire1=false;booleanisFire2=false; publicvoidkeyPressed(KeyEvente){plane.keyPressed(e);if(e.getKeyCode()==KeyEvent.VK_J){isFire1=true;}/*if(e.getKeyCode()==KeyEvent.VK_K){ isFire2=true;}*/for(inti=0;i<dijis.size();i++)dijis.remove(i);}}}packagecom;importimportimportimporte.printStackTrace();}}publicvoiddraw(Graphicsg){g.drawImage(obg,0,0,null);g.drawImage(ng,120,100,null);g.setColor(Color.black);g.setFont(newFont("幼圆",Font.BOLD,40));g.drawString("游戏结束啦!",200,600);}publicclassMainFrameextendsJFrame{Beforebefore=newBefore();Play01play01=newPlay01();Overover=newOver();publicMainFrame(){// 设置标题this.setTitle("让子弹飞一会~");// 设置大小this.setSize(600,800);// 定位居中before.keyPressed(e);}elseif(PlaneStatus.playStatus==1){play01.keyPressed(e);}elseif(PlaneStatus.playStatus==-1){over.keyPressed(e);}}@Override publicvoidkeyReleased(KeyEvente){ if(PlaneStatus.playStatus==0){try{Thread.sleep(20);}catch(InterruptedExceptione){e.printStackTrace();}}}}.start();// 显示g.drawImage(bufferImage,0,0,null);}publicvoiddraw(Graphicsg){if(PlaneStatus.playStatus==0){before.draw(g);}elseif(PlaneStatus.playStatus==1){ play01.draw(g);}elseif(PlaneStatus.playStatus==-1){ over.draw(g);}ImagezidanImage=null;intx;inty;publicMyZiDan(intx,inty){this.x=x;this.y=y;try{zidanImage=.getResourceAsStream("images/zidan.png"));}catch(IOExceptione){mage.getHeight(null));}}packagecom;importimportimportimportimportimport}catch(IOExceptione){e.printStackTrace();}}publicvoiddraw(Graphicsg){// 画敌机图片g.drawImage(dijiImage,x,y,null); // 敌机移动if(r==1){y+=4;packagecom;importimportimportimportimportimportpublicclassGift{ImageGiftImage=null;intx=20;g.drawImage(GiftImage,x,y,null); // 血瓶移动y++;}publicRectanglegetRectangle(){returnnewRectangle(x,y,GiftImage.getWidth(null),GiftIma ge.getHeight(null));}}this.x=x;this.y=y;fangxiang=(int)(Math.random()*5);//0~7try{zidanImage=.getResourceAsStream("images/dijizidan.jpg"));}catch(IOExceptione){e.printStackTrace();}// 左x=x-2;}elseif(fangxiang==2){// 右x=x+2;}elseif(fangxiang==3){ // 左下x=x-2;y=y+2;}elseif(fangxiang==4){importimportimportimportimportimportimport//游戏开始之前publicclassBefore{Imagebg=null;e.printStackTrace();}}inttime=0;publicvoiddraw(Graphicsg){if(PlaneStatus.roleNum==1){//画妹妹g.drawImage(bg,0,0,null);g.drawImage(wfeiji,260,600,null);g.drawImage(kdiji1,200,50,null);g.setColor(Color.YELLOW);g.setFont(newFont("幼圆",Font.BOLD,30)); if(time<=10){g.drawString("[Enter]>>",50,750);}elseif(time<=20){g.drawString("[Enter]>>",50,750);}elseif(time<=30){g.drawString("[Enter]>>",50,750);if(time==30){time=0;互换}}publicvoidkeyReleased(KeyEvente){}}。
java飞机大战游戏课程设计一、课程目标知识目标:1. 学生能理解Java编程语言的基本语法和结构,掌握面向对象编程的基本思想。
2. 学生能运用Java语言实现飞机大战游戏的基本功能,如角色移动、发射子弹、碰撞检测等。
3. 学生了解游戏开发中的坐标系统、动画效果实现及事件处理机制。
技能目标:1. 学生能运用Java编程环境进行代码编写、调试和运行,培养编程实践能力。
2. 学生通过分析问题、设计解决方案,培养解决问题和逻辑思维能力。
3. 学生通过团队协作,提高沟通与协作能力,共同完成飞机大战游戏的开发。
情感态度价值观目标:1. 学生对Java编程产生兴趣,树立学习自信心,养成主动学习的习惯。
2. 学生在游戏开发过程中,体验编程的乐趣,培养创新精神和探索精神。
3. 学生在团队协作中,学会尊重他人、倾听他人意见,培养团队精神和集体荣誉感。
课程性质:本课程为实践性强的课程,结合游戏开发,提高学生对Java编程的兴趣和动手能力。
学生特点:学生对游戏有浓厚的兴趣,具有较强的动手能力和好奇心,但可能缺乏编程基础和团队协作经验。
教学要求:注重理论与实践相结合,引导学生通过实践掌握Java编程技能,培养团队协作能力和创新精神。
将课程目标分解为具体的学习成果,以便于教学设计和评估。
二、教学内容1. Java基本语法和结构复习:包括变量、数据类型、运算符、控制流程(条件语句、循环语句)等,为学生编程基础打下坚实基础。
教材章节:第一章至第三章2. 面向对象编程基础:介绍类、对象、封装、继承、多态等概念,让学生理解并掌握面向对象编程的基本思想。
教材章节:第四章至第六章3. Java图形用户界面(GUI)编程:学习Swing库,实现飞机大战游戏的窗口、界面设计。
教材章节:第七章4. 游戏开发相关技术:介绍坐标系统、动画效果实现、事件处理机制、碰撞检测等,为学生开发飞机大战游戏提供技术支持。
教材章节:第八章、第十章5. 实践项目:飞机大战游戏开发。
java飞机大战 课程设计一、课程目标知识目标:1. 理解Java基本语法和面向对象编程概念;2. 掌握使用Java编写图形用户界面(GUI)程序;3. 学会运用数组、循环和条件语句实现游戏逻辑;4. 了解声音、图像等多媒体元素在Java中的应用。
技能目标:1. 能够运用面向对象思想设计和实现飞机大战游戏中的角色、子弹和敌机;2. 独立编写游戏主循环,实现角色移动、发射子弹和敌机生成等功能;3. 掌握游戏音效和图像的加载与播放;4. 学会调试和优化代码,解决程序运行中的问题。
情感态度价值观目标:1. 培养学生对编程的兴趣和热情,激发学习动力;2. 培养学生的团队协作意识,学会与他人共同解决问题;3. 培养学生的创新思维,鼓励尝试不同游戏设计;4. 培养学生面对困难不退缩,勇于克服问题的精神。
课程性质:本课程为信息技术课程,旨在让学生在实践操作中掌握Java编程基础,培养编程兴趣和实际操作能力。
学生特点:本课程针对八年级学生,他们对新鲜事物充满好奇,动手能力强,但注意力容易分散,需要通过趣味性的教学活动保持兴趣。
教学要求:结合学生特点,教师应采用任务驱动、案例教学等方法,引导学生主动探究,注重实践操作,确保学生能够达到课程目标所设定的具体学习成果。
同时,对学生的学习成果进行有效评估,为后续教学提供依据。
二、教学内容1. Java基本语法与面向对象编程:- 数据类型、变量、运算符;- 控制结构:分支、循环;- 面向对象:类与对象、构造方法、继承与多态。
2. Java图形用户界面编程:- JFrame、JPanel的使用;- 事件处理机制;- 常用组件的布局与绘制。
3. 游戏设计:- 游戏角色设计:玩家飞机、敌机、子弹;- 游戏逻辑实现:移动、碰撞检测、得分与生命值;- 游戏音效与图像加载。
4. 教学大纲:- 第一周:Java基本语法复习,介绍面向对象编程概念;- 第二周:图形用户界面编程,实现游戏窗口;- 第三周:设计游戏角色,编写角色移动和发射子弹功能;- 第四周:实现敌机生成和碰撞检测,完善游戏逻辑;- 第五周:加载游戏音效和图像,优化游戏体验。
java飞机大战设计技术和方法
设计一个类似于飞机大战的游戏需要多方面的知识和技术,以下是一些关键的步骤和考虑因素。
1. 游戏设计:首先,你需要制定游戏规则和目标。
飞机大战是一个射击游戏,玩家需要控制飞机躲避敌机并尽可能多地击落敌机。
你可以设定一些额外的规则,比如有不同的敌机类型,有不同的武器升级等等。
2. 游戏引擎:需要选择一个游戏引擎来开发你的游戏。
Java有许多可用的游戏引擎,例如LibGDX和JavaFX。
这些引擎提供了许多工具和库,可以帮助你更容易地开发游戏。
3. 图形和动画:游戏需要图形和动画来提供视觉效果。
你可以使用图像编辑器(例如Photoshop或GIMP)来创建你的图形和动画,然后使用游戏引擎提供的工具将它们导入到游戏中。
4. 用户界面:你需要设计一个用户界面,让玩家可以与游戏进行交互。
这可能包括控制面板、分数显示、生命值显示等等。
你可以使用游戏引擎提供的工具来创建用户界面。
5. 游戏逻辑:这是游戏最重要的部分。
你需要编写代码来处理游戏逻辑,例如控制飞机移动、处理射击和碰撞、管理游戏状态等等。
你还需要编写代码来处理游戏音效和背景音乐。
6. 测试和调试:在开发过程中,你需要不断地测试和调试你的游戏。
你可以使用不同的设备和配置来测试游戏的兼容性,并修复任何发现的问题。
以上就是设计一个类似于飞机大战的Java游戏的基本步骤。
具体的实现方式会根据你的需求和目标而有所不同。
java飞机大战心得体会【导语】下面是作者帮大家整理的java飞机大战心得体会(共16篇),希望对大家有所帮助。
篇1:java飞机大战心得体会1.首先有玩家类,窗口类,主函数类和图片文件()2.然后是先行知识,创建窗口(JFrame),设置窗口属性;窗口上不能直接添加组件(键盘监听等),所以先在窗口上添加容器(Jpanel),将组件(KeyAdapter)添加到容器;3.画出玩家:重写窗口类中的paintponent方法,创建Graphics对象,调用drawImage方法可画图,调用drawString方法可标注其名字4.移动:在窗口类中创建键盘监听抽象类KeyAdapter(实现了接口的部分方法但无具体操作),需要重写该类的Keypressed方法和KeyRleased方法,赋给按键变量真值,随后将该对象添加到窗口5.随机生成初始坐标:在开始游戏后随机给定玩家的x、y坐标,创建Random 对象,调用(n)方法,n代表从[0,n)区间的随机值。
6.最后通过一个(匿名内部类对象,指定延迟后开始,周期)方法来实现移动效果。
匿名内部类【TimerTask的子类,重写了run方法,包括repaint方法(实则调用paintponent)和yidong方法】来重画、监听键盘的指令并作出相应动作下面是源代码(有注释):容器类package a;import ._;import ._;import .;import .;import ;import ;import ;import static ;//新建面板public class War extends JPanel {private Timer timer;private boolean sUp, sDown, sRight, sLeft;//右飞机按键变量private boolean sW, sD, sS, sA;//左飞机按键变量private Player1 player1 = new Player1();private Player2 player2 = new Player2();private ImageIcon img11 = ;private ImageIcon img22 = ;Overrideprotected void paintponent(Graphics g) {(g);//此句调用父类方法进行界面重绘,恢复到某个界面,下面的步骤再画玩家;如果注释掉会有重影//在面板上画出玩家((), , , 100, 100, this);(“P1”, , );((), , , 100, 100, this);(“P2”, , );}public void startGame() {timer = new Timer();(new TimerTask() {//匿名内部类(TimerTask的子类)Overridepublic void run() {//重写run()函数repaint();//调用重写的paintponent来画两飞机yidong();//并每次判断按下哪个键,然后移动}}, 0, 50);//安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。
java飞机大战项目总结:大战飞机项目 java 达内飞机大战项目总结java飞机大战项目描述j ava飞机大战答辩ppt篇一:飞机大战JAVA程序设计报告中国地质大学长城学院Java 程序设计题目基于Java的打飞机游戏设计与实现系别信息工程系专业计算机科学与技术学生姓名马辉学号041120101 指导教师田玉龙2015 年6 月18 日基于Java的打飞机游戏设计与实现1、软件运行所需要的软硬件环境本系统是以Windows系统为操作平台,用Java编程语言来实现本系统所需功能的。
本机器的配置如下:处理器:AMD A4 或英特尔同级别处理器主频:1.2Hz以上内存:1G以上硬盘:HHD 50G或更高采用的主要技术和软件编程语言:Java 开发环境:windows7 开发软件:Eclipse 3.72、软件开发环境配置JAVA_HOME = F:\JAVA\jdkPATH = % JAVA_HOME%\bin;%JAVA_HOME%\lib;%JAVA_HOME%\jre\lib;CLASSPATH = %JAVA_HOME%\lib;%JAVA_HOME%\jre\lib;3、软件功能框图4、软件所实现的截图5、主要功能部分的源代码import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.Random; import java.util.Vector;import javax.swing.JOptionPane; import javax.swing.Timer; public class Controller extends KeyAdapter{public static VectorBang bangs = new VectorBang(); public static VectorEBullet ebullets = new VectorEBullet(); public static VectorPBullet pbullets = new VectorPBullet(); public static VectorEPlane eplanes = new VectorEPlane(); public static PPlane pplane = new PPlane(); private GamePanel gamePanel;private Random random = new Random(); public static int baoZhaNum;public Controller(VectorBang bang,VectorEBullet ebullet,VectorPBullet pbullet,VectorEPlane eplane,PPlane pplane,GamePanel gamePanel) { super();this.bangs = bang; this.ebullets = ebullet; this.pbullets = pbullet;this.eplanes = eplane; this.pplane = pplane; this.gamePanel = gamePanel;//使用定时器每隔一秒为每一个敌机产生一个子弹Timer timer = new Timer(1000, new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stub for(int i=0;i eplanes.size();i++){ }EBullet ebullet = new EBullet(eplanes.elementAt(i).x,eplanes.elementAt(i).y,8,2);ebullets.add(ebullet);}});}timer.start(); //声明定时器之后就开启定时器@Overridepublic void keyPressed(KeyEvent e) { } @Overridepublic void keyReleased(KeyEvent e) {// TODO Auto-generated method stub switch (e.getKeyCode()){ case KeyEvent.VK_UP:PPlane.UP = false; break;PPlane.DOWN = false; break;PPlane.LEFT = false; break;// TODO Auto-generated method stub switch (e.getKeyCode()){ } case KeyEvent.VK_UP:PPlane.UP = true; break;PPlane.DOWN = true; break;PPlane.LEFT = true; break;PPlane.RIGHT = true; break;PPlane.isFired = true; break;case KeyEvent.VK_DOWN:case KeyEvent.VK_LEFT:case KeyEvent.VK_RIGHT:case KeyEvent.VK_X:case KeyEvent.VK_DOWN:case KeyEvent.VK_LEFT:篇二:飞机大战设计报告+开发计划项目设计报告项目名称:进击的飞机目录一、游戏整体概括 (3)1.1 游戏概括...................................................................................................... .. 3 1.2 开发环境...................................................................................................... .. 3 二、系统需求分析 (3)2.1用户功能需求分析.................................................................................... 3 2.2系统性能要求............................................................................................3 2.3业务流程分析............................................................................................ 4 三、系统总体设计 (4)3.1 系统功能模块分析...................................................................................... 4 3.2 系统类关系图. (4)3.3 系统总体设计 (5)四、系统详细设计......................................................................................................74.1开发工具简介............................................................................................ 7 4.2游戏界面设计.. (8)4.2.1游戏开始界面ReadyView ........................................................... 8 4.2.2游戏主界面MainView .. (9)4.2.2.1 鼠标控制玩家飞机移动........................................................ 9 4.2.2.2 碰撞逻辑.............................................................................. 10 4.2.2.3 游戏暂停.............................................................................. 10 4.2.3帮助界面HelpView . (11)4.2.4游戏失败界面EndView (11)五、游戏开发计划....................................................................................................125.1游戏开发计划表...................................................................................... 12 5.2游戏开发计划具体分工.. (14)一、游戏整体概括1.1 游戏概括本项目是一个基于android平台的、集休闲娱乐、互动交友、丰富生活等诸多元素与一身的手机竞技类游戏。
java飞机大战游戏课程设计一、课程目标知识目标:1. 让学生掌握Java基本语法和编程规范,能运用面向对象编程思想设计类和对象;2. 让学生掌握Java图形用户界面(GUI)编程,实现飞机大战游戏的界面设计;3. 让学生了解并运用Java事件处理机制,实现游戏中的交互功能;4. 让学生掌握Java多线程编程,实现飞机、敌人和子弹的协同运动。
技能目标:1. 培养学生运用Java编程解决实际问题的能力,能独立设计并完成一个简单的飞机大战游戏;2. 培养学生运用面向对象编程思想分析问题、设计解决方案的能力;3. 培养学生运用Java多线程编程技术,实现复杂场景下多对象协同运动的能力;4. 培养学生团队协作能力,能在小组合作中发挥个人优势,共同完成项目。
情感态度价值观目标:1. 培养学生对计算机编程的兴趣和热情,激发学生主动探索新技术、新方法的意愿;2. 培养学生面对困难和挑战时保持积极态度,勇于尝试、不断调整解决问题的方法;3. 培养学生具备良好的编程习惯,注重代码规范和团队合作,提高代码质量;4. 培养学生认识到编程在现实生活中的应用价值,提高社会责任感和创新意识。
二、教学内容1. Java基本语法与编程规范:回顾Java基本数据类型、运算符、控制结构等基础知识,强调面向对象编程规范,引入类与对象的概念。
教材章节:第一章 Java语言概述,第二章 Java基本语法,第三章 面向对象编程基础。
2. Java图形用户界面(GUI)编程:介绍Swing图形用户界面组件,重点讲解JFrame、JPanel的使用,布局管理器的选择,以及绘图方法。
教材章节:第七章 Swing图形用户界面编程。
3. Java事件处理机制:讲解事件监听器、事件对象的概念,以及如何在游戏中实现键盘和鼠标事件的处理。
教材章节:第八章 Java事件处理。
4. Java多线程编程:介绍线程的概念、创建方法,同步与互斥机制,以及如何在游戏中实现飞机、敌人和子弹的协同运动。
java实现飞机⼤战案例详解前⾔飞机⼤战是⼀个⾮常经典的案例,因为它包含了多种新⼿需要掌握的概念,是⼀个⾮常契合⾯向对象思想的⼊门练习案例程序分析:在此游戏中共有六个对象:⼩敌机Airplane,⼤敌机BigAirplane,⼩蜜蜂Bee,天空Sky,英雄机Hero,⼦弹Bullet其次我们还需要三个类:超类Flyer,图⽚类Images,测试类World还需:英雄机2张,⼩敌机,⼤敌机,⼩蜜蜂,⼦弹,天空各1张,爆炸图4张,游戏开始,暂停,游戏结束各1张,共14张图⽚放⼊与图⽚类Images同包中超类Flyer:此类是⽤来封装所有对象共有的⾏为及属性的不管是写什么程序,都建议遵循两点:数据私有化,⾏为公开化import java.util.Random;import java.awt.image.BufferedImage;public abstract class Flyer {//所有对象都有三种状态:活着的,死了的,及删除的//这⾥之所以选择⽤常量表⽰状态是因为⾸先状态是⼀个不需要去修改的值//其次状态需要反复使⽤所以结合这两个特点,我选择了使⽤常量表⽰//state是⽤来表⽰当前状态的,每个对象都有⼀个实时的状态,此状态是会改变的,且初始状态都是活着的public static final int LIVE = 0;//活着的public static final int DEAD = 1;//死了的public static final int REMOVE = 2;//删除的protected int state = LIVE;//当前状态(默认状态为活着的)每个对象都是⼀张图⽚,既然是图⽚那么就⼀定有宽⾼,其次因为每个对象都是会随时移动的即为都有x,y坐标protected int width;//宽protected int height;//⾼protected int x;//左右移动(x坐标)protected int y;//上下移动(y坐标)/*** 飞⾏物移动(抽象)* 每个飞⾏物都是会移动的,但是移动⽅式不同* 所以这⾥就将共有的⾏为抽到了超类中* 但是设置成了抽象⽅法,实现了多态的效果*/public abstract void step();/*** 获取图⽚(抽象)* 所有对象都是图⽚但图⽚不相同所以抽象化了*/public abstract BufferedImage getImage();/*** 判断对象是否是活着的*/public boolean isLive(){return state == LIVE;}/*** 判断对象是否是死了的*/public boolean isDead(){return state == DEAD;}/*** 判断对象是否删除了*/public boolean isRemove(){return state == REMOVE;}/*** 判断对象(⼤敌机,⼩敌机,⼩蜜蜂)是否越界* 当敌⼈越界我们就需要删除它否则程序越执⾏越卡,会出现内存泄露的问题,此⽅法就是为后续删除越界对象做铺垫的 * @return*/public boolean isOutOfBounds(){return y >= World.HEIGHT;}/*** 给⼩/⼤敌机,⼩蜜蜂提供的* 因为三种飞⾏物的宽,⾼不同所以不能写死。
JAVA课程设计-飞机⼤战JAVA课程设计-飞机⼤战1.团队名称、团队成员介绍1.1 团队名称:做个飞机哦1.2团队成员介绍:余俊良(组长):编写博客、游戏主界⾯设计与实现、英雄机与⼦弹类的实现、场景设计林祥涛:游戏⾳效设计、玩家类编码与设计、⼩Boss类设计、ppt设计⾼凯:画uml类图、积分榜设计、游戏道具定义实现、游戏状态设计2.项⽬git地址3.项⽬git提交记录截图4.前期调查及游戏介绍玩家通过控制飞机发射⼦弹击中不同的敌机获取积分,击中快速移动的浮标获得奖励(获得双倍⼦弹奖励、⽣命值增加)。
游戏过程伴随着背景⾳乐,⽽且击中敌机或⽣命耗尽后会产⽣相应⾳效。
与敌机相撞则扣除⽣命值1点,直到⽣命值为0,游戏结束,玩法简单有趣,锻炼反应能⼒。
5.项⽬功能架构图、主要功能流程图6.⾯向对象设计包图、类图包图类图7.项⽬运⾏截图主界⾯显⽰英雄机普通敌机精英机⼩boss切换飞机双倍⼦弹模式排⾏榜奖励游戏结束8.项⽬关键代码8.1⿏标事件使⽤⿏标事件监听MouseAdapter对⿏标进⾏监听,当⿏标移动时获取⿏标的坐标,点击时开启游戏,⿏标移出窗体后游戏暂停,移⼊则继续。
MouseAdapter m = new MouseAdapter() {// ⿏标移动事件public void mouseMoved(MouseEvent e) {// ⿏标坐标获取if (Running == state) {hero.moveTo(e.getX(), e.getY());}}// ⿏标点击事件public void mouseClicked(MouseEvent e) {if (Start == state) {// 点击开始游戏state = Running;} else if (Over == state) {// 游戏结束后点击重新开始state = Start;score = 0;// 积分,飞⾏物重置hero = new Heroplane();flyobj = new ArrayList<AbstractFlyingObject>();bullets = new ArrayList<Bullet>();}}// ⿏标移出事件public void mouseExited(MouseEvent e) {if (Running == state) {// 移出窗体,游戏暂停state = Pause;}}// ⿏标移⼊事件public void mouseEntered(MouseEvent e) {// 移回窗体,游戏继续if (Pause == state) {state = Running;}}};8.2双缓冲技术消除闪屏闪屏的出现是因为在while循环中执⾏线程时每循环⼀次便会重绘⼀次,⽽update()⽅法即会先清理掉当前的画⾯再重新绘制新的画⾯。
此小程序适合java初学者练手之用效果图(Plane .java)package beans;import java.awt.Image;import java.io.Serializable;import javax.swing.ImageIcon;public class Plane implements Serializable{private Image myImage;private int x;private int y;private int life;private boolean isRun;public Plane(Image myImage, int x, int y, int life, boolean isRun) { super();this.myImage = myImage;this.x = x;this.y = y;this.life = life;this.isRun = isRun;}// public Plane(ImageIcon imageIcon, int x2, int y2, int life2, boolean isRun2) { // TODO Auto-generated constructor stub// }public Image getMyImage() {return myImage;}public void setMyImage(Image myImage) {this.myImage = myImage;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public int getLife() {return life;}public void setLife(int life) {this.life = life;}public boolean isRun() {return isRun;}public void setRun(boolean isRun) {this.isRun = isRun;}}(FrmPlane .java)package gui;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Image;import youtManager;import java.awt.Rectangle;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.util.ArrayList;import java.util.List;import java.util.Random;import java.util.prefs.BackingStoreException;import javax.sound.midi.Receiver;import javax.swing.ImageIcon;import beans.Plane;import mon.FrmAdpter;public class FrmPlane extends FrmAdpter{ImageIcon icon,backImg,background;int backy;//yzhouImage bufferImg;Plane hero,enemy,bullet;Random rd=new Random();int mark;ArrayList<Plane> emyList=new ArrayList<Plane>();//敌机ArrayList<Plane> bulList=new ArrayList<Plane>();//子弹public FrmPlane() {super("飞机大战", 400, 480, false, true,0, 0, null);//background=frmP.setIconImage("image/bgstar.gif");backImg=new ImageIcon("image/bgstar.gif");//this.setBackground(new Color(0, 130, 190));icon=new ImageIcon("image/logo.png");//logosuper.setIconImage(icon.getImage());hero=new Plane(new ImageIcon("image/hero.png").getImage(),160,390,3,true);//"敌机"线程Enemy am1=new Enemy();Thread t2=new Thread(am1);t2.start();//"子弹"线程Bullet b=new Bullet();Thread tbul=new Thread(b);tbul.start();//敌机与子弹EnemyBullet eb=new EnemyBullet();Thread tEB=new Thread(eb);tEB.start();//"移动"线程Move m=new Move();m.fp=this;Thread mThread=new Thread(m);mThread.start();this.addKeyListener(this);this.setFont(new Font("koko", 10, 25));this.setForeground(new Color(250,250,0));super.setVisible(true);}//双缓冲public void paint(Graphics g) {// super.paint(g);再绘,闪屏if(bufferImg==null) {//画笔bufferImg=this.createImage(this.getWidth(), this.getHeight());}//根据画笔创建一个画布,背景Graphics g2=bufferImg.getGraphics();g2.drawImage(backImg.getImage(),0,backy,null);//英雄g2.drawImage(hero.getMyImage(),hero.getX(),hero.getY(),null);//敌机for (int i = 0; i < emyList.size(); i++) {g2.drawImage(emyList.get(i).getMyImage(),emyList.get(i).getX(),emyList.get(i).getY(), null);//子弹for(int i=0;i<bulList.size();i++) {g2.drawImage(bulList.get(i).getMyImage(), bulList.get(i).getX(), bulList.get(i).getY(), null);}g2.drawString("分数:"+mark, 20, 450);//缓冲画布一次性画到g.drawImage(bufferImg,0,0,null);}//敌机生成class Enemy implements Runnable {//FrmPlane fp;@Overridepublic void run() {while(true) {try {Thread.sleep(1000);Plane army=new Plane(new ImageIcon("image/enemy.png").getImage(), rd.nextInt(350)+30, 30, 1, true);//.getImage()emyList.add(army);} catch (InterruptedException e) {e.printStackTrace();}}}}//子弹生成class Bullet implements Runnable {public void run() {while(true) {try {Thread.sleep(600);Plane bullet=new Plane(new ImageIcon("image/bullet.png").getImage(),hero.getX()+40,hero.getY()-10,1,true);bulList.add(bullet);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}//敌机与子弹class EnemyBullet implements Runnable {public void run() {while(true) {for(int i=0;i<emyList.size();i++) {Plane Renemy=emyList.get(i);for(int j=0;j<bulList.size();j++) {Plane Rbullet=bulList.get(j);if(Renemy==null||Renemy.getMyImage()==null) {break;}if(Rbullet==null||Rbullet.getMyImage()==null) {break;}//将图片转换为矩形以便判断Rectangle recEnemy=new Rectangle(Renemy.getX(),Renemy.getY(),Renemy.getMyImage().getWidth(null),Renemy.getMyImage().getHeight(null));Rectangle recBullet=new Rectangle(Rbullet.getX(),Rbullet.getY(),Rbullet.getMyImage().getWidth(null),Rbullet.getMyImage().getHeight(null));if(recEnemy.intersects(recBullet)) {//检测碰撞emyList.remove(i);bulList.remove(j);mark++;break;}}}}}}//所有移动class Move implements Runnable {FrmPlane fp;@Overridepublic void run() {while(true) {//画布坐标动// backy--;// if(Math.abs(backy)==1800) {// backy=0;// }//敌人的飞机动for (int i = 0; i < emyList.size(); i++) {emyList.get(i).setY(emyList.get(i).getY()+2);}//子弹的移动for(int i=0;i<bulList.size();i++) {bulList.get(i).setY(bulList.get(i).getY()-2);}try {Thread.sleep(30);} catch (InterruptedException e) {e.printStackTrace();}fp.repaint();}}}//键盘移动事件@Overridepublic void keyPressed(KeyEvent e) {super.keyPressed(e);char choice;choice=e.getKeyChar();switch (choice) {case 'w':hero.setY(hero.getY()-3);break;case 's':hero.setY(hero.getY()+3);break;case 'a':hero.setX(hero.getX()-3);break;case 'd':hero.setX(hero.getX()+3);break;}}/*private class backThread implements Runnable {FrmPlane fp;@Overridepublic void run() {while(true) {backy--;if(Math.abs(backy)==1500) {//1500即一个数值<画布长度-窗体长度backy=0;}try {Thread.sleep(20);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}fp.repaint();}}}*/public static void main(String[] args) {new FrmPlane();}}(FrmAdpter.java)package mon;import java.awt.Container;import youtManager;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.FocusEvent;import java.awt.event.FocusListener;import java.awt.event.ItemEvent;import java.awt.event.ItemListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.event.MouseMotionListener;import java.awt.event.WindowEvent;import java.awt.event.WindowListener;import javax.swing.JFrame;public class FrmAdpter extends JFrame implements ActionListener,KeyListener,MouseListener,MouseMotionListener,WindowListener,FocusListener,ItemListener { protected Container container;public FrmAdpter(String title,int w,int h,boolean resize,boolean location,int x,int y,LayoutManager layout){super.setTitle(title);super.setSize(w, h);super.setResizable(resize);if(location)super.setLocationRelativeTo(null);elsesuper.setLocation(x, y);super.setDefaultCloseOperation(3);container=super.getContentPane();container.setLayout(layout);}@Overridepublic void itemStateChanged(ItemEvent e) {// TODO Auto-generated method stub}@Overridepublic void focusGained(FocusEvent e) {// TODO Auto-generated method stub}@Overridepublic void focusLost(FocusEvent e) {// TODO Auto-generated method stub}@Overridepublic void windowOpened(WindowEvent e) {// TODO Auto-generated method stub}@Overridepublic void windowClosing(WindowEvent e) { // TODO Auto-generated method stub}@Overridepublic void windowClosed(WindowEvent e) { // TODO Auto-generated method stub}@Overridepublic void windowIconified(WindowEvent e) { // TODO Auto-generated method stub}@Overridepublic void windowDeiconified(WindowEvent e) { // TODO Auto-generated method stub}@Overridepublic void windowActivated(WindowEvent e) { // TODO Auto-generated method stub}@Overridepublic void windowDeactivated(WindowEvent e) { // TODO Auto-generated method stub}@Overridepublic void mouseDragged(MouseEvent e) { // TODO Auto-generated method stub}@Overridepublic void mouseMoved(MouseEvent e) { // TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) { // TODO Auto-generated method stub}@Overridepublic void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent e) { // TODO Auto-generated method stub}@Overridepublic void keyTyped(KeyEvent e) {// TODO Auto-generated method stub}@Overridepublic void keyPressed(KeyEvent e) {// TODO Auto-generated method stub}@Overridepublic void keyReleased(KeyEvent e) {// TODO Auto-generated method stub}@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stub}}(FrmDailogAdpter.java)package mon;import java.awt.Container;import java.awt.Frame;import youtManager;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.FocusEvent;import java.awt.event.FocusListener;import java.awt.event.ItemEvent;import java.awt.event.ItemListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.event.MouseMotionListener;import java.awt.event.WindowEvent;import java.awt.event.WindowListener;import javax.swing.JDialog;public class FrmDailogAdpter extends JDialog implements ActionListener,KeyListener, MouseListener,MouseMotionListener,WindowListener,FocusListener,ItemListener {protected Container container;public FrmDailogAdpter(Frame owner,String title,int w,int h,boolean resize,boolean location,int x,int y,LayoutManager layout){super(owner, true);super.setTitle(title);super.setSize(w, h);super.setResizable(resize);if(location)super.setLocationRelativeTo(null);elsesuper.setLocation(x, y);super.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);container=super.getContentPane();container.setLayout(layout);}@Overridepublic void itemStateChanged(ItemEvent e) {// TODO Auto-generated method stub}@Overridepublic void focusGained(FocusEvent e) {// TODO Auto-generated method stub}@Overridepublic void focusLost(FocusEvent e) {// TODO Auto-generated method stub}@Overridepublic void windowOpened(WindowEvent e) {// TODO Auto-generated method stub}@Overridepublic void windowClosing(WindowEvent e) { // TODO Auto-generated method stub}@Overridepublic void windowClosed(WindowEvent e) { // TODO Auto-generated method stub}@Overridepublic void windowIconified(WindowEvent e) { // TODO Auto-generated method stub}@Overridepublic void windowDeiconified(WindowEvent e) { // TODO Auto-generated method stub}@Overridepublic void windowActivated(WindowEvent e) { // TODO Auto-generated method stub}@Overridepublic void windowDeactivated(WindowEvent e) { // TODO Auto-generated method stub}@Overridepublic void mouseDragged(MouseEvent e) { // TODO Auto-generated method stub}@Overridepublic void mouseMoved(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) { // TODO Auto-generated method stub}@Overridepublic void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent e) { // TODO Auto-generated method stub}@Overridepublic void keyTyped(KeyEvent e) {// TODO Auto-generated method stub}@Overridepublic void keyPressed(KeyEvent e) {// TODO Auto-generated method stub}@Overridepublic void keyReleased(KeyEvent e) {// TODO Auto-generated method stub}@Overridepublic void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub}}。