打飞机小游戏 Java课程设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

四川理工学院
课程设计书
学院计算机学院
专业计算机科学与技术
班级计科2014级
题目打飞机小游戏
教师王非
学生雷元刚张柯
随着Java语言的兴起,越来越多的平台开始使用java语言编写的程序,虽然不及C语言的高效,但是Java拥有的平台无关性是其他平台所不能企及的。

几乎所有的银行系统都是运用Java来编写的,主要是因为其安全性较高。

Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。

而运用Java编写图形化界面也是比较容易的,因为其有专门的框架和界面,这样使得几行代码就可以创建一个图形化界面了。

而本次要编写的打飞机小游戏,重复运用了图形化界面的知识,多线程,重画,添加监听器等。

锻炼了我们实践编写界面代码的能力,提高了我们对于图形化界面编程的理解和运用各种容器和组件来实现我们所需要的界面。

关键词:打飞机,多线程,重画,图形化
第一章前言 (3)
1.1开发背景 (2)
1.1.1开发环境 (2)
第二章需求分析 (3)
2.1 开发目的 (3)
2.2 系统需求分析 (4)
2.3 系统性能分析 (4)
2.4 系统模块分析 (4)
第三章数据库设计 (5)
3.1 数据库概述 (5)
3.2数据库设计 (6)
第四章详细设计 (7)
4.1 游戏概要 (7)
4.2类的详细设计 (8)
4.2.1 MyPlane类 (8)
4.2.2 Bullet (9)
4.2.3 EnemyBullet (9)
4.2.4 EnemyPlane (10)
4.2.5 Explode (12)
4.2.6 PlayMusic (13)
4.2.7 GameBox (13)
4.2.8 DB (15)
4.2.9 StartFrame (15)
第五章测试 (17)
第六章小结 (21)
致谢 (22)
参考文献 (23)
附录 (24)
第一章前言
随着网络的不断发展,在中国网民的数量越来越多。

人们也对于互联网所能提供的功能有了一定的要求,比如能够在线观看视频,在线游戏,大数据服务。

互联网经过短短几十年的发展,相比起当初,已经发生了翻天覆地的变化。

而游对于互联网的发展也有着一定的推动作用。

SQL Server是目前应用比较广泛的关系型数据库标准语言之一。

现在,SQL 已成为国际标准语言,各种类型的计算机和DBS都采用SQL作为其存取语言和标准接口,从而使数据库世界有可能链接为一个统一的整体。

Microsoft Office Access是由微软发布的关系数据库管理系统。

它结合了MicrosoftJet Database Engine 和图形用户界面两项特点,是Microsoft Office 的系统程序之一。

对于广大用户而言,Access数据库的操作简便,和Office一起安装的,所以也有广泛的通用性。

以数据库技术作为后台的可视化应用也越来越受到人们的喜爱,Java是目前应用比较流行的可视化编程软件之一。

它的功能强大,系统自带的代码较为齐,容易操作,受到很多用户的喜欢。

Java开发游戏也是比较容易的,对于广大的网民和学生,在工作之余能够玩玩游戏也是一种不错的选择的休闲的方式,并且伴随着网络的普及化,越来越多的人们开始加入到游戏的大军中来,所以开发一款适合的游戏显的尤为重要。

1.1开发背景
游戏自古以来就有,以前的象棋,围棋,到现在的军旗,跳跳棋。

毫不夸张的说,游戏是人类智慧的结晶,是我们休闲娱乐的一种方式。

数据库技术产生于20世纪60年代末70年代初,其主要目的是有效地管理和存取大量的数据资源.数据库技术主要研究如何存储,使用和管理数据. 数年来,数据库技术和计算机网络技术的发展相互渗透,相互促进,已成为当今计算机领域发展迅速,应用广泛的两大领域.数据库技术不仅应用于事务处理,并且进一步应用到情报检索,人工智能,专家系统,计算机辅助设计等领域.
游戏加入数据库技术,能够在一定程度上减轻服务器的负担,提高服务器的负载能力。

