Java小游戏之飞翔的小鸟

游戏玩法:通过鼠标点击使小鸟上下移动穿过柱子并完成得分,小鸟碰到柱子或掉落到地面上都会结束游戏。

(游戏内图片)

下面是实现这个游戏的代码:

 Brid类:

package bird;import org.omg.CORBA.IMP_LIMIT;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;public class Brid {int x,y;int width,height;int size;//鸟的大小,用于检测碰撞BufferedImage image;
BufferedImage[] images;
int index;double g;   //重力加速度double t;   //两次位置的时间间隔double v0;  //初始上抛的速度double speed; //当前上抛的速度double s;     //经过时间t以后的位移double alpha; //鸟的倾角,单位是弧度public  Brid() throws Exception {image = ImageIO.read(getClass().getResource("0.png"));width = image.getWidth();height = image.getHeight();x = 132;y = 280;size = 40;g = 4;v0 = 20;t = 0.25;speed = v0;s = 0;alpha = 0;images = new BufferedImage[8];for (int i = 0; i < 8; i++) {images[i] = ImageIO.read(getClass().getResource(i + ".png"));}
index=0;}
public void  fly(){index++;image=images[(index/12)%8];
}public  void  step(){
double v0=speed;
s=v0*t+g*t*t/2;  //计算上抛运动的位移;
y=y-(int)s;//计算鸟的位置坐标
double v =v0-g*t;//计算下次的速度
speed=v;
alpha=Math.atan(s/8);}
public  void flappy(){speed=v0;   //重新设置初始速度,重新向上飞
}public boolean hit( Ground ground){boolean hit=y+size/2>ground.y;if(hit){y= ground.y-size/2;alpha=-3.1415926/2;}return  hit;}public boolean hit(Column column) {if (x > column.x - column.width / 2 - size / 2 && x < column.x + column.width / 2 + size / 2) {if (y > column.y - column.gap / 2 + size / 2 && y < column.y + column.gap / 2 - size / 2) {return false;}return true;}return false;}
}

 BridGame类:

package bird;import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;public class BridGame extends JPanel {Brid brid;Column column1,column2;Ground ground;BufferedImage background;int score;//  boolean gameOver;//游戏状态int state;public  static  final  int START=0;public  static  final  int RUNNING=1;public  static  final  int GAME_OVER=2;BufferedImage gameOverImage;
BufferedImage startImage;public BridGame() throws Exception{//gameOver=false;state=START;gameOverImage =ImageIO.read(getClass().getResource("gameover.png"));startImage=ImageIO.read(getClass().getResource("start.png"));brid=new Brid();column1=new Column(1);column2=new Column(2);ground=new Ground();background= ImageIO.read(getClass().getResource("bg.png"));score=0;
}@Overridepublic void paint(Graphics g) {super.paint(g);g.drawImage(background,0,0,null);g.drawImage(column1.image,column1.x-column1.width/2,column1.y-column1.height/2,null);g.drawImage(column2.image,column2.x-column2.width/2,column2.y-column2.height/2,null);g.drawImage(ground.image,ground.x,ground.y,null);Graphics2D g2=(Graphics2D) g;g2.rotate(-brid.alpha,brid.x,brid.y);g.drawImage(brid.image,brid.x-brid.width/2,brid.y-brid.width/2,null);g2.rotate(brid.alpha,brid.x,brid.y);Font f=new Font(Font.SANS_SERIF,Font.BOLD,40);g.setFont(f);g.drawString(""+score,40,60);g.setColor(Color.white);g.drawString(""+score,40-3,60-3);switch (state){case GAME_OVER:g.drawImage(gameOverImage,0,0,null);break;case START:g.drawImage(startImage,0,0,null);break;}}public  void action() throws  Exception{  //让地面动起来MouseListener l=new MouseAdapter(){@Overridepublic void mousePressed(MouseEvent e) {  //鼠标按下// brid.flappy(); //鸟向上飞try {switch (state) {case GAME_OVER:column1 = new Column(1);column2 = new Column(2);brid = new Brid();score = 0;state = START;break;case START:state = RUNNING;case RUNNING:brid.flappy();}}catch (Exception e2){}}};addMouseListener(l);while(true){switch (state){case START:brid.fly();ground.step();break;case RUNNING:ground.step();column1.step();column2.step();brid.step();brid.fly();if(brid.x==column1.x||brid.x==column2.x){score++;}if(brid.hit(ground)||brid.hit(column1)||brid.hit(column2)){state=GAME_OVER;}break;}repaint();Thread.sleep(1000/30);}
}public static void main(String[] args) throws  Exception {JFrame frame=new JFrame();BridGame game=new BridGame();frame.add(game);frame.setSize(440,670);frame.setLocationRelativeTo(null);frame.setVisible(true);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);game.action();}
}

