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.mzph.cn/news/161203.shtml

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

相关文章

前置声明避免循环依赖

当你有两个类互相引用的情况时&#xff0c;使用前置声明可以帮助你避免循环依赖。以下是一个简单的例子&#xff0c;其中包含两个头文件、两个源文件以及一个 main 函数的示例 Toolnterface.h #pragma once#include <QString>// Forward declaration of QToolBase clas…

Eclipse常用设置-乱码

在用Eclipse进行Java代码开发时&#xff0c;经常会遇到一些问题&#xff0c;记录下来&#xff0c;方便查看。 一、properties文件乱码 常用的配置文件properties里中文的乱码&#xff0c;不利于识别。 处理流程&#xff1a;Window -> Preferences -> General -> Ja…

golang学习笔记——罗马数字转换器

文章目录 罗马数字转换器代码 参考LeetCode 罗马数字转整数代码 罗马数字转换器 编写一个程序来转换罗马数字&#xff08;例如将 MCLX 转换成 1,160&#xff09;。 使用映射加载要用于将字符串字符转换为数字的基本罗马数字。 例如&#xff0c;M 将是映射中的键&#xff0c;其值…

Qt+sqlite3使用事务提升插入效率

参考&#xff1a; 【精选】SQLite批量插入效率_sqlite 批量插入_PengX_Seek的博客-CSDN博客 (1)不使用事务时&#xff1a; clock_t t_start clock();QSqlQuery query(db);QString sql("insert into test(col1,col2) values(1,2);");for (int i 0; i < 1000; i…

c++学习之哈希

目录 1.关于unordered系列关联式容器 2.关于unordered_map 3.哈希&#xff08;散列&#xff09;表的实现 一&#xff0c;直接定址法 二&#xff0c;除留余数法 方法一&#xff1a;闭散列&#xff1a;开放定址法 方法二&#xff1a;闭散列&#xff1a;哈希桶/拉链法 4.哈希…

机器学习/sklearn 笔记:K-means,kmeans++

1 K-means介绍 1.0 方法介绍 KMeans算法通过尝试将样本分成n个方差相等的组来聚类&#xff0c;该算法要求指定群集的数量。它适用于大量样本&#xff0c;并已在许多不同领域的广泛应用领域中使用。KMeans算法将一组样本分成不相交的簇&#xff0c;每个簇由簇中样本的平均值描…

hadoop shell操作 hdfs处理文件命令 hdfs上传命令 hadoop fs -put命令hadoop fs相关命令 hadoop(十三)

hadoop fs -help rm 查看rm命令作用 hadoop fs 查看命令 1. 创建文件夹&#xff1a; # hdfs前缀也是可以的。更推荐hadoop hadoop fs -mkdir /sanguo 2.上传至hdfs命令&#xff1a; 作用&#xff1a; 从本地上传hdfs系统 &#xff08;本地文件被剪切走&#xff0c;不存在了&…

论防火墙的体系结构

防火墙的体系结构 防火墙的体系结构 双重宿主主机体系结构。屏蔽主机体系结构。屏蔽子网体系结构。 双重宿主主机体系结构 双重宿主主机体系结构是指以一台具有双重宿主的主机计算机作为防火墙系统的主体&#xff0c;执行分离外部网络与内部网络的任务。该计算机至少有两个…

【NGINX--4】大规模可扩展的内容缓存

1、缓存区 缓存内容并定义缓存的存储位置。 使用 proxy_cache_path 指令定义共享内存缓存区和内容的位置&#xff1a; proxy_cache_path /var/nginx/cachekeys_zoneCACHE:60m levels1:2inactive3h max_size20g; proxy_cache CACHE;上述缓存定义示例在文件系统 /var/nginx/ca…

为什么要用多线程?

提高响应速度&#xff1a;对于耗时操作&#xff0c;使用多线程可以使得应用程序更快地响应用户的请求&#xff0c;从而提高用户体验。实现并行计算&#xff1a;多线程可以同时执行多个任务&#xff0c;从而实现并行计算&#xff0c;提高程序的运行效率。提高CPU利用率&#xff…

