打飞机小游戏 Java课程设计.docx
《打飞机小游戏 Java课程设计.docx》由会员分享,可在线阅读,更多相关《打飞机小游戏 Java课程设计.docx(54页珍藏版)》请在冰豆网上搜索。
打飞机小游戏Java课程设计
四川理工学院
课程设计书
学院计算机学院
专业计算机科学与技术
班级计科2014级
题目打飞机小游戏
教师王非
学生雷元刚张柯
摘要
随着Java语言的兴起,越来越多的平台开始使用java语言编写的程序,虽然不及C语言的高效,但是Java拥有的平台无关性是其他平台所不能企及的。
几乎所有的银行系统都是运用Java来编写的,主要是因为其安全性较高。
Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
而运用Java编写图形化界面也是比较容易的,因为其有专门的框架和界面,这样使得几行代码就可以创建一个图形化界面了。
而本次要编写的打飞机小游戏,重复运用了图形化界面的知识,多线程,重画,添加监听器等。
锻炼了我们实践编写界面代码的能力,提高了我们对于图形化界面编程的理解和运用各种容器和组件来实现我们所需要的界面。
关键词:
打飞机,多线程,重画,图形化
第一章前言
随着网络的不断发展,在中国网民的数量越来越多。
人们也对于互联网所能提供的功能有了一定的要求,比如能够在线观看视频,在线游戏,大数据服务。
互联网经过短短几十年的发展,相比起当初,已经发生了翻天覆地的变化。
而游对于互联网的发展也有着一定的推动作用.
SQLServer是目前应用比较广泛的关系型数据库标准语言之一。
现在,SQL已成为国际标准语言,各种类型的计算机和DBS都采用SQL作为其存取语言和标准接口,从而使数据库世界有可能链接为一个统一的整体.
MicrosoftOfficeAccess是由微软发布的关系数据库管理系统。
它结合了MicrosoftJetDatabaseEngine和图形用户界面两项特点,是MicrosoftOffice的系统程序之一.对于广大用户而言,Access数据库的操作简便,和Office一起安装的,所以也有广泛的通用性。
以数据库技术作为后台的可视化应用也越来越受到人们的喜爱,Java是目前应用比较流行的可视化编程软件之一。
它的功能强大,系统自带的代码较为齐,容易操作,受到很多用户的喜欢。
Java开发游戏也是比较容易的,对于广大的网民和学生,在工作之余能够玩玩游戏也是一种不错的选择的休闲的方式,并且伴随着网络的普及化,越来越多的人们开始加入到游戏的大军中来,所以开发一款适合的游戏显的尤为重要。
1.1开发背景
游戏自古以来就有,以前的象棋,围棋,到现在的军旗,跳跳棋.毫不夸张的说,游戏是人类智慧的结晶,是我们休闲娱乐的一种方式。
数据库技术产生于20世纪60年代末70年代初,其主要目的是有效地管理和存取大量的数据资源。
数据库技术主要研究如何存储,使用和管理数据.数年来,数据库技术和计算机网络技术的发展相互渗透,相互促进,已成为当今计算机领域发展迅速,应用广泛的两大领域.数据库技术不仅应用于事务处理,并且进一步应用到情报检索,人工智能,专家系统,计算机辅助设计等领域。
游戏加入数据库技术,能够在一定程度上减轻服务器的负担,提高服务器的负载能力.有利用实现更好的用户体验和数据的离线保存,有助于对于游戏数据的分析和处理。
在大数据时代,对于数据的分析和处理显的更加重要。
1。
1。
1开发环境
Windos系统,JDK1.8,jre7,Access数据库,Mysql数据库,EclipseMARS软件一套。
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分数数据表
字段名
数据类型
宽度
是否为空
说明
User_Name
varchar
10
不允许为空
记录者ID
User_Score
varchar
10
不允许为空
记录者成绩
(2)数据库管理软件采用Mysql或者Acess,通过这两款软件来管理程序中需要存储管理的数据,并且能够加强我们的数据库思维,为以后的开发打好基础.数据库的详细代码设计如下:
packageTools;
publicclassDB{
privateStringurl=”jdbc:
mysql:
//localhost:
3306/plane”;
privateStringdriver="com。
mysql.jdbc。
Driver";
privateConnectionconn;
privateStatementstmt;
publicDB(){
try{
Class。
forName(driver);
conn=DriverManager.getConnection(url,”root",”123");
stmt=conn.createStatement();
System。
out.println(”数据库连接成功。
.。
。
。
。
..。
..");
}catch(ClassNotFoundExceptione){
e。
printStackTrace();
}catch(SQLExceptione){
e.printStackTrace();
}
}
publicbooleanexcuteWrite(Stringname,Stringscore){
Stringsql=”insertintoscorevalues('"+name+”','”+score+”')”;
try{
intresult=stmt.executeUpdate(sql);
System。
out.println(”Insert:
”+result);
returntrue;
}catch(SQLExceptione){
e。
printStackTrace();
}
returnfalse;
}
publicStringexcuteRead(){
Stringsql="select*fromscore”;
Stringname=”",score="";
StringBufferend=newStringBuffer();
try{
ResultSetresult=stmt.executeQuery(sql);
while(result。
next()){
name=result.getString
(1);
score=result。
getString
(2);
end。
append(name+”\t"+score+"\n”);
}
}catch(SQLExceptione){
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.1MyPlane类
1.UML类图
2。
详细分析
(1)成员变量
●x,y是int类型的变量,用来记录我方战机的当前位置,进行位图绘制。
●du,dd,dr,dl是boolean类型的变量,用来判断我方战机正在向那一个方向行进,一直按下某一个方向,将会向那个方向一直行进,直到边界。
●MYPLANE_XSPEED,MYPLANE_YSPEED是int类型的变量,作用是控制我方战机横向和纵向的运行速度,保证一定的速率移动。
●live是boolean类型的变量,作用是判断我方战机是否死亡.
(2)成员方法
●MyPlane(intx,inty)构造函数,初始化我方战的位置,使之居于中央。
●draw(Graphicsg)绘图方法,我方战机位置改变时重新绘制。
●keyPressed(KeyEvente)按键方法,键盘上按下相应的键码进行相应的移动。
●keyReleased(KeyEvente)按键释放方法,按键释放使之不再移动.
●move()战机移动方法,键按下后进行移动。
●getX()获得战机的横向位置。
●getY()获得战机的纵向位置。
●isLive()战机是否存活。
●setLive(booleanlive)设置飞机存活状态。
4。
2。
2Bullet
1.UML类图
2.详细分析
(1)成员变量
●BULLET_SPEED为int类型变量,初始为15.战机发射子弹的速率.
●x,y为int类型变量,记录子弹的位置。
●live为boolean类型的变量,判断子弹是否为有效状态。
●bullet为Image类型变量,加载的子弹类图。
(2)成员方法
●Bullet(intx,inty)构造方法,子弹位图绘制的位置。
●draw(Graphicsg)绘制子弹位图的方法.
●isLive()判断子弹是否为有效状态.
●setLive(booleanlive)设置子弹是否有效。
●getX(),getY()获得子弹的位置坐标。
4.2。
3EnemyBullet
1.UML类图
2。
详细分析
(1)成员变量
●x,y为int类型变量,记录敌机位置坐标。
●bulletspeed为int类型变量,初始值为15,用来设置子弹速度的变量。
●live为boolean类型变量,判断子弹是否为有效状态。
●enemyplanebullet为Image类型变量,敌机子弹所加载的位图.
(2)成员方法
●EnemyBullet(intx,inty)构造方法,初始敌机子弹的位置。
●draw(Graphicsg)绘制敌机子弹的方法,用来重新绘制。
●isLive()敌机子弹是否为存活状态.
●setLive(booleanlive)设置子弹的状态。
●getX(),getY()获取敌机子弹的坐标,用来重新绘制。
4.2.4EnemyPlane
1.UML类图
2。
详细分析
(1)成员变量
●xpeed为敌机的横向运动速度。
●yspeed这敌机的纵向运动速度.
●live为boolean类型变量,用来设置和判断敌机是否存活.
●fired为boolean类型变量,判断敌机是否为开火状态。
●x,y为int类型变量,用来记录敌机的位置.
●enemy为Image类型变量,用来加载敌机位图。
●rand为Random类型对象,用来产生随机数.
(2)成员方法
●EnemyPlane(StartFramesf)构造方法,用来初始化敌机。
●draw(Graphicsg)方法用来重新绘制敌机,重绘方法。
●move()方法用来对敌机进行移动,移动方法。
●getx(),getY()方法用来获取敌机的位置。
●isLive()判断敌机是否为存活状态。
●setLive(booleanlive)设置敌机是否为存活。
●getXpeed()得到敌机的横向运动速度。
●setXpeed(intxpeed)设置横向运动速度。
●getYspeed()得到纵向运动速度。
●setYspeed(intyspeed)设置纵向运动速度。
●isFired()是否为开火状态。
●setFired(booleanfired)设置开火状态。
4。
2.5Explode
1.UML类图
2.详细分析
(1)成员变量
●x,y为int类型变量,记录爆炸位置.
●live为boolean类型变量,判断爆炸状态.
●Explode1为Image类型对象,用来加载爆炸的位图。
(2)成员方法
●Explode(intx,inty)构造方法,初始化爆炸位置及位图.
●draw(Graphicsg)绘制方法,用来绘制爆炸位图。
●isLive()是否为存活状态。
●setLive(booleanlive)设置是否为存活状态。
●getCount()得到爆炸次数。
●setCount()设置爆炸次数.
4.2。
6PlayMusic
1.UML类图
2。
详细分析
(1)成员变量
●musicFile为File类型对象,用来播放的文件。
●clip为AudioClip类型对象,进行播放的对象。
●fileURI为URI类型对象,文件的URI路径。
●fileURL为URL类型对象,文件的URL路径。
(2)成员方法
●PlayMusic(Stringmusic)构造方法,初始化播放的音频文件.
●play()播放方法,进行音频播放。
●stop()停止方法,音频停止方法。
●loop()循环方法,使音频循环播放.
4。
2。
7GameBox
1.UML类图
2。
详细分析
(1)成员变量
●GAME_WIDTH是int型变量设置游戏面板的宽度为800。
●GAME_HEIGHT是int型变量设置面板的高度为600。
●f1IImage类型的对象,用来设置字体的颜色大小和行间距。
●backgroundimage用来加载背景图片。
●planeImage类型变量,用来设置加载飞机的图片。
●PLANE_WIDTHint类型变量,用来设置飞机的高度。
●PLANE_HEIGHTint类型变量用来设置飞机的宽度.
●Explode1Image类型的对象。
用来加载爆炸的图片。
●EXPLODE1_WIDTHint类型变量,用来设置爆炸的范围的高度。
●EXPLODE1_HEIGHTint类型变量,用来设置爆炸范围的宽度。
●BulletImage类型的对象,用来设置子弹需要加载的图片.
●BULLET_WIDTHint型变量,用来设置子弹的宽度。
●BULLET_HEIGHTint型变量,用来设置子弹的高度。
●enemy1Image类型的对象,用来设置敌机的宽度。
●enemy2Image类型的对象,用来设置敌机的高度。
●enemybulletImage类型的对象,用来加载敌机发出的子弹.
●ENEMYBULLET_WIDTHint类型的变量,用来设置子弹的大小。
●ENEMYBULLET_HEIGHTint类型的变量,用来设置子弹的大小。
●back_music字符串类型变量,加载背景音乐。
●bomb_music字符串类型变量,加载子弹爆炸音乐.
4.2。
8DB
1.UML类图
2。
详细分析
(1)成员变量
●url为String类型对象,数据库URL路径.用来连接数据库。
●driver为String类型对象,加载数据库的驱动。
●conn为Connection类型对象,用来与数据库进行连接.
●stmt为Statement类型对象,用来操作Sql语句从而操纵数据库。
(2)成员方法
●DB()构造方法,加载数据库驱动,实现数据库连接.
●excuteWrite(Stringname,Stringscore)将数据写入数据库方法。
●excuteRead()从数据库中读取数据方法。
4。
2。
9StartFrame
1.UML类图
2。
详细分析
(1)成员变量
●bk为Image类型对象,用来加载游戏的背景位图。
●myplane为MyPlane类型对象,建立我方战机。
●sourse为float类型变量,存储分数。
●death,life为我方战机死亡次数和生命值。
●bulletlist为ArrayList〈Bullet>对象,用来存储子弹的线性表。
●explodelist为ArrayList对象,用来存储爆炸对象的线性表。
●enemybulletlist为ArrayList●exItem,score为Jmenu类型对象,菜单条目。
●jp为Jpanel对象,框架类的面板对象。
●db为DB对象,用来进行数据库操作。
●musicBackgroundmusicBomb为PlayMusic对象,用来播放背景音乐。
(2)成员方法
●StartFrame()构造方法,初始化面板及位图.加载游戏界面。
●queryRecord()查询分数记录方法。
●voidrun()游戏进行线程方法,实现游戏的运行.
●clearEnemyBullet()清除无效的敌机子弹.
●clearBullet()清除无效的子弹.
●createBullet()创建子弹。
●clearEnemyplane()清除敌机状态为False的对象.
●clearExplode()清除爆炸状态为False的对象。
●hitPlane()攻击敌机的方法。
●impactMyplane()判断是否碰撞。
●hitMyplane()我方战机被攻击的方法.
●endGame()结束游戏,扫尾方法。
●recored()记录成绩方法.
●ifEnd()判断是否结束。
●actionPerformed(ActionEvente)菜单条目的动作事件实现方法。
第五章测试
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基础知识上比较薄弱,不明以。
通过了课