有利用实现更好的用户体验和数据的离线保存,有助于对于游戏数据的分析和处理。

在大数据时代,对于数据的分析和处理显的更加重要。

1.1.1开发环境
Windos系统,JDK1.8,jre7,Access数据库,Mysql数据库,Eclipse MARS软件一套。

1.2游戏功能简介
本游戏能够实现游戏和音乐同步播放,当飞机被摧毁是还有特殊音效。

加入了游戏数据保存到本地数据库的功能,能够保存在MYSQL以及ACCESS中,满足各种环境下的需求。

第二章需求分析
2.1 开发目的
打飞机游戏,是我们儿时在游戏厅中经常玩的游戏。

它能勾起我们对于儿时的种种美好的回忆,而游戏本身难度适中,能够提升我们对于这种游戏的编写能力和逻辑思维能力。

打飞机游戏也需要多线程的支持,而Java对于多线程的支持程度是比较好的的。

2.2 系统需求分析
1、功能需求
对于游戏结果的记录,判断是否有子弹击中飞机,判断是否2架飞机相撞。

2、可靠性可用性需求
能够在在程序异常的时候提示,在断电的情况下自动保存游戏数据。

3、出错处理需求
当游戏出错是,能够弹出一个对话框来提醒用户。

4、游戏数据的处理
对于生成的游戏数据,能够存入数据库的不同字段中。

能够记录游戏数据插入数据库中的时间。

2.3 系统性能分析
为了保证系统能够长期、安全、稳定、可靠、高效地运行,本系统应该满足以下的性能需求。

(1)准确性和及时性
程序采用的是坐标定位的方式,对于碰撞检测还是比较全面,能够在一定
的范围内检测,并提供了飞机碰撞检测和子弹碰撞检测这2种不同的检测
方式。

(2)易用性
由于采用的2套数据库,能够保证数据部分的通用性,而java又是与平台
无关性的,所有能够保证程序的易用性。

(3)安全性
将游戏的数据放入数据库中,能够增加数据的安全性,需要程序在连接数
据库的时候输入密码。

2.4 系统模块分析
1、子弹模块:
(1)用来管理自己的飞机所需要发出的子弹,放在Bulletlist的List类型的
数组中。

并提供了draw()函数,用来画出不同位置的子弹并利用重画
功能,实现子弹的移动。

(2)敌机子弹功能,也是相应的重画功能,并能够通过EnemyBullet()功能
初始化敌机子弹的位置。

通过isLive()判读子弹是否有效。

getY(),getX()
获取子弹的横坐标和纵坐标,为碰撞检测提供依据。

2、飞机模块:
(1)敌机管理
拥有1号级和2号级,并通过随机函数来调用不同的敌机出现在画面中。

draw()能够实现对于飞机的重画,实现敌机的下落功能。

(2)我机管理
我机也包含初始化的X方向和Y方向上的速度,并设置dl,du,dr,dd
为false。

并添加了键盘监听器,能够对键盘的按钮做出响应,按下w,a,s,d分别对应的是飞机向上左下右移动。

(3)数据管理
对用户的信息和数据进行存入数据库的操作,和通过数据库调用用户数
据。

第三章数据库设计
3.1 数据库概述
数据库是整个系统的核心,它的设计直接关系系统执行的效率和系统的稳定性。

因此在软件系统开发中,数据库设计应遵循必要的数据库范式理论,以减少冗余、保证数据的完整性与正确性。

只有在合适的数据库产品上设计出合理的数据库模型,才能降低整个系统的编程和维护难度,提高系统的实际运行效率。

3.2数据库设计
(1)分数数据表如表3.1
表3.1分数数据表
(2)数据库管理软件采用Mysql或者Acess,通过这两款软件来管理程序中需要存储管理的数据,并且能够加强我们的数据库思维,为以后的开发打好基础。

