基于Java的飞机大战游戏开发
- 格式:docx
- 大小:31.46 KB
- 文档页数:34
用Java实现一个简单的打飞机游戏打飞机游戏是一类经典的游戏,具有简单、刺激和容易上手的特点。
在本文中,我们将使用Java编程语言来实现一个简单的打飞机游戏。
要实现这个游戏,我们可以分为三个主要的步骤:游戏初始化、游戏逻辑和游戏界面。
第一步是游戏初始化。
我们需要设置游戏窗口的大小和标题,以及创建游戏界面所需的元素,如玩家飞机、敌机和子弹。
我们可以使用Java提供的图形库,如AWT或JavaFX来创建游戏窗口和界面元素。
第二步是游戏逻辑。
我们需要定义游戏的规则和行为。
首先,我们需要让玩家飞机可以根据用户的输入(如键盘按键)进行移动。
然后,我们需要创建敌机,并使其在游戏界面上自动移动。
接下来,我们需要创建子弹,并使其可以击中敌机。
当玩家的飞机与敌机相撞或者子弹击中敌机时,游戏将结束。
最后一步是游戏界面。
我们需要定义游戏界面的显示方式。
可以在游戏界面上显示玩家的飞机和敌机,并实时更新它们的位置。
还可以显示分数和游戏状态,以提供更好的游戏体验。
下面是一个简单的示例代码,演示了如何使用Java实现一个简单的打飞机游戏:```javaimport javax.swing.*;import java.awt.*;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;public class SimplePlaneGame extends JFrame implements KeyListener {private final int WINDOW_WIDTH = 800;private final int WINDOW_HEIGHT = 600;private int playerX = 400;private int playerY = 500;private boolean gameRunning = true;public SimplePlaneGame() {setTitle("Simple Plane Game");setSize(WINDOW_WIDTH, WINDOW_HEIGHT);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setResizable(false);setLocationRelativeTo(null);setLayout(null);setVisible(true);addKeyListener(this);}public void paint(Graphics g) {super.paint(g);g.setColor(Color.BLUE);g.fillRect(playerX, playerY, 50, 50);}public void keyPressed(KeyEvent e) {if (e.getKeyCode() == KeyEvent.VK_LEFT) {playerX -= 5;repaint();} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { playerX += 5;repaint();}}public void keyReleased(KeyEvent e) {}public void keyTyped(KeyEvent e) {}public static void main(String[] args) {SimplePlaneGame game = new SimplePlaneGame();while (game.gameRunning) {try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}}```在这个示例中,我们使用了一个继承自JFrame的类来创建游戏窗口。
一、概述1.1 背景介绍Java飞机大作战是一款基于Java语言开发的2D飞行射击游戏,具有良好的用户体验和高度可玩性,适合游戏开发初学者进行实训和学习。
1.2 目的和意义通过实训Java飞机大作战,可以提高学习者对Java语言的理解和运用能力,培养他们的编程思维和团队合作精神,为未来从事游戏开发或软件工程工作打下良好的基础。
二、实训步骤2.1 环境准备1)安装Java开发工具包(JDK):在全球信息站下载最新版本的JDK,并按照冠方指引进行安装。
2)安装集成开发环境(IDE):推荐使用Eclipse或IntelliJ IDEA作为开发工具,安装并配置好相应的插件和扩展。
2.2 项目创建1)新建Java项目:在IDE中创建一个新的Java项目,命名为“PlaneBattle”。
2)导入游戏资源:将游戏所需的图片、音效等资源文件导入项目中,并进行相关的配置。
2.3 游戏界面设计1)绘制游戏背景:使用图形绘制工具在游戏窗口中设计游戏的背景,包括天空、地面和其他背景元素。
2)设计游戏角色:绘制飞机、敌机、子弹等游戏角色,并设置它们的初始位置和属性。
2.4 游戏功能实现1)玩家操作:编写代码实现玩家操作飞机的功能,包括飞机的移动、射击等。
2)敌机行为:编写代码实现敌机的自动移动和攻击行为,增加游戏的挑战性。
3)碰撞检测:编写代码实现游戏中角色之间的碰撞检测,包括子弹与敌机的碰撞、玩家飞机与敌机的碰撞等。
2.5 游戏优化和测试1)性能优化:对游戏中的关键代码进行优化,提高游戏的运行效率和流畅度。
2)bug修复:测试游戏的各个功能模块,查找和修复可能存在的bug和逻辑错误。
2.6 发布与共享将完成的游戏项目打包成可执行文件,并共享给志同道合的朋友或同学,收集他们的反馈意见并进行改进。
三、实训过程3.1 团队协作在实训过程中,可以组成小组互相协作,分工合作,比如一个同学负责游戏界面的设计,另一个同学负责游戏功能的实现,共同完成一个完整的飞机大作战项目。
毕业设计(论文)任务书第1页第2页第3页基于Java的飞机大战游戏的设计与实现摘要现如今,随着智能手机的兴起与普及,加上4G(the 4th Generation mobile communication ,第四代移动通信技术)网络的深入,越来越多的IT行业开始向手机行业转移重心。
而手机行业中游戏方面的利润所占比重较大,并且手机游戏大多数则是由Java语言开发研制的。
所以我想顺应时代发展,用学到的Java知识对游戏进行一次深入的了解与创作。
Java语言在我们大学学习中占了很大的比重,其优点甚多:面向对象,可靠,安全,多平台可移植,高性能,多线程等。
面向对象是相对于c语言的面向过程来说的,在面向对象编程中,我们用Java去新建一个对象,调用其方法就能实现我们的目标,并不需要了解这个对象的方法的具体实现过程;Java的可靠安全特点体现Java不支持指针,禁止第三方访问,杜绝了外部风险。
所以使用Java开发游戏,是一个正确的选择。
大学学习即将结束,在毕业之际,我想用我4年里学习的知识为自己编写一个属于自己的游戏——飞机大战游戏,为我的大学生活画上圆满的句号。
关键词:Java游戏;面向对象;可靠安全;多线程Design And Implementation Of Airplane WargameBased On JavaAbstractNowadays, with the emergence and popularization of smart phones, plus 4 g (the 4 th Generation mobile communication, the fourth Generation mobile communication technology) the development of the Internet, more and more in the IT industry began to shift to the mobile phone industry center of gravity. Aspect of the game of the mobile phone industry profits account for a large proportion, and most mobile game is developed by Java language. So I want to keep up with the development of The Times, use Java knowledge for an in-depth understanding of the game and creation.Java language learning in our universities accounted for a large proportion of its many advantages: Object-oriented, reliable, secure, multi-platform portable, high-performance, multi-threading.Object-oriented process-oriented with respect to the terms of the c language, object-oriented programming, specifically we use Java to create a new object, call its methods will be able to achieve our goal,we do not need to know the object's method of implementation ; reliable safety features reflect Java Java does not support pointers to prohibit third-party access, to eliminate the external risk. Therefore, the use of Java development aircraft war game, is the right choice.University coming to an end, on the occasion of the graduation, I want to use my four years studying knowledge and made themselves a game of their own - Aircraft war game for my college life painting satisfactory conclusion.Keywords:Java game; object oriented; reliable and secure; multi thread目录1 引言 (1)1.1 项目背景 (1)1. 2 国内外研究现状 (3)1.3 项目主要工作 (4)1.4 本文组织结构 (6)2 开发平台与开发技术 (7)2. 1 IntelliJ IDEA简介 (7)2. 2 IntelliJ IDEA与Eclipse 、MyEclipse的比较 (8)2. 3 Java (10)3 可行性研究 (13)3. 1 技术可行性 (13)3. 2 经济可行性 (13)3. 3 操作可行性 (14)3. 4 用户使用可行性 (14)3. 5 法律可行性 (14)4 需求分析 (15)4. 1 系统需求概述 (16)4. 2 功能模块设计 (17)4.2.1 游戏状态控制功能模块 (17)4.2.2 游戏难度的调整模块 (17)4.2.3 游戏界面绘画功能模块 (17)4.2.4 玩家游戏控制功能模块 (17)4. 3 游戏难点分析 (18)4.3.1 绘图美化 (18)4.3.2 多线程技术的实现 (18)4.3.3 防碰撞问题的解决 (18)4.3.4 动画的实现 (18)5 飞机大战功能实现 (19)5.1 模型图 (19)5.2 软件功能模块 (19)5.3 游戏首页的实现 (20)5.3.1 界面实现 (20)5.3.2 流程图 (21)5.3.3 核心代码 (22)5.4 游戏开始模块的实现 (24)5.4.1 界面实现 (24)5.4.2 流程图 (25)5.4.3 核心代码 (25)5.5 发射子弹模块的实现 (27)5.5.1 界面实现 (27)5.5.2 流程图 (28)5.5.3 核心代码 (29)5.6 积分模块的实现 (33)5.6.1 界面的实现 (33)5.6.2 核心代码 (34)5.7 防碰撞逻辑 (37)5.7.1 核心代码 (37)5.8 游戏操作的实现 (39)5.8.1 核心代码 (39)5.9 特殊NPC蜜蜂 (41)6 系统测试 (42)6.1 测试的定义及其重要性 (43)6.1.1 测试的定义 (43)6.1.2 测试的重要性 (44)6.2 测试方法 (46)6.3 测试结果 (50)7 结论 (51)参考文献 (52)致谢 (54)外文文献 (55)中文翻译 (63)1 引言1.1 项目背景90后的我们,童年最开始接触电子游戏是在游戏厅,那时候的飞机大战游戏机前,往往人山人海,绚丽多彩的画面,带感操作让人沉醉不能自拔。
基于Java的飞机大战游戏的设计与实现摘要飞机大战是电脑游戏发展史中早期最为经典的游戏之一,经常能在掌上游戏机、手机以及电脑上见到这个游戏。
不过,以往常见的飞机大战游戏是二维平面上的,并且大多以黑白的形式出现,当然在电脑上可以看到多种颜色的飞机大战。
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。
Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
本游戏是一个基于java的飞机大战游戏,利用Eclipse平台实现经典的飞机大战游戏。
游戏主要涉及了游戏状态控制功能、游戏难度的调整、游戏界面绘画功能、玩家游戏控制功能,最终展示了游戏开发的基本开发过程和设计思路。
关键词:飞机大战;游戏;java;Eclipse平台Design and implementation of airplane wargame based on JavaAbstractLightning is the history of the development of computer games in the early one of the most classic game, often on a handheld game consoles, mobile phone and computer to see this game. However, the previous common lightning game is two-dimensional plane, and mostly in black and white, in the course of the computer can see lightning in color.Since Java is very popular after the launch, the rapid development of the C + + language to form a strong impact. Java technology has excellent versatility, efficiency, platform portability and security, widely used in personal PC, data center, game consoles, scientific supercomputers, cell phones and the Internet, also has the world's largest developer of professional community . In the world of cloud computing and mobile Internet industry environment, Java and more have a significant advantage and broad prospects.This game is a game based on the realization of Java lightning, lightning classic game based on Eclipse platform. The game is mainly involved in the game state control function, the difficulty of the game, the game interface to adjust the drawing function, game player control function, finally shows the basic development process of game development and design ideas.Keywords: lightning; game; Java; Eclipse platform目录摘要 (i)Abstract (ii)1 引言 (1)1.1 项目背景 (1)1.2 国内外研究现状 (1)1.3 项目主要工作 (1)1.4 本文组织结构 (2)2 开发平台与开发技术 (3)2.1 Eclipse (3)2.2 Eclipse平台 (3)2.3 Java (4)2.4 Java语言的特点与优势 (5)2.5 java技术在游戏开发中的应用 (6)2.6 UML (8)3 飞机大战游戏模块设计 (9)3.1 用户需求分析 (9)3.2 可行性分析 (9)3.3 总体设计原则 (10)3.4 功能模块设计 (11)3.4.1 游戏状态控制功能 (11)3.4.2 游戏难度的调整 (11)3.4.3 游戏界面绘画功能 (11)3.4.4 玩家游戏控制功能 (11)3.5 游戏难点分析 (11)4 飞机大战功能实现 (12)4.1 游戏首页的实现 (12)4.1.1 界面实现 (12)4.1.2 流程图 (13)4.1.3 核心代码 (14)4.2 游戏开始模块的实现 (15)4.2.1 界面实现 (15)4.2.2 流程图 (16)4.2.3 核心代码 (17)4.3 发射子弹模块的实现 (18)4.3.1 界面实现 (18)4.3.2 流程图 (19)4.3.3 核心代码 (20)4.4 积分模块的实现 (22)4.4.1 界面的实现 (22)4.4.2 核心代码 (23)4.5 碰撞逻辑 (26)4.5.1 碰撞画面的实现 (26)4.5.2 核心代码 (27)4.6 游戏玩家与BOSS的血条 (28)4.6.1 玩家血条和BOSS血条的实现 (28)4.6.1 核心代码 (29)4.7 游戏操作的实现 (30)4.7.1 核心代码 (30)5 系统测试 (31)5.1 测试的定义及其重要性 (31)5.1.1 测试的定义 (31)5.1.2 测试的重要性 (31)5.2 测试实例的研究与选择 (31)5.3 测试结果 (32)总结和展望 (33)参考文献 (34)致谢 (35)外文原文 (36)中文翻译 (42)1 引言1.1 项目背景90年代的我们,对小时候的一些经典街机游戏肯定是印象深刻,像“飞机大战”、“超级玛丽”、“坦克大战”等,这些游戏伴随了我们童年,怀旧经典,重温这些经典的游戏,我选择“飞机大战”作为设计的项目。
package ;import java.awt. Color;import java・awt.Font;import java. awt. Graphics;import java・awt.1mage;import java.awt.Rectangle;import java・ awt・ event・ KeyEvent;import java・ io. IOException;import javax・ inuigeio. ImagelO;public class Plane {Image feijiImage = null;int x = 300;int y = 700;int 1ifeCount=5;pub 1 ic Plane () {try {feijiImage 二Image10. read(Plane.class・getClsssLoader()・ getResourceAsStream("images/feiji. png ff));} catch (IOException e) {e. printStackTrace();}}public void draw(Graphics g) {// 画飞机图片g・drawlmage(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)*1 ifeCount, 10);g.setColor(Color・ blue);g. setFont (new Font (M幼圆",Font. BOLD, 30));g. drawString("Score:"+Play01. count, 20, 60);pub1ic void move(){if(isUP && !isDown && !isLeft && !isRight){// 上y=y-5;}else if (! islJP && 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 (! islIP && 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 &&右下x=x+5; y二y+5;boolean isUP = false;boolean isDown = false;boolean isLeft = false;boolean isRight = false;//据下pub1ic void keyPressed(KeyEvent e) { int keyCode = e. getKeyCodeO : !isLeft && isRight){//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 I 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. getKeyCodeO :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 I keyCode == KeyEvent. VK_W){ isUP=false;} else if (keyCode == KeyEvent. VK DOWN keyCode == KeyEvent. VK S){ isDown=false;}}public Rectangle getRectangle() {return new Rec tangle(x,y,feijilmage・ getWidth(null),feijiImage・ getHeight (null));}}package ;public class PlaneStatus {public static int roleNum = 1;publ ic static int playStatus = 0; // 0 游戏开始前1 第一关游戏结束}package ;import java. awt. Graphics;import java・awt・ Image;import java・swt.Rectangle;import java・ awt・ event・ KeyEvent;import java・ io. IOException;import javax・ inuigeio. ImsgelO;public class Power {Image PowerImage = null;int x = 20;int y = 0;public Power() {this, x二(int) (Math, random() *540) +20: try {Power Image 二ImagelO. read(Gift. class. getdassLoader ()・ getResourceAsStream(" images/power・ pnj?"));} catch (IOException e) {e.printStackTrace();}}public void draw(Graphics g) {// 画血瓶图片g. drawlmage(PowerImage, x, y. null):// 血瓶移动y++;}pub 1 ic Rectangle getRectangleO {returnnew Rectangle(x,y t Powei'Image・ getWidth(null),PowerImage・ getHeight(null)); }} package ;import java. awt. Graphics; import java・swt・ Image; import java・awt.Rectangle;import java・ awt・ event・ KeyEvent;import java・ io. IOException;import java .util. ArrayList;import java.util.List;import javax・ imageio. ImagelO;//第一关public class PlayOl {static int count=0;Image bglmage = nul1://战机Plane plane = new PlaneO ://战机子弹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 /\rrayList<Power>(): public PlayOl() { try {bglmage = Image10. read(Play01. class・getClassLoader()・ getResourceAsStream("images/bg 01. jpg"));} catch (IOException e) {e.printStackTrace();}}int bgYl = 0;int bgY2 = -600;int fireTime = 0;boolean flag=false;public void draw(Graphics g) {//画背景图片g. drawImage(bgImage, 0, bgY11 null):bgYl += 5;if (bgYl <= 600) {bgYl = 0;}g. drawImage(bgImage, 0. bgY2f 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・ removed);}}//添加子弹if (isFirel == true && flag==false) {if (fireTime % 8 == 0) {mzds.sdd(new MyZiDan(plane.x + 25, plane.y + 0)): } fireTime++;}if (isFirel== true && fl3g==true) {if (fireTime % 4 == 0) {mzds・3dd(new MyZiDan(plane. x +8. plane.y +0));mzds・3dd(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 < di jis. size(): i++) {Di ji dj = di jis. get (i):if (dj. x < -100) {dijis・ remove(i);}//抽奖:添加敌机if ((int) (Math, random() * 20) == 5) {di jis.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 < di jis. size() ; i++) {Diji dj = dijis. get (i):dj・ draw(g);}//画飞机plane・ draw(g);//判断战机相撞for (int i = 0; i < di jis. size(): i++) {//先得到每一个敌机Diji dj = dijis・get(i);Rectangle rl = dj. getRectangleO :Rectangle r2 = plane.getRectangleO; if (rl. intersects(r2)) {dijis・ remove(i);plane・ lifeCount = plane・ lifeCount 一1; if(plane. lifeCount>0) flag=false;if(plane. lifeCount<l){ PlaneStatus・pl3ySt3tus=-l; }}}//判断战机和血瓶相撞for (int i = 0; i < gifts. size(): i++) {//先得到每一个血瓶Gift gift = gifts・get(i);Rectangle rl = gift. getRectangle();Rectangle r2 = plane・getRectsngleO; if (rl. intersects(r2)) {gifts・ remove(i);if (plane.1ifeCount <5) {plane・ lifeCount = plane. lifeCount + 1: }}}////判断战机和Power相撞for (int i = 0; i < powers.size(); i++) {//先得到每一个powerPower power = powers・get(i);Rectangle rl = power. getRectangleO :Rectangle r2 = plane.getRectangleO; if (rl. intersects(r2)) {powers. remove(i):flag=true;}}//判断敌机在中弹for (int i = 0; i < mzds.size(); i++) {//得到每个战机子弹MyZiDan myzidan = mzds ・get(i);Rectangle rl = myzidan. getRectangleO : for (int j = 0; j < di jis. size() ; j++) { //每一个敌机Di ji di ji = di jis. get (j):Rectangle r2 = di ji. getRectangleO : if (rl. intersects(r2)) { mzds.remove(i); dijis ・ remove(j);}count++; }}}boolean boolean isFirel = false ;isFire2 = false ;public void keyPressed(KeyEvent e) { plane. keyPressed(e);if (e. getKeyCodeO == KeyEvent. VK J) { isFirel = true ;}/♦if (e. getKeyCodeO == KeyEvent. VK K) { isFire2 = true ;public void keyReleased(KeyEvent e) { plane ・ keyReleased(e);if (e. getKeyCodeO == KeyEvent. VK J) { isFirel = false ;fi reTime = 0;}/♦if (e. getKeyCodeO == KeyEvent. VK K) { isFire2 = false ;fireTime = 0; }*/if ( e. getKeyCodeO —KeyEvent. VK P) {for(int i=0; i<dijis.size();i++) di jis. remove(i);}package ;import java・swt.Color;import java・owt・Font;import java. awt. Graphics;import java.awt.1mage;import java・ awt・ event・ KeyEvent;import java・ io. IOException;import javax・ inuigeio. ImagelO;//游戏结束public class Over {Image obg=null;Image ng=nul1:public Over() {try {obgImage10. read(Before・ class・ getClassLoader()・ getResourceAsStream(n images/obg・jpg” ));ngI mage 10. read (Before ・ class ・ getClassLoader ()・ getResourceAsStreomC'inuiges/ng ・png"));} catch (IOException e) {e.printStackTrace();}}pub1ic void draw(Graphics g){g・drawlmage(obg, 0. 0. null);g. drawlmage(ng, 120,100. null);g.setColor(Color・ black);g. setFont (new Font (n幼圆Font. BOLD, 40));g. drawString(R游戏结束啦! ".200 ,600 );}public void keyPressed(KeyEvent e) {}public void keyReleased(KeyEvent e) {}}package ;import java.awt. Color;import java・swt.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():PlavOl playOl = new PlayOl():Over over = new Over ():public MainFrameO {// 设置标题this. setTitleC1' 让子弹飞一会、*);// 设置大小this.setSize(600, 800);// 定位居中this. setLocationRelativeTo(null);// 添加关闭操作this. setDefaultCloseOperation(JFrame.EXIT ON CLOSE):// 禁止重置大小zthis・ setResizable(false);// 添加键盘监听器KeyLi stener --> KeyAdapter this.addKeyListener(new KeyAdaptei-() {Overridepublic void keyPressed(KeyEvent e) { if(PlaneStatus. playStatus == 0) { before・keyPressed (e);}else if(PlaneStatus.playStatus =1) { playOl. keyPressed(e);}else if (PlaneStatus・ playStatus二=T) { over・ keyPressed(e);Overridepublic void keyReleased(KeyEvent e) { if (PlaneStatus. playStatus == 0){ before・ keyReleased(e);}else if(PlaneStatus.playStatus =1) { playOl. keyReleased(e);}else if (PlaneStatus・ playStatusHT) { 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) {bufferlmage = this・ cre3teIni8ge(600, 800):}Graphics g4Image = bufferimage・getGraphicsO: g4Image. setColor(Color.BLACK);g4Image. fillRect(0, 0. 600, 800);this・ draw(g41mage);g. drawImage(bufferImage, 0, 0, null);}public void draw(Graphics g){if(PlaneStatus. playStatus == 0){before・ draw(g);}else if(PlaneStatus.playStatus =1) {play0L draw(g);}else if (PlaneStatus・ pl3yStatus==T) {}over. draw(g);pub1ic static void main(String[] args) { new MoinFrame():}}package ;import java. awt. Graphics;import java.awt・ Inuige;import java.awt.Rectangle;import java・ io. IOException;import javax・ inuigeio. ImagelO;public class MyZiDan {Image zidanImage = null;int x ;int y ;public MyZiDan(int x,int y) {this・ x=x;this・ y=y;try {zidanImage 二Image10. read(MyZiDan.class・getClassLosder()・ getResourceAsStream("images/zidan・ png w));} catch (IOException e) {e. printStackTrace ();}}pub1ic void draw(Graphics g) {// 画我军子弹图片g. drawlmage(zidanlmage, x, y. null)://我的飞机子弹移动速度y-二20;}public Rectangle getRectangle() {returnnew Rectangle(x,y t zidanImage. getWidth(null),zidanlmage・ getHeight (null)); }package ;import java. awt. Graphics;import java・awt・ Image;import java・awt.Rectangle;import java・ awt・ event・ KeyEvent;import java・ io. IOException;import javax・ imageio. ImsgelO;public class Diji {Image dijiImage = null;int y = -20;int x = 10;//20 ~ 760int r;public Di ji () {this. x=(int) (Math, random()*540) +40:try {r = (int) (Math, random () *3)+1 :dijiImage = ImagelO. read(Diji・class. getClassLoader()・ getResource/XsStream(" images/di j i "+r+"・ png n)); } catch (IOException e) {e. “intStackTra ceO ;}}pub1ic void draw(Graphics g) {// 画敌机图片g・drawlmage(dijiImage, x, y, nul1):// 敌机移动if(r==l) {y+=4;}else if(r==2) {y+=4;}else if(r==3){y+=7:}}pub 1 ic Rectangle getRectangleO {return newRec tangle(x,y,d i j iImage. getWidth(nu11),dijiImage・ getHeight (nul1)); } }package ;import java. awt. Graphics;import java.awt・ Image;import java・owt.Rectangle;import java・ awt・ event・ KeyEvent;import java・ io. IOException;import javax・ inuigeio. ImagelO;public class Gift {Image Giftimage = null;int x = 20;int y = 0;pub 1 ic Gift () {this. x=(int) (Math, random()*540) +20:try {Gift Image = Image10. read(Gift・cl^ss・getClossLoader ()・ getResourceAsStream("images/blood・ png"));} catch (IOException e) {e.printStackTrace();}}public void draw(Graphics g) {// 画血瓶图片g. draw I mage (G i f 11 mage t x, y, null):// 血瓶移动y++;}public Rectangle getRectangleO {return new Rectangle(x,y,GiftImage・ getWidth(null).Giftimage・ getHeight(null));package ;import java. awt. Graphics;import java.awt.1mage;import java.awt.Rectangle;import java・ io. IOException;import javax・ inuigeio. ImagelO;public class DijiZiDan {Image zidanImage = null;int x ;int y ;int fangxiang =0;pub1ic DijiZiDan(int x,int y) {this・ x=x;this・ y二y;fangxiang = (int) (Math•匸andom()*5) ;//0、7 try {zidanImage = Image10. read(DijiZiDan.class・getClassLoaderO・ getResourceAsStreamCiniages/dijizidan. jpg"));} catch (IOException e) {e.printStackTrace();}}pub1ic void draw(Graphics g) {// 画敌机子弹图片g. drawImage(zidanlmage, x, y, null);//移动this・ move():}public void move(){if (fangxiang==0){// 下y=y+2;}else if(fangxiang==l) {// 左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 t zidanImage. getWidth(null),zidanlmage・ getHeight(null));}} package ;import java・awt.Color;import java・nwt.Font;import java. awt. Graphics;import java.awt・ Image;import java・ awt・ event・ KeyEvent;import java・ io. IOException;import javax・ imageio. ImagelO;//游戏开始之前public class Before {Image bg=null;Image wfeiji二null;Image kdiji1二null;Image kdiji2二null;Image kdiji3=null;public Before() {try {bg = Image10. read(Before・ class・ getClassLoader()・ getResourceAsStream(n images/bg・ jpg H));wt e1j iImage 10. read (Before ・ class ・ getClassLoader ()・ get Resource?\sS tream (n i mages/f e i j i1. png"));kdijil= Image10. read(Before ・ class ・ getClassLoader()・ getResourceAsStream(n images/kdi ji 01 .png"));kdiji2= Image10. read(Before ・ class ・ getClassLoader()・ getResource/\sStream(n images/kdi ji 02 .png"));kdiji3= Image 10. read (Before ・ class ・ getClassLoader ()・ getResource/XsSti'eam (n i mages/kd i j i03 .png"));} catch (IOException e) {e. pr i ntStackTrace ();}}int time^O ;pub1ic void draw(Graphics g) {if (PlaneStatus. roleNum^^l) {//画妹妹 g. drawlmage(bg, 0, 0, null);g. drawImage(wfeiji t 260, 600, null)g. drawImage(kdiji11g. drawImage(kdiji11g. drawlmage(kdiji1,g. drawlmage(kdiji1,g. drawlmage(kdiji2,g. drawlmage(kdiji2,g. drawlmage(kdiji2,g. drawlmage(kdiji3,g. drawlmage(kdiji3,g. drawlmage(kdiji3,}// 画回车符 time++;g. setColor(Color. YELLOW); 200 • 50, null); 400. 50, null); 150, 480, null); 400, 480, null); 100, 200, null); 300. 100, null); 480 • 2001 null); 300. 300, null); 70. 400, null); 510. 400, null);g. setFont (new Font(w幼圆Font. BOLD・ 30)): if (time<=10){g. drawString(w[Enter]»n, 50, 750);}else if(time<=20) {g. drawString(" [Enter] »n. 50, 750);}else if(time<=30) {g. drawString(" [Enter] »n■50, 750);if(time==30){time=0;}}}public void keyPressed(KeyEvent e) {int keyCode = e. getKeyCodeO ;if(keyCode == KeyEvent. VK ENTER){PlaneStatus・ playStatus=l:}if(keyCode ==KeyEvent. VK LEFT keyCode==KeyEvent. VK RIGHT ){ PlaneStatus. roleNum = 3-PlaneStatus. roleNum;//1^2 互换 }}pub1ic void keyReleased(KeyEvent e) {}。
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自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。
Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
本游戏是一个基于java的飞机大战游戏,利用Eclipse平台实现经典的飞机大战游戏。
游戏主要涉及了游戏状态控制功能、游戏难度的调整、游戏界面绘画功能、玩家游戏控制功能,最终展示了游戏开发的基本开发过程和设计思路。
关键词:飞机大战;游戏;java;Eclipse平台Design and implementation of airplane wargame based on JavaAbstractLightning is the history of the development of computer games in the early one of the most classic game, often on a handheld game consoles, mobile phone and computer to see this game. However, the previous common lightning game is two-dimensional plane, and mostly in black and white, in the course of the computer can see lightning in color.Since Java is very popular after the launch, the rapid development of the C + + language to form a strong impact. Java technology has excellent versatility, efficiency, platformportability and security, widely used in personal PC, data center, game consoles, scientific supercomputers, cell phones and the Internet, also has the world's largest developer of professional community . In the world of cloud computing and mobile Internet industry environment, Java and more have a significant advantage and broad prospects.This game is a game based on the realization of Java lightning, lightning classic game based on Eclipse platform. The game is mainly involved in the game state control function, the difficulty of the game, the game interface to adjust the drawing function, game player control function, finally shows the basic development process of game development and design ideas.Keywords: lightning; game; Java; Eclipse platform目录摘要 (i)Abstract (ii)1 引言 (1)1.1 项目背景 (1)1.2 国内外研究现状 (1)1.3 项目主要工作 (1)1.4 本文组织结构 (2)2 开发平台与开发技术 (3)2.1 Eclipse (3)2.2 Eclipse平台 (3)2.3 Java (4)2.4 Java语言的特点与优势 (5)2.5 java技术在游戏开发中的应用 (6)2.6 UML (8)3 飞机大战游戏模块设计 (9)3.1 用户需求分析 (9)3.2 可行性分析 (9)3.3 总体设计原则 (10)3.4 功能模块设计 (11)3.4.1 游戏状态控制功能 (11)3.4.2 游戏难度的调整 (11)3.4.3 游戏界面绘画功能 (11)3.4.4 玩家游戏控制功能 (11)3.5 游戏难点分析 (11)4 飞机大战功能实现 (12)4.1 游戏首页的实现 (12)4.1.1 界面实现 (12)4.1.2 流程图 (13)4.1.3 核心代码 (14)4.2 游戏开始模块的实现 (15)4.2.1 界面实现 (15)4.2.2 流程图 (16)4.2.3 核心代码 (17)4.3 发射子弹模块的实现 (18)4.3.1 界面实现 (18)4.3.2 流程图 (19)4.3.3 核心代码 (20)4.4 积分模块的实现 (22)4.4.1 界面的实现 (22)4.4.2 核心代码 (23)4.5 碰撞逻辑 (26)4.5.1 碰撞画面的实现 (26)4.5.2 核心代码 (27)4.6 游戏玩家与BOSS的血条 (28)4.6.1 玩家血条和BOSS血条的实现 (28) 4.6.1 核心代码 (29)4.7 游戏操作的实现 (30)4.7.1 核心代码 (30)5 系统测试 (31)5.1 测试的定义及其重要性 (31)5.1.1 测试的定义 (31)5.1.2 测试的重要性 (31)5.2 测试实例的研究与选择 (31)5.3 测试结果 (32)总结和展望 (33)参考文献 (34)致谢 (35)外文原文 (36)中文翻译 (42)1 引言1.1 项目背景90年代的我们,对小时候的一些经典街机游戏肯定是印象深刻,像“飞机大战”、“超级玛丽”、“坦克大战”等,这些游戏伴随了我们童年,怀旧经典,重温这些经典的游戏,我选择“飞机大战”作为设计的项目。
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) {}}。
飞机⼤战JAVA程序设计报告中国地质⼤学长城学院Java 程序设计题⽬基于Java的打飞机游戏设计与实现系别信息⼯程系专业计算机科学与技术学⽣姓名马辉学号041120101指导教师⽥⽟龙2015 年 6 ⽉18 ⽇基于Java的打飞机游戏设计与实现1、软件运⾏所需要的软硬件环境本系统是以Windows系统为操作平台,⽤Java编程语⾔来实现本系统所需功能的。
本机器的配置如下:处理器:AMD A4 或英特尔同级别处理器主频:1.2Hz以上内存:1G以上硬盘:HHD 50G或更⾼采⽤的主要技术和软件编程语⾔:Java开发环境:windows7开发软件:Eclipse 3.72、软件开发环境配置JA V A_HOME = F:\JA V A\jdkPATH = % JA V A_HOME%\bin;%JA V A_HOME%\lib;%JA V A_HOME%\jre\lib; CLASSPATH = %JA V A_HOME%\lib;%JA V A_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 Vector bangs = new Vector();public static Vector ebullets = new Vector();public static Vector pbullets = new Vector();public static Vector eplanes = new Vector();public static PPlane pplane = new PPlane();private GamePanel gamePanel;private Random random = new Random();public static int baoZhaNum;public Controller(Vector bang,Vector ebullet,Vector pbullet, Vector 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 stubfor(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) { // TODO Auto-generated method stub switch (e.getKeyCode()){case KeyEvent.VK_UP:PPlane.UP = true;break;case KeyEvent.VK_DOWN: PPlane.DOWN = true;break;case KeyEvent.VK_LEFT: PPlane.LEFT = true;break;case KeyEvent.VK_RIGHT: PPlane.RIGHT = true;break;case KeyEvent.VK_X:PPlane.isFired = true;break;}}@Overridepublic void keyReleased(KeyEvent e) { // TODO Auto-generated method stub switch (e.getKeyCode()){case KeyEvent.VK_UP:PPlane.UP = false;break;case KeyEvent.VK_DOWN: PPlane.DOWN = false;break;case KeyEvent.VK_LEFT: PPlane.LEFT = false;break;case KeyEvent.VK_RIGHT:PPlane.RIGHT = false;break;case KeyEvent.VK_X:PPlane.isFired = false;}}public void StartRun(){new Thread(){public void run(){int count = 0; //通过count控制⼦弹避免连续按发送键时⼦弹连成线while(true){//本机移动pplane.pplaneMove();//添加本机⼦弹if(PPlane.isFired && count%5==0){PBullet pbullet1 = new PBullet(pplane.x+65, pplane.y+50, 8, 15); pbullets.add(pbullet1);PBullet pbullet2 = new PBullet(pplane.x+50, pplane.y+50, 8, 15); pbullets.add(pbullet2);PBullet pbullet3 = new PBullet(pplane.x+35, pplane.y+50, 8, 15); pbullets.add(pbullet3);PBullet pbullet4 = new PBullet(pplane.x+20, pplane.y+50, 8, 15); pbullets.add(pbullet4);}count++;//让本机⼦弹移动并判断是否打中敌机for(int i=0;i < pbullets.size();i++){pbullets.elementAt(i).bulletMove();int index = pbullets.elementAt(i).isPbulletHitEplane();if(index != -1) //不等于-1 证明打中了并产⽣爆炸{Bang bang = new Bang(pbullets.elementAt(i).x,pbullets.elementAt(i).y,30,30);bangs.add(bang);baoZhaNum++;eplanes.remove(index);}}//判断本机⼦弹出界就移除for(int i=0;i < pbullets.size();i++){if(pbullets.elementAt(i).y <= 0){pbullets.remove(i);//System.out.println("⼦弹移除");}}//添加敌机if(eplanes.size() < Global.ENEMY_NUMBER){int x = random.nextInt(Global.FRAME_WIDTH);int y = -30;EPlane eplane = new EPlane(x, y, 30, 30);eplanes.add(eplane);}//让敌机移动并且判断出界for(int i=0;i < eplanes.size();i++){eplanes.elementAt(i).eplaneMove();if(eplanes.elementAt(i).y >= Global.FRAME_HEIGHT){ eplanes.remove(i);}}//让敌机⼦弹移动并将超过边界的敌机⼦弹移除for(int i=0;i < ebullets.size();i++){ ebullets.elementAt(i).bulletMove();if(ebullets.elementAt(i).isEBulletHitPPlane()){ebullets.elementAt(i).isUsed = true;PPlane.life -= 2;}if(ebullets.elementAt(i).y >= Global.FRAME_HEIGHT){ ebullets.remove(i);}}for(int i=0;i < bangs.size();i++){if(bangs.elementAt(i).isBang == true){bangs.remove(i);}}try {sleep(30);} catch (InterruptedException e) {e.printStackTrace();}JudgeLife();gamePanel.display(bangs, ebullets, pbullets, eplanes, pplane);}}}.start();}public void JudgeLife(){if(!pplane.isAlive()){int result = JOptionPane.showConfirmDialog(gamePanel,"继续重玩?","提⽰",JOptionPane.YES_OPTION);if(result==0){newGame();}else{System.exit(0);}}}public void newGame(){bangs.clear(); //重玩必须将⼀切对象都清空ebullets.clear();pbullets.clear();eplanes.clear();pplane = new PPlane(250, 400, 100, 100);baoZhaNum = 0;pplane.life = 100; //不重置⽣命值在进⾏JudgeLife判断会⼀直出现是否重玩的对话框PPlane.DOWN = false; //重新开始游戏之后必须重置所有的静态变量否则会保存上⼀次的静态变量值运动和发射⼦弹PPlane.UP = false;PPlane.LEFT = false;PPlane.RIGHT = false;PPlane.isFired = false;}}public class PBullet extends Bullet{private Image img; //保存⼦弹的图⽚private JPanel jpanel;public JPanel getJpanel() {return jpanel;}public void setJpanel(JPanel jpanel) {this.jpanel = jpanel;}public PBullet(int x, int y, int width, int heigth) {super(x, y, width, heigth);img = new ImageIcon("Image/fire.png").getImage();// TODO Auto-generated constructor stub}public void bulletMove() {// TODO Auto-generated method stubthis.y-=20; //⼦弹的速度⼀定要⼤于飞机的速度否则⼦弹会出现在飞机后⾯}public void drawMe(Graphics g) {// TODO Auto-generated method stubg.drawImage(img, x, y, width, heigth, jpanel);}//在本机⼦弹判断是否打中敌机public int isPbulletHitEplane(){for(int j=0;j < Controller.eplanes.size();j++){Rectangle recPbullet = new Rectangle(x,y,width,heigth);Rectangle recEplane = new Rectangle(Controller.eplanes.elementAt(j).x, Controller.eplanes.elementAt(j).y,Controller.eplanes.elementAt(j).w, Controller.eplanes.elementAt(j).h);if(recPbullet.intersects(recEplane)) //判断矩形重叠{return j;}}return -1;}}6、总结JA V A和Eclipse是⼀款⾮常好的开发语⾔和平台,类的建⽴使编程相对明朗,不同的组件很明确的摆在那,对于头脑不灵活的⼈来说真的是⼀款⾮常清晰明了的开发软件,通过这⼀段时间的JA V A程序开发,我感觉到尽管的是不同的语⾔和平台,开发程序⼀样需要动脑和努⼒,每⼀款软件或者游戏都不是⼀朝⼀⼣能制作出的,都需要⼤量的构思和编程,最后还有繁琐的检查⼯作,通过这次接触JA V A我今后会更努⼒的学习它。
毕业设计(论文)题目基于Java的飞机大战游戏开发飞机大战是电脑游戏发展史中早期最为经典的游戏之一,无论是在电脑端、移动端、还是游戏机上,都能见到与飞机相关的射击类游戏。
不过,最初常见的飞机大战游戏是二维平面上的,并且大多以黑白的形式出现,而如今,在电脑上,不仅机型多,而且五颜六色,3D视觉冲击强。
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击,Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有了全球最大的开发者专业社群。
在全球云计算和移动互联网的产业环境下,Java更具备了显着优势和广阔前景。
因此,本论文主要阐述以面向对象的程序开发语言Java及Eclipse为开发工具的飞机大战游戏。
首先简要介绍课题的研究背景、目的及意义,Java的发展历程、当前国内外的发展现状。
然后介绍Eclipse平台开发环境及环境搭建,最后讲述了基于Java飞机大战游戏功能的实现。
其功能模块如下:主界面模块,Hero模块,Enemy模块,Bullet 的类模块,检测子弹与敌机碰撞模块检测,相信其基于Java的飞机大战游戏将会受到更大的欢迎。
关键词:飞机大战,游戏,Java ,EclipsPlane War is the one of the most classic games in the early history of the development of computer games. We can always see aircraft-related shooting game whether it is on a computer teminal or mobile terminal. However, the first common plane war game is a two-dimensional plane, and mostly appears in the form of black and white, but now, on the computer, not just models and more colorful, 3D strong visual impact.Java is very popular with developers since it appeared, formed the powerful shock for the rapid evelopment of the C++ language. Java technology has excellent versatility, efficiency, platform portability, and security and is widely used in personal PC, data center, game consoles, scientific supercomputers, cell phones and the Internet. What’s more, Java has the world's largest developer of professional community. In the global cloud computing and mobile Internet industry environment, Java has more significant advantages and broad prospects.Therefore, this paper describes the development of object-oriented programming language Java and Eclipse development tools for aircraft war game. Firstly, it introduces research background, purpose and meaning, and telled Java development process and the current development status at home and abroad. Then introduces the Eclipse platform development environment and built environment, and finally tells the Java-based aircraft war game features implementation. Its function modules are as follows: the main interface module,Hero module,Enemy module,Bullet module, and the detection module detecting a collision with the enemy bullets. We believes its Java-based aircraft war game would be welcomedgreater.KeyWords: lightning,Game,Java,Eclipse目录前言项目背景90年代的我们,对小时候的一些经典街机游戏肯定是印象深刻,像“飞机大战”、“超级玛丽”、“坦克大战”等,这些游戏伴随了我们童年,怀旧经典,常温这写经典的游戏,我选择了“飞机大战”作为设计的项目。
而基于Java语言开发“飞机大战游戏”,也是对大学知识的一次运用,本次的项目不但可以重拾儿时的回忆,也同样是对大学知识的一次回顾与复习。
飞机大战游戏拥有所有游戏共通的成分。
它们都有一个独立的循环体,这个循环体可以反复被执行,直到游戏退出。
游戏的关键之处在于,Hero战机飞行要不断的发出子弹,而Enemy战机按一定的波次、按不定的速度随机的从对方袭来,在程序运行的过程中,要不断的判断Hero战机是否与Enemy战机相撞,子弹是否与Enemy相撞,最后根据战场的相撞情况,是否结束各个战机和子弹的生命周期。
以后要做的所有的简单的游戏都要用到这些东西,所以学习这个过程并且实现它是非常重要的。
当第一次完成它之后,以后再做游戏是就能看出那个游戏有多难以及要花多长时间。
如果没有完整的完成过这些,哪怕一次,就永远不能完整地正确领会其中的每个元素。
当做大的项目时,就更不能确定其复杂星及所要的时间。
如果甚至不能正确地领会这个过程(因为你没能完成它),可能是没能建立一个合适的时间表或估计合适的时间,更有可能的是不够努力。
国内外研究现状Java作为一门成熟的编程语言,以其简单性、可移植性和平台无关性等优点,得到了广泛的应用,对于游戏开发来说,由于设计到比较复杂的情况,开发过程很多时候是一个不断修改的过程,可以方便的修改游戏内容是十分关键的。
由于其虚拟机特性,java 本身就可以用来编写游戏脚本,可天衣无缝的和java语言进行交互,这些都极大的方便了java游戏编程。
由于Java语言的可移植性和平台无关性等优点,如今,国内外对于Java在游戏设计开发的运用有两大方面:一个是手机游戏,一个就是web上的游戏开发,可见Java 语言在其游戏开发方面尤其优点和独特性。
如今正由于智能手机游戏市场发生重大的变化,ios不再独霸与市场,Andriod的市场正在不断的扩散。
据国外媒体最新报道,Android智能机的市场份额为68%,远高于苹果的17%,用Java语言开发游戏也迎来了黄金期,特别是在手机游戏开发上。
Java语言称霸企业级应用这么多年,事实证明了它非常适合于开发大型软件。
如今Java在游戏开发领域,也正开始崭露头角项目主要工作本次的开发内同——基于Java的飞机大战游戏就是游戏与Java编程语言相结合的例子从游戏的基本玩法出发,主要就是Hero和Enemy的对决,首先应该有个界面来装载整个游戏,然后就是Hero的移动方式(键盘移动),接下来就是Hero子弹的生成,然后是Enemy的出现方式,然后Enemy的子弹生成,最后是Hero与Enemy的对战结果。
该游戏要满足以下功能性需求:(1)Hero战机的控制。
(2)子弹的控制(3)多种Enemy战机的出现方式(4)各种战机和子弹的碰撞情况的检测和控制(5)各个战机和子弹生命周期的结束控制第一章开发技术和开发平台本软件涉及到的开发技术是Java,开发平台是Eclipse。
因此,本章主要详细介绍用Java开发的特性和优势,以及开发平台Eclipse的合理配置。
1.1Java语言特性Java编程语言的风格十分接近C、C++语言。
Java是一个纯的面向对象的程序设计语言,它继承了C++语言面向对象技术的核心。
Java舍弃了C++语言中容易引起错误的指针(以引用取代)、运算符重载,多重继承(以接口代替)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。
在版本中,Java有引入了泛型编程,类型安全的枚举,不定长参数和自动装/拆箱等语言特性。
Java不同于一般的编译执行计算机语言和解释执行计算机语言。
它首先将源代码编译成二进制字节码,然后依赖不同平台上的虚拟机来解释执行字节码。
从而实现了“一次编译、到处执行”的跨平台特性。
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了Java程序的运行效率。
(1)跨平台跨平台是指Java能运行与不同的平台。
Java引进虚拟机原理,并运行于虚拟机,实现不同平台的Java接口之间。
使用Java编写的程序能在世界范围内共享。
Java的数据类型与机器无关,Java虚拟机是建立在硬件和操作系统之上,实现Java二进制代码的解释执行功能,提供与不同平台的接口的。
(2)安全性Java的编程类似C++,学习过C++的读者将很快掌握Java的精髓。
Java舍弃了C++的指针对存储器地址的直接操作,程序运行时,内存由操作系统分配,这样更可以避免病毒通过指针侵入系统。
Java对程序提供了安全管理器,防止程序的非法访问。
(3)面向对象Java吸取了C++面向对象的概念,将数据封装于类中,利用类的优点,实现了程序的简洁星和便于维护性。
类的封装性、继承性等有关对象的特性,使得程序代码只需一次编译,然后通过上述特性反复利用。
程序员只需把主要精力用在类和接口的设计和引用上。
Java提供了众多的一般对象的类,通过继承即可使用父类的方法。