飞机游戏代码(JAVA)

article/2025/10/12 13:50:27

MyGameFrame类:

主要的调用类

package sc.wh.game;import javax.swing.JFrame;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import sc.wh.game.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Date;public class MyGameFrame extends Frame {// 调用工具类的getImage方法加载图片对象Image planeImg = GameUtil.getImage("images/plane.png");Image bg = GameUtil.getImage("images/bg.jpg");// 创建飞机,设置初始位置Plane plane = new Plane(planeImg,250,250);// 创建炮弹组Shell shells[] = new Shell[50];// 设置爆炸效果类的对象的引用Explode bao;// 游戏开始时间Date startTime = new Date();// 游戏结束时间Date endTime;// 游戏进行的时间int period;// 记录爆炸效果显示的图片int BaoCount = 0;// 在窗口画图方法,由repaint方法自动调用@Overridepublic void paint(Graphics g) { // 会自动被调用,g相当于一支画笔Color c = g.getColor();// 画背景g.drawImage(bg,0,0,null);// 调用飞机类的画图方法并画飞机plane.drawSelf(g);// 画炮弹组中的炮弹for (int i=0;i<shells.length;i++) {// 调用炮弹对象的draw方法shells[i].draw(g);// 获取炮弹所在矩形位置并调用intersects判断两矩形是否相交boolean peng =  shells[i].getRect().intersects(plane.getRect());if(peng) {// 如果相交则设置飞机存活状态为falseplane.live = false;// 如果bao对象没有初始化过则才初始化if(bao == null) {bao = new Explode(plane.x, plane.y);endTime = new Date();period = (int)(endTime.getTime() - startTime.getTime())/1000;}if(BaoCount <= 15) {// 调用爆炸效果显示类的画图方法,每次调用只画一张图bao.draw(g);BaoCount++;}}// 如果飞机未存活则显示游戏时间if(!plane.live) {// 创建字体对象Font f = new Font("宋体",Font.BOLD,50);// 设置字体g.setFont(f);// 设置字体颜色g.setColor(Color.RED);// 显示游戏结束时间g.drawString("游戏时间:" + period + "秒", 100, 250);}}g.setColor(c);}// 继承Thread线程类class PaintThread extends Thread{// 线程开始后会自动调用run方法@Overridepublic void run() {while (true) {// 调用repaint窗口画图方法,此方法会自动调用paint方法repaint(); try {// 控制一秒25次在窗口画图的方法Thread.sleep(40);} catch (InterruptedException e) {e.printStackTrace();}}}}// 创建键盘检测内部类,并继承键盘监听类class KeyMonitor extends KeyAdapter{// 检测键盘按下事件,调用飞机类对应的方法@Overridepublic void keyPressed(KeyEvent e) {// KeyEvent键盘检测类plane.addDirection(e);}// 检测键盘释放事件,调用飞机类对应的方法@Overridepublic void keyReleased(KeyEvent e) {plane.minusDirection(e);}}// 双缓冲解决闪烁private Image offScreenImage = null;public void update(Graphics g) {if(offScreenImage == null)offScreenImage = this.createImage(Constants.WIDTH,Constants.HEIGHT);//这是游戏窗口的宽度和高度Graphics gOff = offScreenImage.getGraphics();paint(gOff);g.drawImage(offScreenImage, 0, 0, null);}   public void launchFrame(){// 标题this.setTitle("game fly");// 窗口默认不可见this.setVisible(true);// 窗口大小this.setSize(Constants.WIDTH,Constants.HEIGHT);// 窗口距离左上角的坐标位置this.setLocation(300,300);//增加关闭窗口监听,这样用户点击右上角关闭图标,可以关闭游戏程序this.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e){System.exit(0);}});// 创建在窗口中画图线程并调用new PaintThread().start();// 将KeyMonitor类的对象加入键盘监控检测,对应的事件会自动调用此类对应的方法addKeyListener(new KeyMonitor());// 创建炮弹,加入炮弹数组for(int i=0;i<shells.length;i++) {shells[i] = new Shell();}}public static void main(String[] args) {MyGameFrame f = new MyGameFrame();// 调用画窗口方法f.launchFrame();}
}

工具类(用来获取图片对象):

package sc.wh.game;import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;public class GameUtil {// 工具类最好将构造器私有化。private GameUtil() {} public static Image getImage(String path) {BufferedImage bi = null;try {URL u = GameUtil.class.getClassLoader().getResource(path);bi = ImageIO.read(u);} catch (IOException e) {e.printStackTrace();}return bi;}
}

