java--飞翔的小鸟

news2025/1/13 14:41:11

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

游戏内图片

 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;
}
 
    @Override
    public 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(){
        @Override
        public 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.coloradmin.cn/o/1240269.html

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

相关文章

VueRouter

路由介绍 1.思考 单页面应用程序&#xff0c;之所以开发效率高&#xff0c;性能好&#xff0c;用户体验好 最大的原因就是&#xff1a;页面按需更新 比如当点击【发现音乐】和【关注】时&#xff0c;只是更新下面部分内容&#xff0c;对于头部是不更新的 要按需更新&#…

使用Pytorch从零开始构建WGAN

引言 在考虑生成对抗网络的文献时&#xff0c;Wasserstein GAN 因其与传统 GAN 相比的训练稳定性而成为关键概念之一。在本文中&#xff0c;我将介绍基于梯度惩罚的 WGAN 的概念。文章的结构安排如下&#xff1a; WGAN 背后的直觉&#xff1b;GAN 和 WGAN 的比较&#xff1b;…

opencv-图像金字塔

图像金字塔是一种图像处理技术&#xff0c;它通过不断降低图像的分辨率&#xff0c;形成一系列图像。金字塔分为两种类型&#xff1a;高斯金字塔和拉普拉斯金字塔。 高斯金字塔&#xff08;Gaussian Pyramid&#xff09;&#xff1a; 高斯金字塔是通过使用高斯滤波和降采样&a…

Selenium切换窗口、框架和弹出框window、ifame、alert

一、切换窗口 #获取打开的多个窗口句柄 windows driver.window_handles #切换到当前最新打开的窗口 driver.switch_to.window(windows[-1]) #最大化浏览器 driver.maximize_window() #刷新当前页面 driver.refresh() 二、切换框架frame 如存在以下网页&#xff1a; <htm…

基于SSM的济南旅游网站设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

Dubbo从入门到上天系列第十八篇:Dubbo引入注册中心简介以及DubboAdmin简要介绍,为后续详解Dubbo各种注册中心做铺垫!

一&#xff1a;Dubbo注册中心引言 1&#xff1a;什么是Dubbo的注册中心&#xff1f; Dubbo注册中心是Dubbo服务治理中极其重要的一个概念。它主要是用于对Rpc集群应用实例进行管理。 对于我们的Dubbo服务来讲&#xff0c;至少有两部分构成&#xff0c;一部分是Provider一部分是…

Postgresql源码(116)提升子查询案例分析

0 总结 对于SQL&#xff1a;select * from student, (select * from score where sno > 2) s where student.sno s.sno; pullup在pull_up_subqueries函数内递归完成&#xff0c;分几步&#xff1a; 将内层rte score追加到上层rtbable中&#xff1a;rte1是student、rte2带…

Jenkins 配置节点交换内存

查看交换内存 free -hswapon -s创建swap文件 dd if/dev/zero of/mnt/swap bs1M count1024启用交换文件 设置权限 chmod 600 /mnt/swap设置为交换空间 mkswap /mnt/swap启用交换 swapon /mnt/swap设置用户组 chown root:root /mnt/swap查看 swapon -s重启系统也能生效还需要修…

Redisson分布式锁源码解析

一、使用Redisson步骤 Redisson各个锁基本所用Redisson各个锁基本所用Redisson各个锁基本所用 二、源码解析 lock锁 1&#xff09; 基本思想&#xff1a; lock有两种方法 一种是空参 另一种是带参 * 空参方法&#xff1a;会默认调用看门狗的过期时间30*1000&…

Android进阶知识:ANR的定位与解决

1、前言 ANR对于Android开发者来说一定不会陌生&#xff0c;从刚开始学习Android时的一不注意就ANR&#xff0c;到后来知道主线程不能进行耗时操作注意到这点后&#xff0c;程序出现ANR的情况就大大减少了&#xff0c;甚至于消失了。那么真的是只要在主线程做耗时操作就会产生…

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

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

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

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

分类预测 | Matlab实现KPCA-IDBO-LSSVM基于核主成分分析-改进蜣螂算法优化最小二乘支持向量机的分类预测

分类预测 | Matlab实现KPCA-IDBO-LSSVM基于核主成分分析-改进蜣螂算法优化最小二乘支持向量机的分类预测 目录 分类预测 | Matlab实现KPCA-IDBO-LSSVM基于核主成分分析-改进蜣螂算法优化最小二乘支持向量机的分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.多特…

OpenAI再次与Altman谈判;ChatGPT Voice正式上线

11月22日&#xff0c;金融时报消息&#xff0c;OpenAI迫于超过700名员工联名信的压力&#xff0c;再次启动了与Sam Altman的谈判&#xff0c;希望他回归董事会。 在Sam确定加入微软后&#xff0c;OpenAI超700名员工签署了一封联名信&#xff0c;要求Sam和Greg Brockman&#x…

【SpringCloud】认识微服务、服务拆分以及远程调用

SpringCloud 1.认识微服务 1.1单体架构 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&#xff0c;打成一个包部署 单体架构的优缺点&#xff1a; 优点&#xff1a; 架构简单&#xff0c;部署成本低 缺点&#xff1a; 耦合度高&#xff08;维护困难&#x…

一键去水印免费网站快速无痕处理图片、视频水印

水印问题往往是一个大麻烦。即使我们只想将这些照片保留在我们的个人相册中以供怀旧&#xff0c;水印也可能像顽固的符号一样刺激我们的眼睛。为了解决这个问题&#xff0c;我们需要不断探索创新的解决方案&#xff0c;让我们深入研究一款强大的一键去水印免费网站“水印云”。…

IOS+Appium+Python自动化全实战教程

由于公司的产品坐落于不同的平台&#xff0c;如ios、mac、Android、windows、web。因此每次有新需求的时候&#xff0c;开发结束后&#xff0c;留给测试的时间也不多。此外&#xff0c;一些新的功能实现&#xff0c;偶尔会影响其他的模块功能正常的使用。 网上的ios自动化方面的…

npm install安装报错

npm WARN notsup Not compatible with your version of node/npm: v-click-outside-x3.7.1 npm ERR! Error while executing: npm ERR! /usr/bin/git ls-remote -h -t ssh://gitgithub.com/itargaryen/simple-hotkeys.git 解决办法1&#xff1a;&#xff08;没有解决我的问题…

likeshop单商户商城系统 任意文件上传漏洞复现

0x01 产品简介 likeshop单商户标准商城系统适用于B2C、单商户、自营商城场景。完美契合私域流量变现闭环交易使用。 系统拥有丰富的营销玩法&#xff0c;强大的分销能力&#xff0c;支持电子面单和小程序直播等功能。无论运营还是二开都是性价比极高的100%开源商城系统。 0x02…

VUE语法-$refs和ref属性的使用

1、$refs和ref属性的使用 1、$refs:一个包含 DOM 元素和组件实例的对象&#xff0c;通过模板引用注册。 2、ref实际上获取元素的DOM节点 3、如果需要在Vue中操作DOM我们可以通过ref和$refs这两个来实现 总结:$refs可以获取被ref属性修饰的元素的相关信息。 1.1、$refs和re…