html属性值可以不用引号吗,实例验证

html属性值可以不用引号 HTML元素的属性值可以不适用引号来包裹&#xff0c;浏览器一样可以将其进行渲染。不过&#xff0c;如果这样写HTML的代码的话&#xff0c;属性与属性值之间需要用空格来进行隔开&#xff0c;避免后面的属性变成前面属性的属性值。 提示&#xff1a;虽…

达梦列式存储和clickhouse基准测试

要验证达梦BigTable和ClickHouse的性能差异&#xff0c;您需要进行一系列基准测试。基准测试通常包括多个步骤&#xff0c;如准备测试环境、设计测试案例、执行测试、收集数据和分析结果。以下是您可以遵循的一般步骤&#xff1a; 准备测试环境&#xff1a; 确保两个数据库系统…

sql手工注入漏洞测试(MYSQL)-墨者-url信息

背景&#xff1a; 自己在墨者官网靶场练习的时候&#xff0c;一直出错&#xff0c;手工容易出错&#xff0c;所以列举一些信息供大家核对&#xff0c;可以参考改动。 数据库版本version() 5.7.22-0ubuntu0.16.04.1 当前数据库名称database&#xff08;) m…

模拟量采集----测量输入的电流

生活中的模拟量有很多 大多都为电压信号和电流信号 今天讲如何测量输入的电流信号 通过欧姆定律可知 电流测量的测量&#xff1a;是将电流加载在固定阻值的电阻上&#xff0c;来测量这个电阻二端的电压 最后反算出电流的大小 所用的公式是IU/R 我们使用仿真软件来看测量…

神经网络中间层特征图可视化(输入为音频)(二)

相比方法一个人感觉这种方法更好 import librosa import numpy as np import utils import torch import matplotlib.pyplot as pltclass Hook:def __init__(self):self.features Nonedef hook_fn(self, module, input, output):self.features output# 创建钩子的实例 hook …

EasyExcel listener无法通过Autowired注入xxMapper

easyexcel listener无法通过Autowired注入xxMapper 文章目录 easyexcel listener无法通过Autowired注入xxMapperbug记录&#xff1a;解决方案&#xff1a;easyexcel 使用例子controllerServiceImpllistener bug记录&#xff1a; productMapper注入一直为null,而procureDetailM…

Visual Studio(VS) C++程序LNK2005错误,提示“error LNK2005: _XXX已经在xxx.obj中定义”解决方案

1.问题如图 2.出现原因 项目中有多个源文件或头文件&#xff0c;include后导致有些变量重复定义&#xff0c;加上Visual Studio新版版要求更严格 3.解决办法 查询到的解决办法很多不好用&#xff0c;此处记录解决自己问题的一个办法&#xff1a;直接让编译器忽略第二次定义的…

图形数据库的实战应用:如何在 Neo4j 中有效管理复杂关系

关系数据库管理系统( RDBMS ) 代表了最先进的技术&#xff0c;这在一定程度上要归功于其由周边技术、工具和广泛的专业技能组成的完善的生态系统。 在这个涵盖信息技术(IT) 和运营技术(OT) 的技术革命时代&#xff0c;人们普遍认识到性能方面出现了重大挑战&#xff0c;特别是…

连续变量降维:主成分分析和因子分析

主成分分析&#xff08;Principal Component Analysis&#xff0c;PCA&#xff09;和因子分析&#xff08;Factor Analysis&#xff09;都是用于处理连续变量降维的统计方法&#xff0c;它们在数据分析和特征提取中经常被使用。尽管它们有一些相似之处&#xff0c;但它们的目标…

初识JVM(简单易懂),解开JVM神秘的面纱

目录 一、什么是JVM&#xff08;Java虚拟机&#xff09;&#xff1f; 二、JVM的功能 三、JVM的功能-即时编译 四、常见的JVM 五、JVM的组成 五、JVM的工作流程 参考资料 一、什么是JVM&#xff08;Java虚拟机&#xff09;&#xff1f; 在Java的世界里&#xff0c;Java虚…