java课程设计报告39577.docx
《java课程设计报告39577.docx》由会员分享,可在线阅读,更多相关《java课程设计报告39577.docx(49页珍藏版)》请在冰点文库上搜索。
java课程设计报告39577
学院
Java课程设计报告
题目風云J-20
所在院系计科学院
学生仁华
专业计算机科学与技术
班级09计本1班
学号2009406010
2011年12月15日
一、游戏项目分析与设计
1、游戏项目功能分析
本游戏通过玩家飞机(J-20)发射子弹攻击敌机,当敌机被飞机子弹打中的时候飞发生爆炸,使得敌机消失,并且同时播放效果音乐以及爆炸效果。
本游戏中的角色J-20、敌机、B-2等均能发射子弹攻击对方,其中B-2能够发射导弹。
当敌机子弹打中J-20时J-20的生命值J-20_HP会相应的减少,当B-2的子弹或者导弹击中J-20时J-20的HP也相应的减少。
当飞机与敌机相撞的时候,敌机爆炸(同时播放效果),J-20_HP减少,J-20与B-2相撞的时候J-20发生爆炸且游戏结束。
当J-20_HP为0时,游戏结束,当J-20的子弹打中B-2时B-2_HP减少,当减少到0的时候B-2死亡,游戏胜利即游戏通关。
2、本系统共包括六个Java源文件
类之间的关系如图1.1所示。
图1.1类之间的关系
3、Java源文件及其功能如表1.1所示。
表1.1文件清单
序号
文件名
主要功能
备注
1
StartGame.java
主窗体类
含main方法
2
FeiJi.java
定义飞机类
3
ZiDan.java
定义飞机的子弹类
4
DiJi.java
定义敌机类
5
DiJiZiDan.java
定义敌机子弹类
6
Boss.java
定义Boss类(B-2)
7
BossZiDan.java
定义Boss子弹类
8
BossDaoDan.java
定义BossDaodan类
9
GuanBi.java
定义关闭游戏窗口类
10
BeiJing.java
定义游戏背景类
11
GameSound.java
定义播放背景音乐类
二、系统实现
1、主类StartGame(其中有一个部类(线程类))
(1)成员变量如表2.1所示
表2.1成员变量
成员变量描述
变量类型
成员变量名
工具包
Toolkit
Tool
缓冲图片
Image
Hc_img
游戏状态
int
Game_type
敌机数量
int
DJNum
子弹坐标
int
zd_y
飞机对象
FeiJi
Fj
Boss对象
Boss
Bs
背景对象
BeiJing
bj
子弹集合
ArrayList
zd_List
敌机集合
ArrayList
dj_List
敌机子弹集合
ArrayList
djzd_List
Boss导弹集合
ArrayList
bsdd_List
Boss子弹集合
ArrayList
bszd_List
Boss子弹集合
ArrayList
bszd01_List
爆炸集合
ArrayList
bz_List
爆炸图片数组
Image
bz_img[15]
媒体跟踪器对象
MediaTracker
mt
声音对象
GameSound
music
计数器
int
num
(2)方法如表2.2所示
表2.2方法
名称
功能
备注
showWindow()
创建主窗口
addKeyListener()
添加键盘监听
update(Graphicsg)
创建缓冲图片
paint(Graphicsg)
画图片方法
main(String[]args)
主方法
(3)源文件StartGame.java代码如下给出。
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Frame;
importjava.awt.Graphics;
importjava.awt.Image;
importjava.awt.MediaTracker;
importjava.awt.Toolkit;
importjava.awt.event.KeyAdapter;
importjava.awt.event.KeyEvent;
importjava.util.ArrayList;
publicclassStartGameextendsFrame{
//Toolkit.getDefaultToolkit()→获取默认工具包
publicToolkittool=Toolkit.getDefaultToolkit();
Imagehc_img=null;
//设置游戏状态0初始1进行中2胜利3失败4暂停
intgame_type=0;
//敌机死亡数量
intDJNum=0;
intzd_y;
//创建一个飞机类对象
FeiJifj=null;
//创建一个Boss对象
Bossbs=null;
//创建一个背景对象
BeiJingbj=null;
//创建一个子弹集合,
ArrayListzd_List=newArrayList();
//创建一个敌机集合,
ArrayListdj_List=newArrayList();
//创建敌机子弹集合
ArrayListdjzd_List=newArrayList();
//创建Boss子弹集合
ArrayListbosszd_List=newArrayList();
ArrayListbosszd01_List=newArrayList();
//创建Boss导弹集合
ArrayListbossdd_List=newArrayList();
//创建一个子弹爆炸集合
ArrayListbz_List=newArrayList();
//定义一个爆炸图片数组
Image[]bz_img=newImage[15];
//定义一个媒体跟踪器
MediaTrackermt=newMediaTracker(this);
//创建一个声音类对象
GameSoundmusic=newGameSound();
//创建一个计数器
publicintnum=0;
//创建一个线程类
publicvoidshowWindow(){
//把爆炸图片存到图片数组中
for(inti=0;iImageimg=tool.getImage(StartGame.class
.getResource("Images/largeBurst"+i+".png"));
bz_img[i]=img;
mt.addImage(img,0);
}
try{
mt.waitForID(0);
}catch(InterruptedExceptione1){
e1.printStackTrace();
}
//播放音乐
music.playBgSound("go.mp3");
//设置窗体的标题
setTitle("風云J-20I");
//获取屏幕的x,y坐标
intx=tool.getScreenSize().width;
inty=tool.getScreenSize().height;
//设置窗体的大小
setSize(600,700);
//创建一个飞机对象
fj=newFeiJi(getWidth()/2-30,getHeight()-80,this);
//创建一个线程对象
MyThreadmy=newMyThread();
//启动线程
my.start();
//创建一个背景对象
bj=newBeiJing(this);
//创建一个Boss对象
bs=newBoss(getWidth()/2-120,this);
//设置窗体的初始位置设置居中.屏幕x坐标的一半减去组件x坐标的一半,屏幕y坐标的一半减去组件y坐标的一半.
setLocation(x/2-getWidth()/2,y/2-getHeight()/2);
//是否允许用户改变窗体大小
setResizable(false);
//设置窗体是否可见
setVisible(true);
//调用提供关闭的方法
Guanbigb=newGuanbi();
addWindowListener(gb);
//添加键盘监听器
addKeyListener(newKeyAdapter(){
publicvoidkeyPressed(KeyEvente){
//游戏状态必须为0,同时必须按下enter键
if(e.getKeyCode()==10&&game_type==0){
game_type=1;
//播放游戏开始的music
music.playBgSound("BGM_0001.mp3");
}
//当游戏失败的时候按Enter键初始化游戏状态
if(e.getKeyCode()==10&&game_type==3){//游戏状态为3,同时必须按下enter键
game_type=1;
//播放游戏开始的music
music.playBgSound("BGM_0001.mp3");
m.fj.hp=120;//玩家HP
fj=newFeiJi(getWidth()/2-30,getHeight()-80,m);//飞机返回初始坐标
zd_List.removeAll(zd_List);//移除所有的子弹集合
bz_List.removeAll(bz_List);//移除所有的爆炸集合
bosszd_List.removeAll(bosszd_List);//移除Boss子弹集合
bosszd01_List.removeAll(bosszd01_List);//移除Boss子弹集合
bossdd_List.removeAll(bossdd_List);//移除Boss导弹集合
}
//飞机移动
fj.moveFeiJi(e);
}
});
}
//创建一个窗体对象
StartGamem=this;
//定义一个计数器,用于记住子弹打死敌机的个数
intdjNum=0;
classMyThreadextendsThread{
//重写Thread类的run()
publicvoidrun(){
while(true){
try{
Thread.sleep(30);
num++;
if(num==80){
DiJidj=newDiJi(m);
dj_List.add(dj);
num=0;
djNum++;
}
}catch(InterruptedExceptione){
e.printStackTrace();
}
repaint();
}
}
}
//创建图片缓冲区
publicvoidupdate(Graphicsg){
if(hc_img==null){
//创建缓冲图片
hc_img=createImage(getWidth(),getHeight());
}
//得到缓冲图片的画笔
Graphicshc_g=hc_img.getGraphics();
//把窗体图片画在缓冲图片上
paint(hc_g);
//把缓冲图片画到窗体上
g.drawImage(hc_img,0,0,getWidth(),getHeight(),this);
}
//重写paint方法
publicvoidpaint(Graphicsg){
if(game_type==0){
bj.paintBJ(g);
}elseif(game_type==1){
bj.paintStartingBJ(g);
//画一个飞机
fj.paintFeiJi(g);
//从子弹集合中取出子弹
for(inti=0;iZiDanzd=(ZiDan)zd_List.get(i);
//画子弹
zd.paintZiDan(g);
}
//如果打死的敌机数超过10,这画Boss
if(djNum>=10){
//画Boss
bs.paintBoss(g);
}
//从敌机集合里面讲敌机取出来
for(intj=0;jDiJidj=(DiJi)dj_List.get(j);
//画敌机
dj.paintDiJi(g);
//如果Boss出现则移除所有的敌机
if(bs.boss_y>=0){
dj_List.removeAll(dj_List);
}
}
//从敌机子弹集合里面将敌机子弹取出来
for(intk=0;kDiJiZiDandjzd=(DiJiZiDan)djzd_List.get(k);
//画敌机子弹
djzd.paintDiJiZiDan(g);
//如果Boss出现则移除所有的敌机
if(bs.boss_y>=0){
djzd_List.removeAll(djzd_List);
}
}
//从Boss子弹集合里面将Boss子弹取出来
for(intk=0;kBossZiDanbosszd=(BossZiDan)bosszd_List.get(k);
//画敌机子弹
bosszd.paintBossZiDan(g);
}
//从Boss子弹集合里面将Boss子弹取出来
for(intk=0;kBossZiDanbosszd01=(BossZiDan)bosszd01_List.get(k);
//画敌机子弹
bosszd01.paintBossZiDan(g);
}
//从Boss导弹集合里面将Boss导弹取出来
for(intk=0;kBossZiDanbossdd=(BossZiDan)bossdd_List.get(k);
//画敌机子弹
bossdd.paintBossDaoDan(g);
}
//画子弹打中目标时的爆炸
for(intj=0;jBaoZhabz=(BaoZha)bz_List.get(j);
//画敌机子弹
bz.paintBaoZha(g);
}
}elseif(game_type==2){//游戏胜利
//画一个游戏胜利的图片
bj.paintStartingBJ(g);
//设置画笔颜色
g.setColor(Color.RED);
//设置画笔字体大小和类型
g.setFont(newFont("华文行楷",Font.BOLD,40));
//在窗体上打印“GameOver!
!
”
g.drawString("GameWin!
",getWidth()/2-100,getHeight()/2);
g.drawString("Youaresogreat!
",getWidth()/2-150,
getHeight()/2+50);
}elseif(game_type==3){//游戏失败
//画一个游戏失败的图片
bj.paintStartingBJ(g);
//设置画笔颜色
g.setColor(Color.RED);
//设置画笔字体大小和类型
g.setFont(newFont("华文行楷",Font.BOLD,40));
//在窗体上打印“GameOver!
!
”
g.drawString("GameOver!
",getWidth()/2-100,getHeight()/2);
g.drawString("按Enter键继续游戏!
",getWidth()/2-,
getHeight()/2+50);
}
}
//主方法
publicstaticvoidmain(String[]args){
StartGamem=newStartGame();
m.showWindow();
}
}
2、类FeiJi
(1)成员变量如表2.3所示
表2.3成员变量
成员变量描述
变量类型
成员变量名
飞机坐标
int
fj_x,fj_y
飞机生命值
int
Hp
窗体对象
StartGame
m
工具包
Toolkit
Tool
飞机图片
Imge
fj_img
(2)方法如表2.4所示
表2.4方法
名称
功能
备注
FeiJi(intx,inty,inthp)
初始化fj_x,fj_y,hp
构造方法
paintFeiJi(Graphicsg)
画飞机图片
getRect()
话矩形框
套住飞机
moveFeiJi(keyEvente)
移动飞机
(3)源文件FeiJi.java如下列出。
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.Image;
importjava.awt.Rectangle;
importjava.awt.Toolkit;
importjava.awt.event.KeyEvent;
publicclassFeiJi{
publicintfj_x;
publicintfj_y;
finalintA=60;
//Boss的生命值
publicinthp=120;
//创建一个窗体对象
StartGamem=null;
//Toolkit.getDefaultToolkit()→获取默认工具包
publicToolkittool=Toolkit.getDefaultToolkit();
//得到一个飞机图片
Imagefj_img=tool.getImage(FeiJi.class.getResource("Images/J-20a.png"));
//通过构造方法实例化StartGame对象和为飞机设置初始位置
publicFeiJi(intfj_x,intfj_y,StartGamem){
this.fj_x=fj_x;
this.fj_y=fj_y;
this.m=m;
}
//一个画飞机的方法
publicvoidpaintFeiJi(Graphicsg){
g.drawImage(fj_img,fj_x,fj_y,A,A,m);
g.setColor(Color.red);//画笔颜色为红色
g.setFont(newFont("隶书",Font.BOLD,15));
//在窗体上打印fj的生命值hp
g.drawString("J-20hp",m.getWidth()-590,m.getHeight()-25);
g.drawRect(10,685,120,5);//画一个矩形边框
g.fillRect(10,685,hp*1,5);//画一个矩形实体框
//判断飞机是否与敌机相撞
for(intk=0;k//取出单个敌机
DiJidj=(DiJi)m.dj_List.get(k);
//判断飞机是否与敌机相撞
booleanbool=this.getRect().intersects(dj.getRect());
if(bool){
//如果飞机与敌机相撞则移除敌机
m.dj_List.remove(dj);
BaoZhabz=newBaoZha(dj.dj_x,dj.dj_y,m,m.bz_img);
m.bz_List.add(bz);
//飞机生命值减少
this.hp-=30;
//播放音乐
m.music.playSound("bz.mp3");
}
}