Java飞机大战
本次的飞机大战是我进入大学以来第一次大部分靠自己的思路写出来的项目,虽然代码质量可能不是很高,但是这次项目完成给我带来的成就感真的很大很大。
飞机大战项目总结
1、游戏开始界面
2、游戏运行界面
3、游戏结束界面
1)解决问题
敌机:大型敌机、中型敌机、小型、boss机
我方:英雄机
背景:天空
2)各个对象所具备的功能和特征
大敌机:有五条生命,从天空上方出现往下走,被击毁后英雄机加五十分
小敌机:有一条生命,从天空上方出现往下走,被击毁后英雄机加十分
中型机:有二条生命,从天空上方出现往下走,被击毁后英雄机加二十分
boss机:英雄机1000毫秒以后出现,有五种火力值会随着生命值的减少和逐渐增加火力
值,有100条生命被击毁后加1000分。
英雄机:初始生命有三条,初始火力为零,英雄机随着鼠标的位置移动,火力大于零后能发
射三发子弹、大于1000后能发射五发。
天空:一个向下移动的背景板什么功能也没有
2)补给:当英雄机捡到补给时生命值加一火力值加一(有三个火力等级,当火力等级为三
生命值为三时再拾取补给将不在增加),当英雄级撞到敌机或被敌方子弹打中时火力值减一
生命值减一
3)计分器:每击杀一个小型飞机、中型飞机、大型飞机分数加十、二十、五十。当击杀boss
时分数增加500.
4)引入了不同的爆炸效果
5)游戏敌机移动的速度会随着时间的增加而增加(即难度会随着时间的递增而递增)敌机
速度最大值为5.
6)游戏有开始界面和结束界面引入了暂停按钮
7)引入音效:有背景音乐、小、大型飞机、boss爆炸音效和子弹发射的音效
8)连接数据库:通过连接数据库记录每次获取的分数进行了一个排序,相当于引入了一个
排行榜(记录前十的分数)
9)游戏难度会随着时间的增加而递增(敌机移动速度会增加,当速度达到5时将不会再
增加)
项目经历(我):我做飞机大战的过程个人觉得比较曲折,起初我是选择在网上找视频资源跟着老师一起敲完这个项目。但是当我做到飞机能够发射子弹这一步时该视频就得付费观看了。所以我只能因此放弃这个方法另找资源继续敲下去。但是因为类名和对象名等都已经确定下来。所以如果不是对先前的代码的每一句话都有着一定的了解那么即便我找到了别的源代码我也很难能继续写下去。所以我们组的进度在这里停顿了许久,因为代码的生涩难懂我甚至产生过放弃的想法跟着别的源代码再从头开始敲一遍。因此我也非常感谢我的搭档在那段时间给予我潜移默化的鼓励(前期功能的实现我们两个都自己敲了一份代码,但是因为进度的停顿所以当时他的进度远远在我前面),再那段时间他教了我很多东西。例如在英雄机碰撞减少火力值和生命值可以参考之前英雄级发射子弹与敌机碰撞的代码。听起来这是不一样的功能。但是实际上他们的思路可以说是一模一样的。于是我便以这种方法一直扩展功能才能完善到如今这个模样。
项目经历(队友):本次java课程设计我们选择的是飞机大战。对于第一次做这样课程设计的我来说,有点慌张,但同时又有点激动,因为这也是一个让我们能力提高很多的机遇。
刚开始我们是毫无头绪的,听到别人一个下午就把课设的很多界面写完了,我心里就很着急,但是又无能为力,毕竟我能力有些欠缺,只能不停的找博客看代码。慢慢的,我们的飞机大战雏形基本完成,功能也基本实现,但也只是实现了一部分的基本要求。
“亮点是什么?”这个问题一直围绕我们很久,我们经过无数次思考,最终决定加入其他类型飞机。。。。。。。最后为了实现这些功能,我们不得不将前面一部分代码推翻,找其他方法去实现。
最终经过我们不断地修正,飞机大战基本实现,但仍存在一点点bug。而后面大部分时间,我们都是在不停的找bug。最终基本实现我们的想法后,我们两个都很开心。
这次课设,我们不仅掌握了java界面设计方面的方法、多线程的运用,更是锻炼了团队协作能力,也锻炼了我们java的界面设计能力。今后对于这样的课设,我们也会认真对待,争取做出亮点十分突出的东西!
收获(我):这次的飞机大战是我第一次用Java写项目,从中的收获个人感觉是很大的。我从中学会image对图片的引入,见识了多线程连续绘画图片让地图子弹飞机移动起来。然后各种坐标的计算来给子弹的发射位置,敌机的出现和移动规律构图等等。更大的收获是这是我第一次有着自己的想法写下来的代码。并没有看网上的代码写下来了几个类,例如引入多种敌机还有火力值增加等。靠着自己所学知识完完全全实现的功能真的给我的成就感特别特别多。很满足这次的Java项目设计。但如果时间充足的话我还是希望能够实现一个关卡功能和多种英雄级角色,让游戏功能变得更加完善
收获(队友):第一次用java完成一个项目。过程中曲折也挺多的,但同时我们也收获了很多。多线程的运用,绘图方法的运用,以及各种物品之间的交互功能的判断等等。这无疑让我在Java界面设计上的能力得到了一次锻炼。不仅仅是编程方面的能力,我的自学能力也得到了一定的锻炼,对于不太理解的方法,我都是查找博客,通过消化别人的方法,然后按照自己的理解来解决问题。
对于我们的飞机大战,我觉得是还不错。但我觉得我们可以做得更好。我们的设想远不止于此,相信我们也会在假期通过对java的深入理解,不断完善我们的飞机大战。
下面是携带上我这次飞机大战的代码:
Airdrop类
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.util.Random;
public class Airdrop {
//设置飞机大小
public int width = 50;
public int length = 50;
public int x;
public int y;
//导入补给图片
public Image images = Toolkit.getDefaultToolkit().getImage("src/图片/airdrop.png");
public Mypanel mypanel;
public Airdrop(Mypanel mypanel) {
this.mypanel=mypanel;
Random r=new Random();
x=r.nextInt(BaseFrame.framewidth-width);
y=0;
}
public void drawSelf(Graphics g){
g.drawImage(images,x,y,width,length,null);
Player p=mypanel.player;
for(int i=0;i<mypanel.airdrops.size();i++){
Airdrop a=mypanel.airdrops.get(i);
if(((a.x-p.x<=a.width/2+p.width/2&&a.x>=p.x)||(p.x-a.x<=a.width/2+p.width/2&&a.x<=p.x))&&((a.y-p.y<=a.length/2+p.length/2&&a.y>=p.y)||(p.y-a.y<=a.length/2+p.length/2&&a.y<=p.y))){
{
mypanel.airdrops.remove(a);
if(mypanel.player.fire<3)
{
mypanel.player.fire++;//飞机捡到补给火力加一
mypanel.player.life++;//飞机检到补给生命值加一
}
}
}
}
if(mypanel.time%6==0){
y+=2;
if(y>=BaseFrame.framelength){
mypanel.airdrops.remove(this);
}
}
}
}
BaseFrame类
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class BaseFrame extends JFrame implements ActionListener {
public static int framewidth = 345;
public static int framelength = 575;
public Mypanel mypanel;
public JButton jb=new JButton(“排行”);
public JButton jb2=new JButton(“暂停”);
JLayeredPane lay=new JLayeredPane();
public FrameMouseListener frameMouseListener;// 鼠标监听器
public void setTouchListener() {
frameMouseListener = new FrameMouseListener();
frameMouseListener.baseFrame = this;
this.addMouseMotionListener(frameMouseListener);// 注册监听器
}
public BaseFrame() {
this.setTitle("飞机大战");
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
this.setSize(framewidth, framelength);
this.setLocationRelativeTo(null);
this.setLayout(null);
mypanel = new Mypanel(this);
mypanel.setSize(345, 575);
//this.add(mypanel);
lay.add(mypanel,JLayeredPane.DEFAULT_LAYER);
this.setLayeredPane(lay);
jb.setBounds(345/2-35, 400-20, 70, 40);
jb.addActionListener(this);
lay.add(jb,JLayeredPane.MODAL_LAYER);
jb2.setBounds(305-30, 0, 60, 20);
jb2.addActionListener(this);
lay.add(jb2,JLayeredPane.MODAL_LAYER);
mypanel.bg.loop();
// 设置监听器
// setTouchListener();
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource()==jb) {
//new Score();
}
else if(e.getSource()==jb2) {
try {
mypanel.drawaleThread.sleep(10000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
package project;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
public class Bomb {
public int x;
public int y;
public int count=0;
Image boom= Toolkit.getDefaultToolkit().getImage(“src/图片/bom3.png”);
public int width=boom.getWidth(null);
public int length=boom.getHeight(null);
public Bomb(int bx,int by){
this.x=bx;
this.y=by;
}
public void drawSelf(Graphics g){
g.drawImage(boom,x,y,width,length,null);
this.count++;
}
}
Bullet类
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
public class Bullet {
public Mypanel mypanel;
public int width=6;
public int length=14;
public int x;
public int y;
//存放所有的子弹图片对象
public Image[] image=new I