用来存储常量的类:

package sc.wh.game;public class Constants {public static int WIDTH = 500;public static int HEIGHT = 500;
}

所有游戏对象的父类:

package sc.wh.game;import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;// 游戏父类
public class GameObject {Image img;  // 创建img对象double x,y; // 坐标int speed; // 速度int width,height; // 宽高// 画图方法public void drawSelf(Graphics g) {g.drawImage(img,(int)x,(int)y, null);}// 构造方法public GameObject(Image img, double x, double y, int speed, int width, int height) {super();this.img = img;this.x = x;this.y = y;this.speed = speed;this.width = width;this.height = height;}public GameObject(Image img, double x, double y) {super();this.img = img;this.x = x;this.y = y;}public GameObject() {}// 根据物体所在位置和宽度高度,返回物体所在的矩形,便与后续的碰撞检测public Rectangle getRect() {return new Rectangle((int)x,(int)y,width,height);}}

飞机类:

package sc.wh.game;import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;// 飞机类,继承自游戏类,拥有游戏类对应的方法和属性
public class Plane extends GameObject{// 当有键盘事件时,判断飞机移动的方向boolean left,right,up,down;// 飞机移动的速度int speed =;// 用于判断飞机是否存活boolean live = true;// 画飞机的方法,可根据键盘事件设置(left,right...)布尔值实时调整飞机位置public void drawSelf(Graphics g) {// 如果飞机存活,才调用画图方法if(live) {if(right) {x += speed;}if(left) {x -= speed;}if (up) {y -= speed;}if(down) {y += speed;}if (x<=0) {x = 0;}else if(x >= 460) {x = 460;}if(y <= 40) {y = 40;}else if(y >= 470) {y = 470;}// 根据位置画图g.drawImage(img,(int)x,(int)y, null);}}// 构造方法public Plane(Image img,double x, double y) {this.img = img;this.x = x;this.y = y;// 根据img对象的get..方法获取图片大小,用于矩形实现碰撞检测this.width = img.getWidth(null);this.height = img.getHeight(null);}// 键盘按下时,会调用此方法来设置移动的方向public void addDirection(KeyEvent e) {// getKeyCode可以获取按下键盘对应特定的值switch (e.getKeyCode()) {case KeyEvent.VK_LEFT:left = true;break;case KeyEvent.VK_RIGHT:right = true;break;case KeyEvent.VK_UP:up = true;break;case KeyEvent.VK_DOWN:down = true;break;}	}// 键盘松开时,会调用此方法来设置取消移动的方向public void minusDirection(KeyEvent e) {// getKeyCode可以获取按下键盘对应特定的值switch (e.getKeyCode()) {case KeyEvent.VK_LEFT:left = false;break;case KeyEvent.VK_RIGHT:right = false;break;case KeyEvent.VK_UP:up = false;break;case KeyEvent.VK_DOWN:down = false;break;}	}
}

炮弹类:

package sc.wh.game;import java.awt.Color;
import java.awt.Graphics;// 炮弹类
public class Shell extends GameObject{double degree; // 炮弹移动角度// 构造方法public Shell() {x = 200; // 设置炮弹的初始位置y = 200;width = 10; // 设置炮弹的大小height = 10;speed = 3; // 设置炮弹的速度degree = Math.random() * Math.PI * 2; // 随机设置炮弹的初始角度}// 画炮弹的方法public void draw(Graphics g) {Color c = g.getColor();g.setColor(Color.YELLOW); // 设置颜色if(x <= 0|| x >= Constants.WIDTH-width-10) {degree = Math.PI - degree; // 当碰撞水平地图边界后,反转角度}if(y<=40 || y >= Constants.HEIGHT-height) {degree = -degree; // 当碰撞垂直地图后,反转角度}// 填充一个圆作为炮弹g.fillOval((int)x, (int)y, width, height);// 根据角度设置炮弹移动的位置x += speed*Math.cos(degree);y += speed*Math.sin(degree);g.setColor(c);}}

显示爆炸效果的类:

package sc.wh.game;import java.awt.Graphics;
import java.awt.Image;public class Explode {// 记录爆炸位置double x,y;// 创建爆炸数组,static保证图片只加载一次static Image[] imgs = new Image[16];// 静态初始化块,初始化类的时候会自动调用static {for(int i=0;i<16;i++){// 挨个将爆炸图片对象获取到,并加入数组imgs[i] = GameUtil.getImage("images/explode/e"+(i+1)+".gif");imgs[i].getWidth(null);}}// 用来记录当前加载的图片int count;// 画爆炸效果public void draw(Graphics g){if(count<=15){// 轮播逐个画爆炸的图片g.drawImage(imgs[count], (int)x, (int)y, null);count++;}}// 构造方法设置爆炸位置public Explode(double x,double y){this.x = x;this.y = y;}
}

游戏效果图

在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/h7rMBsbD.shtml

相关文章

基于java的拼图经典游戏(附代码)

拼图游戏是一款经典的益智游戏&#xff0c;游戏开始前图片被随机打乱&#xff0c;空块位于最右下角&#xff0c;玩家通过点击空块周围图片或者按键方式对图片和空块进行相互交换&#xff0c;直到所有图片都回到原位即为游戏胜利。 本次制作的拼图游戏运行界面如下&#xff1a;…

java推箱子游戏源代码_java实现推箱子小游戏(附源码)

先上效果图 可以通过AWSD进行移动和推箱子 自己弄出来的代码玩起来还是很有意思的。 代码一共是三个.java文件,代码内容如下所示 package ss; import java.awt.Graphics; import java.awt.Image; import java.awt.Point; import java.awt.event.KeyEvent; import java.awt.eve…

免费Java游戏源代码素材推荐

家人们&#xff0c;最近我找到了一个很好用的Java游戏源代码免费素材网站 资源贼多&#xff0c;重点是免费&#xff01;&#xff01;&#xff01;白嫖一时爽&#xff0c;一直白嫖一直爽&#xff0c;嘿嘿嘿&#xff01;&#xff01;&#xff01;感兴趣的可以进去看看 接下来就…

java连连看代码_java实现连连看游戏

本文实例为大家分享了java实现连连看游戏的具体代码,供大家参考,具体内容如下 代码会实现共享的,这个是截图 代码: package com.lr.bean; import java.util.Scanner; import java.util.Random; import com.lr.bean.Point; public class Link{public static void main(Strin…

JAVA版扫雷游戏,清晰易懂,注释多

这是一篇关于JAVA的扫雷游戏&#xff0c;所有的图片均用文字代替&#xff0c;代码可直接运行。 文章目录 开发环境一、下载方法二、运行效果展示三、代码部分1.代码如下 总结 开发环境 开发工具&#xff1a;eclipse2021-12 JDK版本&#xff1a;JDK15.0.1 一、下载方法 链接&a…

猜数字游戏(Java源代码)

游戏后台随机生成1-20之间的5个数&#xff0c;未猜中提示“未命中”&#xff0c;继续猜测&#xff0c;猜中提示“运气不错&#xff0c;猜中了”&#xff0c;并输出数据出现的第一次位置源代码&#xff1a; import java.util.Random; import java.util.Scanner;//游戏后台随机…

JAVA实现扫雷游戏

后记&#xff1a;经评论区提醒&#xff0c;发现有两个bug没考虑到&#xff0c;感谢大家的提醒 bug1&#xff1a;绘制雷的时候有可能把两个雷随机到同样的位置。解决方法是在绘制雷的for循环内&#xff0c;rRow和rCol生成后做一个检测即可&#xff1a; /* 绘制地雷 */private v…

Java抽奖小游戏(包含代码)

情景&#xff1a; 假如从50个数字中确定10个中奖号码。 中奖号码要从50个数字中随机产生&#xff0c;中奖号码不可以重复&#xff0c;并对中奖号码进行排序。 解题思路&#xff1a; 首先建立一个长度为n号码的号码库&#xff1a;建立一个数组存放k个中奖号码抽取k个中奖号码。…

贪吃蛇java游戏代码_java实现贪吃蛇游戏代码(附完整源码)

先给大家分享源码&#xff0c;喜欢的朋友点此处下载。 游戏界面 GUI界面 java实现贪吃蛇游戏需要创建一个桌面窗口出来&#xff0c;此时就需要使用java中的swing控件 创建一个新窗口 JFrame frame new JFrame("贪吃蛇游戏"); //设置大小 frame.setBounds(10, 10, 90…

JAVA 实现生命游戏

生命游戏的规则: 生命游戏中&#xff0c;对于任意细胞&#xff1a;每个细胞有两种状态&#xff1a;存活或死亡。每个细胞与以自身为中心的周围八格细胞产生互动。    1.当前细胞为存活状态时&#xff0c;当周围的活细胞低于2个时&#xff0c; 该细胞因孤独而死亡;    2.当…

Java五子棋全代码

用Java编写简单的五子棋 前言 这两天在空闲时间做了个五子棋项目&#xff0c;分享给大家看一下&#xff0c;界面是这样的&#xff1a;        呜呜呜&#xff0c;界面很丑我知道&#xff0c;本人虽有几年PS基础&#xff0c;但知识浅薄&#xff0c;审美观不尽人意&#xff…

五子棋小游戏 java版(代码+详细注释)

游戏展示 这周闲来无事&#xff0c;再来写个五子棋小游戏。基本功能都实现了&#xff0c;包括人人对战、人机对战。界面布局和功能都写的还行&#xff0c;没做到很优秀&#xff0c;但也不算差。如有需要&#xff0c;做个java初学者的课程设计或者自己写着玩玩也都是不错的&…

【Java实现小游戏】飞翔的小鸟(源码)

游戏玩法&#xff1a;通过鼠标点击使小鸟上下移动穿过柱子并完成得分&#xff0c;小鸟碰到柱子或掉落到地面上都会结束游戏。 &#xff08;游戏内图片&#xff09; 下面是实现这个游戏的代码&#xff1a; Brid类&#xff1a; package bird;import org.omg.CORBA.IMP_LIMIT;im…

用简单Java代码尝试在控制台写游戏(附源码)

尝试写了一个在Java控制台运行的代码游戏&#xff0c;由于写这个的时候&#xff0c;博主还没学到可视化界面&#xff0c;也没有学到面向对象&#xff0c;甚至没有集合&#xff0c;运用的全是之前C语言的语法&#xff0c;因此应该很容易看懂吧。末尾附上源码。 以下是效果展示 …

Java小游戏练习---超级玛丽代码实现

B站教学视频&#xff1a; 01_超级玛丽_创建窗口_哔哩哔哩_bilibili 素材提取&#xff1a; 【超级会员V2】我通过百度网盘分享的文件&#xff1a;Java游戏项目… 链接:百度网盘 请输入提取码 提取码:k6j1 复制这段内容打开「百度网盘APP 即可获取」 百度网盘 请输入提取码 百度…

java 300行代码 冒险闯关小游戏(代码+讲解)

作为一个男孩子&#xff0c;从小就喜欢晚一些游戏。今天就用java写一个类似马里奥的冒险闯关小游戏&#xff0c;但这也不是一两天能完成的事情&#xff0c;我将会持续更新这个游戏&#xff08;有什么好的介意也非常欢迎大家提出来&#xff0c;也能在我的基础上自己接着写&#…

宝塔php防盗链,[宝塔面板]如何开启防盗链?

为了节省建站成本&#xff0c;大多数站长都会选择一些小服务器&#xff0c;在另加CDN、云存储之类的来减轻服务器的压力&#xff0c;但是这类功能大多收费。 如果自己网站的图片都让别人复制图片链接地址&#xff0c;那么自己CDN流量就跑得贼快&#xff0c;花了钱得不到好处。 …

HTTP防盗链(Referer)

HTTP请求防盗链&#xff1a;只允许某些域名请求来源才可以访问。比如A网站有一张图片或音频等资源被B网站直接通过img等标签属性引入使用&#xff0c;这样就是B网站盗用了A网站的资源。那么对于A网站来说&#xff0c;流量怎么被消耗的都不知道。 解决思路&#xff1a; 判断http…

Nginx防盗链的配置

Nginx防盗链的配置 通常站点&#xff0c;都会想让自己网站的视频和图片&#xff0c;免被盗用&#xff0c;毕竟视频流量&#xff0c;花的都是白花花银子   首先我们没有配置防盗链的情况下&#xff0c;放开静态资源你的访问。我们来看看效果 location ~* .*\.(gif|jpg|ico|pn…

python爬虫的防盗链

文章目录 前言一、防盗链是什么&#xff1f;二、 防盗链如何实现三、分析四、 对有防盗链的网站进行爬取对有视频连接的网站发出请求并且获取源码信息提取出我们的视频网站对我们提取的网址进行修改&#xff0c;和拼凑下载视频结束爬取 完整代码 前言 随着python的发展网页的反…