数据库的详细代码设计如下:
package Tools;
public class DB {
private String url="jdbc:mysql://localhost:3306/plane";
private String driver="com.mysql.jdbc.Driver";
private Connection conn;
private Statement stmt;
public DB(){
try {
Class.forName(driver);
conn=DriverManager.getConnection(url,"root","123");
stmt=conn.createStatement();
System.out.println("数据库连接成功...........");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
public boolean excuteWrite(String name,String score){
String sql="insert into score values('"+name+"','"+score+"')";
try {
int result=stmt.executeUpdate(sql);
System.out.println("Insert:"+result);
return true;
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
public String excuteRead(){
String sql="select * from score";
String name="",score="";
StringBuffer end=new StringBuffer();
try {
ResultSet result=stmt.executeQuery(sql);
while(result.next()){
name=result.getString(1);
score=result.getString(2);
end.append(name+"\t"+score+"\n");
}
} catch (SQLException e) {
e.printStackTrace();
}
return (null==end) ? "--": end.toString();
}
}
第四章详细设计
4.1 游戏概要
程序启动后,进入游戏界面,用户就可以进行游戏了。

本游戏采用的简便的操作,保留了大部分人的按键习惯。

不仅可以用VK_UP、VK_DOWN、VK_RIGHT、VK_LEFT等按键来进行操作,还可以使用游戏中惯用的W、A、S、D 等按键来进行上下左右操作。

并且采用的数据库MySql和Acess能够对用户的成绩进行保存,方便用户查看成绩记录。

4.1.1 游戏运行界面
4.1.2 分数查看界面
4.2类的详细设计
4.2.1 MyPlane类
1.UML类图
2. 详细分析
(1)成员变量
x,y是int类型的变量,用来记录我方战机的当前位置,进行位图绘制。

du,dd,dr,dl是boolean类型的变量,用来判断我方战机正在向那一个方向行进,一直按下某一个方向,将会向那个方向一直行进,直到边界。

MYPLANE_XSPEED, MYPLANE_YSPEED是int类型的变量,作用是控制我方战机横向和纵向的运行速度,保证一定的速率移动。

live是boolean类型的变量,作用是判断我方战机是否死亡。

(2)成员方法
MyPlane(int x,int y)构造函数,初始化我方战的位置,使之居于中央。

draw(Graphics g)绘图方法,我方战机位置改变时重新绘制。

keyPressed(KeyEvent e)按键方法,键盘上按下相应的键码进行相应的移动。

keyReleased(KeyEvent e)按键释放方法,按键释放使之不再移动。

move()战机移动方法,键按下后进行移动。

getX()获得战机的横向位置。

getY()获得战机的纵向位置。

isLive()战机是否存活。

setLive(boolean live)设置飞机存活状态。

4.2.2 Bullet
1.UML类图
2. 详细分析
(1) 成员变量
BULLET_SPEED为int类型变量,初始为15.战机发射子弹的速率。

x,y为int类型变量,记录子弹的位置。

live为boolean类型的变量,判断子弹是否为有效状态。

bullet为Image类型变量,加载的子弹类图。

(2) 成员方法
Bullet(int x,int y)构造方法,子弹位图绘制的位置。

draw(Graphics g)绘制子弹位图的方法。

isLive()判断子弹是否为有效状态。

setLive(boolean live)设置子弹是否有效。

getX(),getY()获得子弹的位置坐标。

4.2.3 EnemyBullet
1.UML类图
2. 详细分析
(1)成员变量
x,y为int类型变量,记录敌机位置坐标。

bulletspeed为int类型变量,初始值为15,用来设置子弹速度的变量。

live为boolean类型变量,判断子弹是否为有效状态。

enemyplanebullet为Image类型变量,敌机子弹所加载的位图。

(2)成员方法
EnemyBullet(int x,int y)构造方法,初始敌机子弹的位置。

draw(Graphics g)绘制敌机子弹的方法,用来重新绘制。

isLive()敌机子弹是否为存活状态。

setLive(boolean live)设置子弹的状态。

getX(),getY()获取敌机子弹的坐标,用来重新绘制。

4.2.4 EnemyPlane
1.UML类图
2. 详细分析
(1)成员变量
xpeed为敌机的横向运动速度。

yspeed这敌机的纵向运动速度。

live为boolean类型变量,用来设置和判断敌机是否存活。

fired 为boolean类型变量,判断敌机是否为开火状态。

x,y为int类型变量,用来记录敌机的位置。

enemy为Image类型变量,用来加载敌机位图。

rand 为Random类型对象,用来产生随机数。

(2)成员方法
EnemyPlane(StartFrame sf)构造方法,用来初始化敌机。

draw(Graphics g)方法用来重新绘制敌机,重绘方法。

move()方法用来对敌机进行移动,移动方法。

getx(),getY()方法用来获取敌机的位置。

isLive()判断敌机是否为存活状态。

setLive(boolean live)设置敌机是否为存活。

getXpeed()得到敌机的横向运动速度。

setXpeed(int xpeed)设置横向运动速度。

getYspeed()得到纵向运动速度。

setYspeed(int yspeed)设置纵向运动速度。

isFired()是否为开火状态。

setFired(boolean fired)设置开火状态。

4.2.5 Explode
1.UML类图
2. 详细分析
(1)成员变量
x,y为int类型变量,记录爆炸位置。

live 为boolean类型变量,判断爆炸状态。

Explode1为Image类型对象,用来加载爆炸的位图。

(2)成员方法
Explode(int x,int y)构造方法,初始化爆炸位置及位图。

draw(Graphics g)绘制方法,用来绘制爆炸位图。

isLive()是否为存活状态。

setLive(boolean live)设置是否为存活状态。

getCount()得到爆炸次数。

setCount()设置爆炸次数。

4.2.6 PlayMusic
1.UML类图
2. 详细分析
(1)成员变量
musicFile为File类型对象,用来播放的文件。

clip为AudioClip类型对象,进行播放的对象。

fileURI 为URI类型对象,文件的URI路径。

fileURL 为URL类型对象,文件的URL路径。

(2)成员方法
PlayMusic(String music)构造方法,初始化播放的音频文件。

play()播放方法,进行音频播放。

stop()停止方法,音频停止方法。

loop()循环方法,使音频循环播放。

4.2.7 GameBox
1.UML类图
2. 详细分析
(1)成员变量
GAME_WIDTH是int型变量设置游戏面板的宽度为800。

GAME_HEIGHT 是int型变量设置面板的高度为600。

f1I Image类型的对象,用来设置字体的颜色大小和行间距。

backgroundimage 用来加载背景图片。

plane Image类型变量,用来设置加载飞机的图片。

PLANE_WIDTH int类型变量,用来设置飞机的高度。

PLANE_HEIGHT int类型变量用来设置飞机的宽度。

Explode1 Image类型的对象。

用来加载爆炸的图片。

EXPLODE1_WIDTH int类型变量,用来设置爆炸的范围的高度。

EXPLODE1_HEIGHT int类型变量,用来设置爆炸范围的宽度。

Bullet Image类型的对象,用来设置子弹需要加载的图片。

BULLET_WIDTH int型变量,用来设置子弹的宽度。

BULLET_HEIGHT int 型变量,用来设置子弹的高度。

enemy1 Image类型的对象,用来设置敌机的宽度。

enemy2 Image类型的对象,用来设置敌机的高度。

enemybullet Image类型的对象,用来加载敌机发出的子弹。

ENEMYBULLET_WIDTH int类型的变量,用来设置子弹的大小。

ENEMYBULLET_HEIGHT int 类型的变量,用来设置子弹的大小。

back_music 字符串类型变量,加载背景音乐。

bomb_music字符串类型变量,加载子弹爆炸音乐。

4.2.8 DB
1.UML类图
2. 详细分析
(1)成员变量
url为String类型对象,数据库URL路径。

用来连接数据库。

driver为String类型对象,加载数据库的驱动。

conn为Connection类型对象,用来与数据库进行连接。

stmt为Statement类型对象,用来操作Sql语句从而操纵数据库。

(2)成员方法
DB()构造方法,加载数据库驱动,实现数据库连接。

excuteWrite(String name,String score)将数据写入数据库方法。

excuteRead()从数据库中读取数据方法。

4.2.9 StartFrame
1.UML类图
2. 详细分析
(1)成员变量
bk为Image类型对象,用来加载游戏的背景位图。

myplane为MyPlane类型对象,建立我方战机。

sourse 为float类型变量,存储分数。

death, life为我方战机死亡次数和生命值。

bulletlist为ArrayList<Bullet>对象,用来存储子弹的线性表。

explodelist 为ArrayList<Explode>对象,用来存储爆炸对象的线性表。

enemybulletlist为ArrayList<EnemyBullet>对象,用来存储敌机子弹对象的线性表。

exItem,score为Jmenu类型对象,菜单条目。

jp为Jpanel对象,框架类的面板对象。

db为DB对象,用来进行数据库操作。

musicBackground musicBomb为PlayMusic对象,用来播放背景音乐。

(2)成员方法
StartFrame()构造方法,初始化面板及位图。

加载游戏界面。

queryRecord()查询分数记录方法。

void run()游戏进行线程方法,实现游戏的运行。

clearEnemyBullet()清除无效的敌机子弹。

clearBullet()清除无效的子弹。

createBullet()创建子弹。

clearEnemyplane()清除敌机状态为False的对象。

clearExplode()清除爆炸状态为False的对象。

hitPlane()攻击敌机的方法。

impactMyplane()判断是否碰撞。

hitMyplane()我方战机被攻击的方法。

endGame()结束游戏,扫尾方法。

recored()记录成绩方法。

ifEnd()判断是否结束。

actionPerformed(ActionEvent e)菜单条目的动作事件实现方法。

第五章测试
5.1 测试方案
本游戏的测试方法采用检查各个功能,各个模块是否实现的方法。

测试能否正常的运行,游戏是否流畅,是否会卡顿等一系列体验为测试主要因素。

5.2 测试人员及目的
测试人员:雷元刚张柯
测试目的:游戏功能实现、流畅度以及体验感。

5.3 测试项目及功能
5.3.1控制区功能测试
VK_UP按键:实现飞机的向上运动
VK_DOWN按键:实现飞机的向下运动
VK_LFET按键:实现飞机的向左运动
VK_RIGHT按键:实现飞机的向右移动
VK_UP及VK_LFET按键:实现飞机的左上飞行
VK_DOWN及VK_LFET按键:实现飞机的左下飞机
VK_UP及VK_RIGHT按键:实现飞机的右上飞行
VK_DOWN及VK_RIGHT按键:实现飞机的右下飞行
5.3.2菜单区功能测试
分数菜单选项:查看游戏中保存的分数记录
设置菜单选项:设置游戏中的背景音乐
退出菜单选项:退出游戏
5.3.3游戏区功能测试:敌机的正常行进以及我方战机的正常显示。

5.3.4子弹的测试:敌机子弹的正常发射,我方战机的子弹正常发射。

5.4 测试结果及分析
测试1:控制区功能测试
测试内容:我方战机的向上移动、向下移动、向左移动、向右移动、向左上移动、向左下移动、向右下移动、向右上移动的功能实现。

测试目的:VK_UP、VK_DOWN、VK_LEFT、VK_RIGHT等四个功能按键。

测试图:如图5. 4.1
图5. 4.1 控制区功能测试
测试结果及分析:能够正确的通过WASD和方向键控制飞机的运动。

测试2:菜单项功能测试。

测试内容:对菜单项的各个菜单条目进行功能测试。

点击相应的菜单条目,功能能否实现。

测试目的:菜单项的各个功能实现。

测试图如图5.4.2:
图5.4.2 数据保存
测试结果及分析:能够正常显示分数,用户名。

实现了该部分功能的需求
测试3:显示区功能测试
测试内容:我方战机和敌机的正常显示以及敌我双方子弹的正常行进。

测试目的:通过测试,判断程序的功能是否正常
测试图如图5.4.3:
图5.4.3 测试子弹功能
测试结果及分析:通过测试,我方飞机和敌方飞机都能够正常发射子弹,子弹能够正确击中目标。

第六章小结
在本次课程设计中,我们小组采用分工合作方式。

在程序代码和设计报告书写中,小组两人均分工占比达到的50%左右,在代码的设计以及调试中,互相学习交流,对程序代码中有迷糊时,通过讨论、查阅资料来解决这些问题,从而保证了进度。

这次课程设计遇到了许多问题,这也充分暴露了Java知识存储量的不够,在一些Java基础知识上比较薄弱,不明以。

通过了课程设计的问题出现,重新学习了Java的基础知识,对Java知识又有了一个重新的理解。

另外一个主要的问题就是在代码的书写中,有许多Java类以及函数不知道,以至于绕了很多弯路。

在课程设计的代码书写过程中养成了查阅JavaAPI的好习惯,相信会在以后的程序设计中起到重要作用。

针对这一次的课程设计,我做了以下总结:(1)Java是一门面向对象的语言,在程序设计中要有面向对象的思想,相比于代码。

我认为面向对象的思想更加重要,在以后的学习中,要持续培养这种思维。

(2)Java程序中查阅JavaAPI是一种比较好的方法,通过不断的查阅学习过程,能够累积许多新知识,久而久之就是一份巨大的财富。

(3)Java程序中要学会设计,最好是能够懂得设计模式的相关知识,这在程序各个方面都是比较重要的。

致谢
经过两天的不懈努力,很兴奋能完成一个Java编程程序,紧张的心终于可以平静了。

从中体会到以及学习到很多关于Java的知识,使我更加了解Java,并更加熟练了Java。

在此次设计中我也遇到了很多的问题,都是经过查询JavaAPI和询问老师来解决这些问题,更重要的是上课时老师的细心教学,使我们学会了许多关于Java 的基础知识,为本次的课程设计打好了很好的基础。

从而使我能够顺利完成这次课程设计。

在本次做课程设计过程中,要感谢王非老师的悉心关照,一直陪伴我们,并为我们讲解不懂的地方,很是辛苦,也很是忙碌。

还要感谢学院为我们此次课程设计提供机房,让我们有了良好的学习环境可以利用做课程设计,从很大的程度上增强了我们对于Java学习的兴趣。

和小组成员一块讨论,多听听别人的想法,想办法改进自己,这使我受益匪浅。

只有比较才能知道自己的不足。

结束课程设计时,明白了自己与实际所需的距离,因为现在毕业求职难,特别是对于像自己一般的人,更多的时侯是社会,职业选择自己,而不是更多的自己去选择职业,所以更应该把所学的知识灵活地用于实践,这次课程设计就是对自己一个很好的锻炼机会,无论任何的偿试,都是自己以后很宝贵的经验,更是对自己的一种充实。

参考文献
[1] 雍俊海. Java程序设计教程[M]. 北京:清华大学出版社,2014.
[2] 钱慎一. Java程序设计教程实用教程[M]. 北京:科学出版社,2011.
[3] 陈明. 软件工程[M]. 北京:中国铁道出版社,2011.
[4] Ian Sommerville. Software Engineering, Ninth Editi [M]. 北京:机械工业出版社,
2011.
[5] Eric Freeman,ElElisabeth Freeman. HeadFirst设计模式[M]. 北京:中国电力出
版社,2007.
[6] 严蔚敏,吴伟民. 数据结构(C语言版)[M]. 北京:清华大学出版社,2015.
[7] 邓俊辉. 数据结构(C++语言版) [M]. 北京:清华大学出版社,2010.
[8] 王珊,陈红. 数据库系统原理教程[M]. 北京:清华大学出版社,1998.
附录
类StartFrame的源代码如下:
public class StartFrame extends JFrame implements Runnable,ActionListener{ Image bk=GameBox.backgroundimage;/////加载游戏背景
MyPlane myplane;/////实例化自己的飞机对象
List<EnemyPlane> enemyplanelist=new ArrayList<EnemyPlane>();/////敌机线性表private int count=0;
private float sourse=0;
private int life=3,death=0;/////自己子弹线性表
List<Bullet> bulletlist=new ArrayList<Bullet>();/////爆炸线性表
List<Explode> explodelist=new ArrayList<Explode>();/////敌机子弹线性表
List<EnemyBullet> enemybulletlist=new ArrayList<EnemyBullet>();
JPanel jp;
JMenu exItem,score;
JMenuBar menuBar;
PlayMusic musicBackground,musicBomb;
DB db;
public static void main(String[] args) {
new Thread(new StartFrame()).start();
}
public StartFrame(){/////构造函数初始化
db=new DB();
musicBomb=new PlayMusic(GameBox.back_music);
menuBar=new JMenuBar();
score=new JMenu("分数");
score.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e){
queryRecord();
}
});
menuBar.add(score);
exItem=new JMenu("退出");
exItem.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e){
musicBackground.stop();
System.exit(0);
}
});
menuBar.add(exItem);
setJMenuBar(menuBar);
/////设置构架大小
this.setSize(GameBox.GAME_WIDTH,GameBox.GAME_HEIGHT+30);
//窗口居中
int width=Toolkit.getDefaultToolkit().getScreenSize().width;
int height=Toolkit.getDefaultToolkit().getScreenSize().height;
setLocation(width/2-GameBox.GAME_WIDTH/2, /////设置构架位置
height/2-GameBox.GAME_HEIGHT/2);
setResizable(false); /////大小固定
/////设置飞机在框架的位置
myplane=new
MyPlane(GameBox.GAME_WIDTH/2,GameBox.GAME_HEIGHT-GameBox.PLANE_HEIGHT*2);
/////增加敌机线程启动
new Thread(new AddEnemy()).start();
/////为框架添加按键监听
this.addKeyListener(new KeyMonitor());
/////框架添加游戏面板
this.add(new GameJPanel());
/////设置框架名称
setTitle("打飞机小游戏");
addWindowListener(new WindowAdapter(){
@Override
public void windowOpened(WindowEvent arg0) {
musicBackground=new PlayMusic(GameBox.back_music);
musicBackground.loop();
}
@Override
public void windowClosing(WindowEvent arg0) {
musicBackground.stop();
}
});
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
private void queryRecord() {
String score=db.excuteRead();
JFrame scoreFrame=new JFrame("--排行榜--");
JTextArea scoreArea=new JTextArea();
JScrollPane scoreScroll=new JScrollPane(scoreArea);
scoreArea.setText("用户名: \t 最高分:\n");
scoreArea.setEditable(false);
scoreArea.append(score);
scoreFrame.add(scoreScroll);
scoreFrame.setSize(200, 100);
scoreFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
scoreFrame.setVisible(true);
}
@Override
public void run() {
while(true){
repaint();/////Repaints this component.
try {
Thread.sleep(48);/////线程睡眠50毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private class KeyMonitor extends KeyAdapter {
public void keyReleased(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_ENTER){/////按下F2飞机重新活过来myplane.setLive(true);
}
myplane.keyReleased(e);/////传递按键释放对象
}
public void keyPressed(KeyEvent e) {
myplane.keyPressed(e);/////传递按键按下对象
}
}
private class AddEnemy implements Runnable{
@Override
public void run() {
while(true){
try {
Thread.sleep(600);
addEnemyPlane();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void addEnemyPlane(){
EnemyPlane enemyplane=new EnemyPlane(StartFrame.this);
////////为飞机添加子弹到子弹线性表中
enemybulletlist.add(new EnemyBullet(enemyplane.getX(),enemyplane.getY()));
////////添加飞机到敌机线性表中
enemyplanelist.add(enemyplane);
}
}
////////游戏面板
private class GameJPanel extends JPanel{
private static final long serialVersionUID = 1L;
public void paint(Graphics g){
////super.paint(g)是方法的重写,super关键字是屏蔽父类paint(g)方法,执行子类paint (g)方法
super.paint(g);
/////////绘画背景层指定高度的宽度
g.drawImage(bk,0,0,GameBox.GAME_WIDTH,GameBox.GAME_HEIGHT,null);
/////////绘出自己的飞机
myplane.draw(g);
if (count==0){
if(myplane.isLive()){ /////////飞机存活创建子弹
createBullet();
}else{ /////////否则移除所有子弹
for(int i=0;i<bulletlist.size();i++){
bulletlist.remove(i);
}
}
}
count++;////控制发子弹的速度
if(count==2){
count=0;
}
for(int i=0;i<bulletlist.size();i++){
Bullet bullet=bulletlist.get(i);
////得到第I个子弹并且重新画出
bullet.draw(g);
////清掉前面的子弹
clearBullet();
}
////敌机处理
for(int i=0;i<enemyplanelist.size();i++){
EnemyPlane enemyplane=enemyplanelist.get(i);
////取出第I个敌机并且画出
enemyplane.draw(g);
////清掉前面死亡的敌机
clearEnemyplane();
Random rand=new Random();////产生随机数大于93并且敌机存活就创建子弹
if(rand.nextInt(100)>95&&enemyplane.isLive()){
enemybulletlist.add(new
EnemyBullet(enemyplane.getX(),enemyplane.getY()));
}
//如果敌机面对我方飞机时发射一枚子弹敌机存活并且开火if(enemyplane.getX()>=myplane.getX()&&enemyplane.getX()<=myplane.getX()
+GameBox.PLANE_WIDTH&&enemyplane.isFired()&&enemyplane.isLive()){
enemybulletlist.add(new
EnemyBullet(enemyplane.getX(),enemyplane.getY()));
////设置开火为false
enemyplane.setFired(false);
}
}
for(int i=0;i<enemybulletlist.size();i++){
EnemyBullet eb=enemybulletlist.get(i);
////取出子弹并且重画
eb.draw(g);
////清除子弹
clearEnemyBullet();
}
hitPlane();//攻击敌机
impactMyplane();//敌机与我方飞机发生碰撞
if(enemybulletlist.size()>=1)
hitMyplane();//敌机子弹攻击我方战机
for(int i=0;i<explodelist.size();i++){
Explode exp=explodelist.get(i);
exp.draw(g);
exp.setCount(exp.getCount()+1);
clearExplode();
}
g.setColor(Color.RED);
// g.setFont(GameBox.f1);//设置字体之后加载窗口会卡2秒钟if(sourse!=0){
g.drawString("您的得分:"+(int)sourse+"0", 50, 50);
g.drawString("您的生命:"+life, 50, 70);
g.drawString("死亡次数:"+death, 50, 90);
}else{
g.drawString("您的得分:0", 50, 50);
g.drawString("您的生命:"+life, 50, 70);
g.drawString("死亡次数:"+death, 50, 90);
}
}
////敌机子弹不存活立即移除
private void clearEnemyBullet() {
for(int i=0;i<enemybulletlist.size();i++){
if(!(enemybulletlist.get(i).isLive())){
enemybulletlist.remove(i);
}
}
}
////创建子弹
private void createBullet(){
////飞机高度为30宽度加5使子弹看起来是居中的
Bullet bullet=new Bullet((myplane.getX()+5),(myplane.getY()-30));
bulletlist.add(bullet);
}
////清除不存活的子弹Live状态为False
private void clearBullet(){
for(int i=0;i<bulletlist.size();i++){
if(!(bulletlist.get(i).isLive())){
bulletlist.remove(i);
}
}
}
////清除敌机不存活的子弹Live状态为False
private void clearEnemyplane() {
for(int i=0;i<enemyplanelist.size();i++){
if(!(enemyplanelist.get(i).isLive())){
enemyplanelist.remove(i);
}
}
}
////爆炸状态为False清除爆炸
private void clearExplode() {
for(int i=0;i<explodelist.size();i++){
if(!(explodelist.get(i).isLive())){
explodelist.remove(i);
}
}
}
////攻击
private void hitPlane(){
int bx,ex,by,ey;
Bullet bullet;
EnemyPlane enemyplane;
for(int i=0;i<bulletlist.size();i++){
bullet=bulletlist.get(i);
bx=bullet.getX();。

相关文档
最新文档