《飞机大战》这款小游戏相信许多朋友早就已经玩过,但是作为小白,学习过程中就是要拿各种经典项目来练手,飞机大战就是老师拿来让我们练手的一个小项目。老师给我们提供了素材包,让我们自由发挥,刚开始真的是没什么头绪,不过这几天的确学习到一些东西,随着慢慢尝试,终于背景动了起来,飞机动了起来,子弹动了起来,可以消灭敌机了,到这也算实现了最底层的功能,这里把代码和我理解的注释写下来,算是对学习过程的记录,也希望可以帮到其他朋友。

一、建立模板类,创建敌机和子弹的模板

敌机模板类Dj.java代码:

package model;import java.awt.Graphics;
import java.awt.Image;import javax.swing.ImageIcon;public class Dj {int x,y;String icon;public Dj(String icon) { //参数为敌机图片路径this.icon=icon;x=(int)(Math.random()*360)+10; //随机生成x坐标y=-30;}//画敌机public void drawPlane(Graphics g) {Image plane=new ImageIcon(icon).getImage();g.drawImage(plane, x-15, y-15, null);}//x,y的get和set方法public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}}

子弹模板类Zd.java代码:

package model;import java.awt.Graphics;
import java.awt.Image;import javax.swing.ImageIcon;public class Zd {int x, y;//构造方法public Zd(int a, int b) { //参数为英雄机坐标this.x=a;this.y=b;}//画子弹public void drawZd(Graphics g) {Image zd=new ImageIcon("src/images/bullet_7.png").getImage();g.drawImage(zd, x-19, y-80, null);}//x,y的get和set方法public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}}

二、创建碰撞判断类Crash

碰撞判断类Crash.java代码:

package model;public class Crash {// 判断子弹和敌机碰撞public boolean Boom(Zd z, Dj d) {int zx, zy, dx, dy;boolean crash = false;//子弹坐标zx = z.getX();zy = z.getY();//敌机坐标dx = d.getX();dy = d.getY();if (dx < zx && zy - dy < 30 && dx + 30 > zx) {crash = true; //如果相撞返回真值}return crash;}//飞机相撞public boolean Boom2(Dj d, int x, int y) {int dx, dy;boolean crash = false;//敌机坐标dx = d.getX();dy = d.getY();//英雄机坐标x = x - 50;y = y - 80;//相撞条件if (dx > x+20 && y - dy < 20 && dx < x + 60) {crash = true; //如果相撞返回真值}return crash;}}

三、创建画布类GamePanel

在画布类中创建敌机和子弹模板对象,并在画布上画出来,在新线程循环中改变坐标重画使其移动,获取鼠标坐标画出英雄机,循环遍历子弹和敌机集合,调用Crash类中的方法判断是否相撞
画布类GamePanel.java代码:

package panel;import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.List;import javax.swing.ImageIcon;
import javax.swing.JPanel;import model.Crash;
import model.Dj;
import model.Zd;public class GamePanel extends JPanel implements MouseMotionListener, MouseListener {/*** */private static final long serialVersionUID = 1682690307762671162L;int bx, by, x, y, dx, dy, score = 0,count=0,state; //背景坐标bx,by,英雄机坐标x,y,敌机坐标dx,dy,分数score,计数器count,运行状态stateImage bg; //背景图boolean db = false; //敌机爆炸图片绘图开关List<Zd> zd = new ArrayList<Zd>(); //存储子弹对象List<Dj> dj = new ArrayList<Dj>(); //存储敌机对象//运行状态常量public static final int START=1;public static final int RUNNING=2;public static final int PAUSE=3;public static final int OVER=4;//构造方法public GamePanel() {state=START;bx = 0;by = -5350;bg = new ImageIcon("src/images/background_1.png").getImage();}//重写paint方法@Overridepublic void paint(Graphics g) {super.paint(g);if(state==RUNNING){String sc = "分数:" + String.valueOf(score);g.drawImage(bg, bx, by, null); //画出背景g.drawRoundRect(0, 0, 120, 30, 5, 5); //分数框g.setFont(new Font("TimesRoman", Font.BOLD, 24));g.setColor(Color.RED);g.drawString(sc, 2, 20); //画出分数Image hero = new ImageIcon("src/images/plane_2.png").getImage(); g.drawImage(hero, x - 50, y - 80, null);  //画出英雄机if (db) { //在敌机爆炸时画出爆炸图片Image boom = new ImageIcon("src/images/boom1.png").getImage();g.drawImage(boom, dx, dy, null);db = false;}for (int i = 0; i < zd.size(); i++) {zd.get(i).drawZd(g);  //画出所有子弹}for (int j = 0; j < dj.size(); j++) {dj.get(j).drawPlane(g); //画出所有敌机}}else if(state==START){ //开始界面Image start=new ImageIcon("src/images/start.png").getImage();g.drawImage(start, 0, 0, 400, 650, null);}else if(state==OVER){ //结束界面Image over=new ImageIcon("src/images/over.png").getImage();g.drawImage(over, 0, 0, 400, 650, null);}else if(state==PAUSE){ //暂停界面Image pause=new ImageIcon("src/images/pause.png").getImage();g.drawImage(pause, 0, 0, 400, 650, null);}}// 移动类public void Move() {new Thread() {@Overridepublic void run() {super.run();while (true) {if(state==RUNNING){// 背景移动count++;by += 2;if (by > 0) {by = -5350;bg = new ImageIcon("src/images/background_2.png").getImage();}// 创建子弹if (count % 3 == 0) {zd.add(new Zd(x, y));} for (int a = 0; a < zd.size(); a++) {zd.get(a).setY(zd.get(a).getY() - 30); //改变子弹坐标,使子弹移动if (zd.get(a).getY() < 0) { //判断子弹越界zd.remove(a);}}// 创建敌机if (count % 21 == 0) {dj.add(new Dj("src/images/e4.png"));}else if (count % 31 == 0) {dj.add(new Dj("src/images/e5.png"));}else if (count % 41 == 0) {dj.add(new Dj("src/images/e6.png"));}for (int b = 0; b < dj.size(); b++) {dj.get(b).setY(dj.get(b).getY() + 3); //改变敌机坐标,使敌机移动if (dj.get(b).getY() > 650) { //判断敌机越界state=OVER; //游戏结束}}// 子弹和敌机碰撞Crash crash = new Crash();for (int j = 0; j < zd.size(); j++) {Zd z = zd.get(j);for (int i = 0; i < dj.size(); i++) {Dj d = dj.get(i);if (crash.Boom(z, d)) { //调用Crash对象的Boom方法判断是否相撞score += 2; //分数加2dx = dj.get(i).getX(); //敌机坐标dy = dj.get(i).getY();db = true; //敌机爆炸dj.remove(i); //从集合中删除敌机zd.remove(j); //从集合中删除子弹break;}}}//判断飞机相撞for (int i = 0; i < dj.size(); i++) {Dj d = dj.get(i);if (crash.Boom2(d, x, y)) {dx = dj.get(i).getX();dy = dj.get(i).getY();db = true;state=OVER; //游戏结束}}}repaint(); //重画try {Thread.sleep(20); //线程休眠} catch (InterruptedException e) {e.printStackTrace();}}}}.start();}//鼠标点击事件@Overridepublic void mouseClicked(MouseEvent e) {if(state==START||state==PAUSE){state=RUNNING;}else if (state==RUNNING){state=PAUSE;;}else if(state==OVER){//重新开始后初始化参数值state=RUNNING;score=0;count=0;bx = 0;bg = new ImageIcon("src/images/background_1.png").getImage();by = -5350;zd = new ArrayList<Zd>();dj = new ArrayList<Dj>();}}@Overridepublic void mousePressed(MouseEvent e) {// TODO 自动生成的方法存根}@Overridepublic void mouseReleased(MouseEvent e) {// TODO 自动生成的方法存根}@Overridepublic void mouseEntered(MouseEvent e) {// TODO 自动生成的方法存根}@Overridepublic void mouseExited(MouseEvent e) {// TODO 自动生成的方法存根}@Overridepublic void mouseDragged(MouseEvent e) {// TODO 自动生成的方法存根}@Overridepublic void mouseMoved(MouseEvent e) {x = e.getX(); //动态获取鼠标的坐标值y = e.getY();}}

四、 创建游戏主线程和游戏窗口

窗口类Game.java代码:

package frame;import javax.swing.JFrame;import panel.GamePanel;public class Game {public static void main(String[] args) {JFrame j = new JFrame(); //创建窗口GamePanel g = new GamePanel(); //创建画布j.add(g); //添加画布j.setSize(400, 650);j.setTitle("PlaneWar"); //设置标题j.setLocationRelativeTo(null); //设置居中j.setDefaultCloseOperation(3); //默认关闭j.setVisible(true); //窗口可见性g.Move(); //调用Move方法j.addMouseListener(g); //添加监听器j.addMouseMotionListener(g);}}

到这里,一个太监版的飞机大战小游戏就完成了。你有你的王者荣耀,我有我的飞机大战,不是很炫,但是很六。

Java经典飞机大战游戏相关推荐

  1. 基于Java的飞机大战游戏的设计与实现论文

    源码下载 http://www.byamd.xyz/hui-zong-1/ 摘 要 现如今,随着智能手机的兴起与普及,加上4G(the 4th Generation mobile communicat ...

  2. 基于Java的飞机大战游戏的设计与实现(含源文件)

    欢迎添加微信互相交流学习哦! 项目源码:https://gitee.com/oklongmm/biye 基于Java的飞机大战游戏的设计与实现 摘   要 现如今,随着智能手机的兴起与普及,加上4G( ...

  3. 基于Java的飞机大战游戏的设计与实现(论文+源码)

    毕业设计(论文)任务书 第1页 毕业设计(论文)题目:基于Java的飞机大战游戏的设计与实现毕业设计(论文)要求及原始数据(资料):1.综述基于Java的飞机大战游戏的现状:2.深入了解Java的设计 ...

  4. 毕业设计 基于Java的飞机大战游戏的设计与实现

    文章目录 前言 一.项目设计 1. 模块设计 功能需求 游戏状态控制功能模块 游戏难度的调整模块 游戏界面绘画功能模块 玩家游戏控制功能模块 2. 实现效果 二.部分源码 项目源码 前言 今天学长向大 ...

  5. 基于Java的飞机大战游戏的设计与实现

    项目介绍 飞机大战主要需要我方飞机和敌方飞机,还有子弹,特殊nPC,开始背景,结束背景,以及背景音乐.我方飞机可以随意移动,敌方飞机无规律出现.游戏玩家通过鼠标移动控制飞机移动,我方飞机在游戏开始时就 ...

  6. 基于Java Swing 飞机大战游戏

    一.项目概要: 基于Java Swing飞机大战游戏,打死飞机,可以随机出现加血包.子弹升级包.并支持根据游戏的分数,调整游戏难度. 二.界面展示: 三.主要代码: package com.maoxu ...

  7. 学不动了,尝试用Android Jetpack Compose重写微信经典飞机大战游戏

    前段时间看了TechMerger大佬写的<一气呵成:用Compose完美复刻Flappy Bird!>,甚是有趣,按耐不住那躁动的心,笔者决定跟随大佬的脚步通过写游戏的方式学习Jetpac ...

  8. 用Java编写飞机大战游戏

    飞机大战(Plane War)是一款非常受欢迎的小游戏,它通过增加玩家的难度和挑战性,促使玩家不断提高自己的操作能力和反应速度,并在升级过程中逐步拓展游戏世界的规模和内容.本文将介绍如何使用Java编 ...

  9. Java Swing 飞机大战游戏

    呀~好久没有更新文章啦~~这次我们用Java的Swing图形界面框架写一个飞机大战小游戏 飞机大战游戏分为几个部分: com.mr // 主目录 main Constants // 常量 Start ...

最新文章

  1. elasticsearch 集群no known master node
  2. SPHINX 文档写作工具安装简要指南 - windows 版 - 基于python
  3. java与c++中的对象序列化分析
  4. 一篇文章学会mysql_一篇文章帮你搞定所有MySQL命令!
  5. command对象的三个主要的方法 1119
  6. 这样的家居选购界面让你忍不住剁手的冲动!
  7. freertos 编译c++失败_FreeRTOS的初次见面
  8. boot入门思想 spring_微服务架构之SpringBoot详解,夯实底层知识,带你轻松入门开发...
  9. Linu下建立svn版本库
  10. win10 IDEA企业版下载及破解
  11. 微信公众号文章编辑排版工具+自动采集+使用视频教程
  12. 小米路由器3开启千兆_使用评测 篇三:家庭网络进入千兆时代—小米路由器4开箱及评测...
  13. 由三个点坐标判断三个点能否组成三角形模板(自用,客官可取)
  14. 电热玻璃水壶CE认证检测标准介绍
  15. 软件工程辅助设计多周期处理器
  16. 速卖帮AI点餐流程 AI菜品识别结账
  17. 七二法则-“莫道君行早,更有早行人”
  18. 易之 - 我是个算命先生(2014年3月23日)
  19. Ajax,FormData
  20. 使用Batik开发SVG应用程序(一)

热门文章

  1. 2020Android手机专业摄影,2020年,哪款手机的拍摄性能最强?
  2. 企业如何正确激励核心人才,以达到人员稳定的目的?
  3. 惠普暗影精灵 8 台式机 评测
  4. 手机会有计算机病毒吗,手机会不会中计算机病毒呢
  5. 刺激战场服务器位置,绝地求生刺激战场Y城位置分布详解_可可网
  6. 透明状态栏(适配vivo,oppo)
  7. 汇编语言与微机原理-变量的调试与分析
  8. 优思学院|從《狂飙》高启强爱看的《孙子兵法》到六西格玛项目管理
  9. 浪潮信息更新存储系统功能 在线并发升级算法有效提升升级效率
  10. 分享低成本制作飞行器的方法,大一团队用一个月时间低成本打造一台飞行器