Java飞机大战源代码
刚学不久java,做了一个飞机大战的小小小小游戏,现在把这个思路总结以及代码分享出来。大佬别吐槽(emmmmmm .....
开发环境:jdk1.7
开发工具:eclipese
PlanelJPanel.java
package project02;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Shape;
import java.awt.Stroke;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.math.MathContext;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
import sun.invoke.util.BytecodeName;
public class PlanelJPanel extends JPanel implements Runnable,MouseListener,MouseMotionListener{
//定义一个图片对象
int zdx,zdy;
static Image startImg;
int cout=0;
int score=0;
//创建一个放飞机的数组
static BufferedImage p[]=new BufferedImage[2];
static BufferedImage game[]=new BufferedImage[2];
//定义图片的坐标
int x=0,y=0;
//飞机坐标
int px=100,py=100;
int pc=0;
//定义开始游戏的开关 ,当ck等于true表示没有开始游戏;
boolean ck=true;
//定义子弹图片
static Image bImg;
//定义奖励子弹
static Image award2;
static Image blast;
int awardx=100;
int awardy=100;
//定义及奖励的出现的时间;
int AwardTime=0;
//定义敌人飞机图片数组
static BufferedImage Dpanel[]=new BufferedImage[5];
//定义敌人飞机坐标
int Djx,Djy=0;
List<Dpanel> Djs=new ArrayList<Dpanel>();//把敌人加到集合
List<Bullet> bullets=new ArrayList<Bullet>();//把子弹加到集合
//定义游戏暂停开关
boolean suspend=false;
boolean gz=false;
boolean tt=false;
boolean gameOver=false;//游戏结束按钮
//定义线程
Thread thread;
//静态代码块
static {
//加载图片
try {
startImg=ImageIO.read(new File("images/GameInterface/interface_1.png"));
p[0]=ImageIO.read(new File("images/1.png"));
p[1]=ImageIO.read(new File("images/2.png"));
bImg=ImageIO.read(new File("images/bullet/bullet_1.png"));
Dpanel[0]=ImageIO.read(new File("images/LittlePlane/plane2.png"));
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
//构造方法
public PlanelJPanel() {
addMouseMotionListener(this);
addMouseListener(this);
thread=new Thread(this);
}
//画布
public void paint(Graphics g) {
super.paint(g);
g.drawImage(startImg, x, y, null);
if(gz==true&&ck==false&&gameOver==false) {
Graphics2D g2=(Graphics2D)g;
g2.setFont(new Font("宋体", Font.BOLD, 50));
g2.setColor(Color.red);
g2.drawString("游戏暂停", 100, 200);
}
if(gameOver==true&&ck==false) {
Graphics2D g2=(Graphics2D)g;
g2.setFont(new Font("宋体", Font.BOLD, 50));
g2.setColor(Color.red);
g2.drawString("游戏结束!", 100, 200);
}
if(ck==false) {
pc=pc==0?1:0;
g.drawImage(p[pc], px, py, null);
Graphics2D g2=(Graphics2D)g;
g2.setFont(new Font("宋体", Font.BOLD, 20));
g2.setColor(Color.red);
g2.drawString("游戏得分"+score, 20,20 );
}
//画子弹的方法
for (int i = 0; i < bullets.size(); i++) {
Bullet bullet=bullets.get(i);
bullet.drawBullet(g);
//System.out.println(Djs.size());
}
//画敌人飞机的方法
for (int i = 0; i < Djs.size(); i++) {
Dpanel dpanel=Djs.get(i);
dpanel.drawDpanel(g);
// repaint();
}
}
//线程需要执行的方法
public void run() {
synchronized (this) {
while (true) {
cout++;
//AwardTime++;
awardy++;
if(gz) {
try {
wait();
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
if(gameOver) {
thread.stop();
}
//创建敌人飞机,添加到集合
int Djx=(int)(Math.random()*300+50);
Dpanel dpanel0=new Dpanel(Dpanel[0], Djx, 0);
int Djx1=(int)(Math.random()*300+50);
Dpanel dpanel1=new Dpanel(Dpanel[1], Djx1, 0);
for (int i = 0; i < Djs.size(); i++) {
Dpanel panel=Djs.get(i);
panel.DpanelMove();
}
if(cout%50==0) {
Djs.add(dpanel0);
}
if(cout%20==0) {
Djy+=50;
}
//创建子弹,并且添加到集合里
if(cout%20==0) {
zdx=px+p[pc].getWidth()/2-bImg.getWidth(null)/2;
zdy= py-p[pc].getHeight()/2+bImg.getHeight(null)/2;
Bullet bullet0=new Bullet(zdx,zdy, bImg, 0);
Bullet bullet1=new Bullet(zdx,zdy, bImg, 1);
Bullet bullet2=new Bullet(zdx, zdy, bImg, 2);
bullets.add(bullet0);
bullets.add(bullet1);
bullets.add(bullet2);
if(zdy<=0||zdx<=0||zdx>=400) {
bullets.remove(bullet0);
bullets.remove(bullet1);
bullets.remove(bullet2);
}
}
//飞机的移动
for (int i = 0; i <Djs.size(); i++) {
Dpanel dpanel=Djs.get(i);
}
//子弹的移动
for (int i = 0; i <bullets.size(); i++) {
Bullet bullet=bullets.get(i);
if(bullet.direction==0) {
bullet.moveBullet1();
}
if(bullet.direction==1) {
bullet.moveBullet2();
}
if(bullet.direction==2) {
bullet.moveBullet3();
}
}
//冒泡遍历子弹和敌人
for (int i = 0; i < bullets.size(); i++) {
Bullet b1=bullets.get(i);
for (int j = 0; j < Djs.size(); j++) {
Dpanel b2=Djs.get(j);
Crash crash=new Crash();
boolean f=crash.isCollsion(b1, b2);
if(f){
score+=5;
bullets.remove(i);
Djs.remove(j);
}
}
}
//敌人和我方飞机的碰撞
for (int j = 0; j < Djs.size(); j++) {
Dpanel b2=Djs.get(j);
Crash crash=new Crash();
boolean f1=crash.isCollsion1(px,py,60,80, b2);
if(f1){
gameOver=true;
}
}
y++;
if(y==0) {
y=-5400;
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
repaint();
}
}
//定义俩个方法,一个是暂停的方法,一个唤醒的方法。
}
public synchronized void regame() {
notify();
}
public void mouseDragged(MouseEvent e) {
}
public void mouseMoved(MouseEvent e) {
//当鼠标移动到开始游戏的区域 变动鼠标
if(gameOver==false){
if(ck &&e.getX()>=130&&e.getX()<261&&e.getY()>391&&e.getY()<=430) {
setCursor(new Cursor(Cursor.HAND_CURSOR));
}else if(ck==false){
setCursor(new Cursor(Cursor.HAND_CURSOR));
}else {
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
px=e.getX()-p[pc].getWidth()/2;
py=e.getY()-p[pc].getHeight()/2;
if(ck==false&&px<=0) {
px=0;
}
if(ck==false&&py<=0) {
py=0;
}
if(ck==false&&px+p[pc].getWidth()>=this.getWidth()) {
px=this.getWidth()-p[pc].getWidth();
}
if(ck==false&&py+p[pc].getHeight()>=this.getHeight()) {
py=this.getHeight()-p[pc].getHeight();
}
}
}
@Override
public void mouseClicked(MouseEvent e) {
//鼠标点击开始游戏要进入游戏
if(ck && e.getModifiers()==e.BUTTON1_MASK&&e.getX()>=130&&e.getX()<261&&e.getY()>391&&e.getY()<=430) {
ck=false;
try {
startImg=ImageIO.read(new File("images/background/background_2.png"));
} catch (IOException e1) {
// TODO 自动生成的 catch 块
e1.printStackTrace();
}
y=-5400;
// repaint();
thread.start();
}
}
@Override
public void mousePressed(MouseEvent e) {
// TODO 自动生成的方法存根
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO 自动生成的方法存根
}
@Override
public void mouseEntered(MouseEvent e) {
// 进来重新开始线程
regame();
gz=false;
}
@Override
public void mouseExited(MouseEvent e) {
// 出去窗口暂停线程
gz=true;
}
}
PlanelJFrame.java
package project02;
import java.awt.Image;
import javax.swing.JFrame;
public class PlanelJFrame extends JFrame{
public PlanelJFrame() {
//设置窗体标题
this.setTitle("吃饺子的喵");
//设置窗体的大小
this.setSize(400, 600);
//设置窗体居中
this.setLocationRelativeTo(null);
this.setResizable(false);
//this.setResizable(false);
//关联关闭按钮
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//把画布类进行封装成对象
PlanelJPanel jpanel=new PlanelJPanel();
this.add(jpanel);
//让窗体显示
this.setVisible(true);
}
public static void main(String[] args) {
PlanelJFrame frame=new PlanelJFrame();
}
}
Crash.java
package project02;
public class Crash {
public boolean isCollsion(Bullet bullet,Dpanel dpanel){ //敌机和子弹的碰撞
//敌人 50*50 子弹--10*46
int x1=bullet.bx;
int x2=dpanel.Dx;
int y1=bullet.by;
int y2=dpanel.Dy;
int w1=10;
int h1=46;
int w2=50;
int h2=50;
if(x1>=x2&&x1>=x2+w2){
return false;
}else if(x1<=x2&&x1+w1<=x2){
return false;
}else if(y1>=y2&&y1>=y2+h2){
return false;
}else if(y1<=y2&&y1+h1<=y2){
return false;
}
return true;
}
public boolean isCollsion1(int x1,int y1,int w1,int h1,Dpanel dpanel){ //敌机和我方飞机的碰撞
int x2=dpanel.Dx;
int y2=dpanel.Dy;
int w2=50;
int h2=50;
if(x1>=x2&&x1>=x2+w2){
return false;
}else if(x1<=x2&&x1+w1<=x2){
return false;
}else if(y1>=y2&&y1>=y2+h2){
return false;
}else if(y1<=y2&&y1+h1<=y2){
return false;
}
return true;
}
}
Dpanel.java
package project02;
import java.awt.Graphics;
import java.awt.Image;
public class Dpanel {
Image Dpanel;//敌人飞机图片
int Dx;//飞机X坐标
int Dy;//飞机Y坐标
boolean exist=true;//飞机是否存在
public Dpanel(Image dpanel, int dx, int dy) {
super();
this.Dpanel = dpanel;
this.Dx = dx;
this.Dy = dy;
}
public void drawDpanel(Graphics g) {
g.drawImage(Dpanel, Dx, Dy, null);
}
public void DpanelMove() {
Dy+=5;
if(Dy>=600) {
exist=false;
}
}
}
Bullet.java
package project02;
/*
* 子弹类中主要写子弹的属性和方法
*/
import java.awt.Graphics;
import java.awt.Image;
public class Bullet{
public int bx,by;//子弹坐标
Image bImg;//子弹图片
int direction;//子弹方向
boolean exist=true;
int bsend=10;//速度
public Bullet(int bx, int by, Image bImg, int direction) {
super();
this.bx = bx;
this.by = by;
this.bImg = bImg;
this.direction = direction;
}
//画子弹的方法
public void drawBullet(Graphics g) {
g.drawImage(bImg, bx, by, null);
}
public void moveBullet1() {
by-=bsend;
if(by<=0) {
exist=false;
}
}
public void moveBullet2() {
by-=bsend;
bx-=bsend/3;
if(by<=0) {
exist=false;
}
}
public void moveBullet3() {
by-=bsend;
bx+=bsend/3;
if(by<=0) {
exist=false;
}
}
}
运行效果:

由于有以下没有仔细的算 大概的就写了是图片像素之间的碰撞 效果略差:

Java飞机大战源代码的更多相关文章
- Java飞机大战MVC版
PlaneWar Java飞机大战MVC版 //无聊时偷的雷霆战机素材写了一个飞机大战,本意是练习mvc,但写得还是不清晰 github下载:https://github.com/dejavudwh/ ...
- java飞机大战之子弹的自动生成
import java.awt.Graphics; import java.util.ArrayList; import javax.swing.JFrame; import javax.swing. ...
- 飞机大战编写以及Java的面向对象总结
面向对象课程完结即可编写一个简单的飞机大战程序.我觉得我需要总结一下 飞机大战中类的设计: 父类:FlyingObject(抽象类) 接口:Award .Enemy 子类:Hero.Bullet.Ai ...
- java版飞机大战 实战项目详细步骤.md
[toc] 分析 飞机大战 首先对这个游戏分析,在屏幕上的物体都是飞行物,我们可以把建一个类,让其他飞行物继承这个类.游戏中应有英雄机(也就是自己控制的飞机).敌人.而敌人应该分为打死给分的飞机(就是 ...
- 用面向对象的编程方式实现飞机大战小游戏,java版
概述 本文将使用java语言以面向对象的编程方式一步一步实现飞机大战这个小游戏 本篇文章仅供参考,如有写的不好的地方或者各位读者哪里没看懂可以在评论区给我留言 或者邮件8274551712@qq.co ...
- java之线程飞机大战制作
import java.awt.Graphics; import java.util.ArrayList; import javax.swing.JFrame; import javax.swing. ...
- Java实现飞机大战游戏
飞机大战详细文档 文末有源代码,以及本游戏使用的所有素材,将plane2文件复制在src文件下可以直接运行. 实现效果: 结构设计 角色设计 飞行对象类 FlyObject 战机类 我的飞机 MyPl ...
- Cocos2d-x 3.0final 终结者系列教程16-《微信飞机大战》实现
看到cocos2d-x推出了3.1版本号,真是每月一次新版本号,速度. 另一个好消息就是http://cn.cocos2d-x.org/上线了,祝贺!啥时候把我的视频和教程放上去呢?!! . 视频下载 ...
- cocos2dx 3.0 飞机大战
因为课程须要.然后又水平有限.所以写了个飞机大战.加上不会画画.所以图片资源也是从微信apk解压出来的,设计思路參考的偶尔e网事. 闲话不说.先讲一下设计.大体上一共分为3个场景.场景以下是Layer ...
随机推荐
- 质量管理:PDCA循环
PDCA循环又叫质量环,是管理学中的一个通用模型,最早由休哈特于1930年构想,后来被美国质量管理专家戴明博士在1950年再度挖掘出来,并加以广泛宣传和运用于持续改善产品质量的过程.[1] 中文名 P ...
- Windows平台的PHP之开启COM配置
Windows平台的PHP如果未配置COM,调用COM组件,错误如下 Fatal error: Class 'COM' not found in XXXXXXXXX php 根目录的 ext 文件夹下 ...
- Srtuts2实现登录界面(不连接数据库)报错(四)
1.利用Struts2写一个登录界面,出现以下问题 三月 01, 2014 12:26:18 下午 org.apache.struts2.dispatcher.Dispatcher warn 警告: ...
- Flex中的FusionCharts 2D面积图
Flex中的FusionCharts 2D面积图 1.源码 <?xml version="1.0" encoding="utf-8"?> <s ...
- 从VGA到GPU!细数二十年显卡发展历程
VGA有很多层涵义,本来是用于代表一个分辨率(您可能不了解VGA,但应该知道QVGA代表什么),随后被普遍称为显示输出接口.为了输出VGA分辨 率.提供VGA输出接口,显卡和VGA就有了不解之缘,显卡 ...
- 使用 opencv 将图片压缩到指定文件尺寸
前言 图片压缩应用很广泛,如生成缩略图等.前期我在进行图片处理的过程中碰到了一个问题,就是如何将图片压缩到指定尺寸,此处尺寸指的是生成图片文件的大小. 我使用 opencv 进行图片处理,于是想着直接 ...
- webpack学习(一):webpack 介绍&安装&常用命令
一.简单介绍 什么是Webpack Webpack是一款用户打包前端模块的工具,它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源. 主要是用来打包在浏览器端使用的ja ...
- thinkphp在mac下报错
简要:众所周知,开发软件最好的环境是在MAC下;为此在黑苹果上,用Thinkphp开发;在过程中出现,找不到model以及数据库类型错误;为此向大家分享解决办法,希望能够帮助困惑的伙伴们,如果有不对或 ...
- WPF之DataContext(转)
WPF之DataContext(转) 有时候不是你不够聪明,而是别人教给你的东西太烂!相信自己! 这是我认为,目前网络上对“DataContext”解释最好的一篇文章,跟大家分享. 原文地址:http ...
- 解决PhpMyadmin1440秒未活动自动退出
解决方法如下:#vim phpMyAdmin/libraries/config.default.php找到如下位置$cfg['LoginCookieValidity'] = ; 将1440修改成 ...