Column类

package bird;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.font.LineMetrics;
import java.awt.image.BufferedImage;
import java.util.Random;//柱子
public class Column {int x,y;int width,height;int gap;int distance;BufferedImage image;Random random=new Random();public  Column(int n) throws  Exception{image= ImageIO.read(getClass().getResource("column.png"));width=image.getWidth();height =image.getHeight();gap=144;distance=245;x=550+(n-1)*distance;y=random.nextInt(218)+132;}
public void step(){x--;if(x==-width/2){x=distance*2-width/2;y=random.nextInt(218)+132;}
}
}

Ground类:

package bird;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;public class Ground {int x,y;int width,height;BufferedImage image;public Ground() throws Exception{image= ImageIO.read(getClass().getResource("ground.png"));width=image.getWidth();height =image.getHeight();x=0;y=500;}//添加方法让地面移动public void step(){x--;if(x==-109){x=0;}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/201686.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

KyLin离线安装OceanBase

去OceanBase下载若干文件 1 首先安装ob-deploy-2.3.1-2.el7.x86_64.rpm rpm -ivh ob-deploy-2.3.1-2.el7.x86_64.rpm# 运行此命令的时候他会报错 RPM should not be used directly install RPM packages, use Alien instead! 这个需要用Alien去转换为deb的包&#xff0c;不…

使用PySpark 结合Apache SystemDS 进行信号处理分析 (离散傅立叶变换)的简单例子

文章大纲 简介 :什么是 SystemDS ?环境搭建与数据 准备数据预处理模型训练 与 结果评估参考文献简介 :什么是 SystemDS ? SystemDS is an open source ML system for the end-to-end data science lifecycle from data integration, cleaning, and feature engineering, ov…

skywalking中gateway的拓扑图没有出现

背景&#xff1a; 刚开始的时候gateway没有出现&#xff0c;后来百度说添加插件的jar包&#xff0c; apm-spring-cloud-gateway-2.1.x-plugin-8.15.0.jar apm-spring-webflux-5.x-plugin-8.15.0.jar 然后解决了gateway节点出来了&#xff0c; 但是&#xff1a;拓扑图却是User指…

prometheus热更新失败failed to reload config

一、问题描述 k8s部署的prometheus服务在请求热更新时报错: failed to reload config: one or more errors occurred while applying the new configuration (--config.file"/etc/prom/config/file/prometheus.yml")请求命令:curl -X POST http://monitor-cp-prom:…

【尚硅谷】第06章:随堂复习与企业真题(面向对象-基础)

第06章&#xff1a;随堂复习与企业真题&#xff08;面向对象-基础&#xff09; 一、随堂复习 1. &#xff08;了解&#xff09;面向过程 vs 面向对象 不管是面向过程、面向对象&#xff0c;都是程序设计的思路。面向过程&#xff1a;以函数为基本单位&#xff0c;适合解决简单…

CSM32RV003:国产高精度16位ADC低功耗RISC-V内核MCU

目录 高精度ADC工业应用工业数据采集应用CSM32RV003简介主要特性 高精度ADC工业应用 高精度ADC即高精度模数转换器&#xff0c;是一种能够将输入模拟信号转换为数字信号的芯片&#xff0c;在多种消费电子、工业、医疗和科研领域都有广泛应用。高精度ADC的主要特点是能够提供高…

基于单片机停车场环境监测系统仿真设计

**单片机设计介绍&#xff0c; 基于单片机停车场环境监测系统仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的停车场环境监测系统是一种利用单片机技术实现环境监测和数据处理的系统。它可以感知停车场的温湿…

依赖库:Ceres-solver-2.0.0安装

依赖库&#xff1a;Ceres-solver-2.0.0安装 前言安装ceres-solver-2.0.0验证 前言 Ceres Solver是谷歌开源的C非线性优化库&#xff0c;能够解决有约束或无约束条件下的非线性最小二乘问题。2010年之后大量的运用在谷歌的产品开发中&#xff0c;尤其在谷歌开源的cartographer中…

2023.11.20使用flask做一个简单图片浏览器

2023.11.20使用flask做一个简单图片浏览器 功能&#xff1a; &#xff08;1&#xff09;输入指定路径&#xff0c;打开文件夹 &#xff08;2&#xff09;判断文件格式为图片 &#xff08;3&#xff09;在前端进行预览 &#xff08;4&#xff09;使用bootstrap进行简单美化 ma…

Node.js入门指南(一)

目录 Node.js入门 什么是Node.js Node.js的作用 Node.js安装 Node.js编码注意事项 Buffer(缓冲器&#xff09; 定义 使用 fs模块 概念 文件写入 文件读取 文件移动与重命名 文件删除 文件夹操作 查看资源状态 路径问题 path模块 Node.js入门 什么是Node.js …

Gradle常用命令与参数依赖管理和版本决议

一、Gradle 常用命令与参数 本课程全程基于 Gradle8.0 环境 1、Gradle 命令 介绍 gradle 命令之前我们先来了解下 gradle 命令怎么在项目中执行。 1.1、gradlew gradlew 即 Gradle Wrapper&#xff0c;在学习小组的第一课时已经介绍过了这里就不多赘述。提一下执行命令&am…

Linux学习第44天:Linux 多点电容触摸屏实验(二):难忘记第一次牵你手的温存

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 本章的思维导图内容如下&#xff1a; 二、硬件原理图分析 三、实验程序编写 1、修改设备树 1&#xff09;、添加FT5426所使用的IO 一个复位 IO、一个中断 IO、…

合并区间问题

以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&#xff1a;intervals [[1,…

React函数组件渲染两次

渲染两次是因为react默认开启了严格模式 React.StrictMode标签作用&#xff1a; 1、识别不安全的生命周期 2、关于使用过时字符串 ref API 的警告 3、关于使用废弃的 findDOMNode 方法的警告 4、检测意外的副作用 5、检测过时的 context API 注释掉React.StrictMode即为关闭严…

Kotlin学习——hello kotlin 函数function 变量 类 + 泛型 + 继承

Kotlin 是一门现代但已成熟的编程语言&#xff0c;旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作&#xff0c;并提供了多种方式在多个平台间复用代码&#xff0c;以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…

01背包与完全背包学习总结

背包问题分类见下图 参考学习点击&#xff1a;代码随想录01背包讲解 01背包问题&#xff1a; 核心思路&#xff1a; 1、先遍历物品个数&#xff0c;再遍历背包容量。因为容量最先是最大的&#xff0c;往背包里放物品&#xff0c;所以背包容量在慢慢减少&#xff0c;但背包容量…

vue3+elementPlus登录向后端服务器发起数据请求Ajax

后端的url登录接口 先修改main.js文件 // 导入Ajax 前后端数据传输 import axios from "axios"; const app createApp(App) //vue3.0使用app.config.globalProperties.$http app.config.globalProperties.$http axios app.mount(#app); login.vue 页面显示部分…

UE5 操作WebSocket

插件&#xff1a;https://www.unrealengine.com/marketplace/zh-CN/product/websocket-client 参考&#xff1a;http://dascad.net/html/websocket/bp_index.html 1. 安装Plugings 2.测试websocket服务器 http://www.websocket-test.com/ 3.连接服务器 如果在Level BP里使用&a…

VMware 16 Pro 安装以及下载

1、下载地址&#xff1a; https://www.aliyundrive.com/s/nj3PSD4TN9G 2、安装文件 右击打开 下一步 密钥&#xff1a;ZF3R0-FHED2-M80TY-8QYGC-NPKYF 到此&#xff0c;安装完毕

YOLOv8 加持 MobileNetv3,目标检测新篇章

🗝️YOLOv8实战宝典--星级指南:从入门到精通,您不可错过的技巧   -- 聚焦于YOLO的 最新版本, 对颈部网络改进、添加局部注意力、增加检测头部,实测涨点 💡 深入浅出YOLOv8:我的专业笔记与技术总结   -- YOLOv8轻松上手, 适用技术小白,文章代码齐全,仅需 …