程序员教你用代码制作飞翔的小鸟--Java小游戏,正好拿去和给女神一起玩

简介: 《飞扬的小鸟》Java实现摘要:使用IntelliJ IDEA和JDK 16开发,包含小鸟类`Bird`,处理小鸟的位置、速度和碰撞检测。代码示例展示小鸟图像的加载、绘制与旋转。同时有`Music`类用于循环播放背景音乐。游戏运行时检查小鸟是否撞到地面、柱子或星星,并实现翅膀煽动效果。简单易懂,可直接复制使用。

先点赞后观看,养成好习惯

一、写在前面:

《飞扬的小鸟》是一款曾经比较火热的小游戏

语言
Java工具

IntelliJ IDEA,JDK 16

二效果图:

代码部分

代码如下仅供参考
可以直接拿去复制粘贴

public class Bird {
private int x;// 横坐标
private int y;// 纵坐标

private BufferedImage bird;

private BufferedImage[] birds;
private int index;

private int g;// 重力加速度
private double t;// 计算时间间隔
private double v0;// 初速度(像素/秒)
private double vt;// 当前速度
private double s;// 运动距离
private double angle;// 小鸟飞行角度

private int size=26;

private World world;

public Bird(int x, int y) throws IOException {

  bird = ImageIO.read(this.getClass().getResource("0.png"));

  this.x = x;
  this.y = y;
  birds = new BufferedImage[3];
  for (int i = 0; i < 3; i++) {
     birds[i] = ImageIO.read(this.getClass().getResource(i + ".png"));
  }

  bird = birds[0];
  this.g = 4;//重力加速度
  this.t = 0.25;//每次计算的间隔时间
  this.v0 = 20;//初始上抛速度

}

public void paint(Graphics g) {
// g.drawImage(bird, x, y, null);
Graphics2D g2d = (Graphics2D)g;
//绘制旋转坐标系
g2d.rotate(angle,this.x,this.y);
//小鸟的旋转中心
int x = this.x - bird.getWidth()/2;
int y = this.y - bird.getHeight()/2;
g.drawImage(bird, x, y, null);
//旋转回来
g2d.rotate(-angle, this.x, this.y);

}

public void step() {

  /**
   * 竖直方向上的位移计算 
   * (1)上抛距离计算:s = V0t - 1/2gt^2 
   * (2)上抛初速度计算:Vt = V0 - gt
   */

  //vt1记录本次速度
  double vt1 = vt;
  //计算垂直运动之后,经过t时间之后的速度
  double v = vt1 - g*t;
  //记录并作为下一次计算的初速度
  vt = v;
  //计算垂直距离下的实际运行距离
  s = vt1 * t - 0.5 * g * g * t;
  y = y - (int)s;

  angle = -Math.atan(s/15);


  // 煽动翅膀的算法

// if (index > 2) {
// index = 0;
// }
// bird = birds[index++];

  index++;
  bird = birds[index / 8 % 3];//

}

public void flappy() {
vt = v0;
}

public boolean hit(Ground ground,Column col1,Column col2) {
if(y-size/2 >= ground.getY() || y-size/2 <=0) {
return true;
}

  return hit(col1) || hit(col2);

}

public boolean hit(Column column) {
if(x+size/2 > column.getX()-column.getWidth()/2 && x-size/2 < column.getX() + column.getWidth()/2) {
if(y > column.getY() - column.getGap()/2 + size/2 && y < column.getY() + column.getGap()/2 - size/2) {
return false;
}
return true;
}
return false;
}

public boolean hitstart(Star star) {
// if(x+size/2 > star.getX() && x+size/2 < star.getX()+star.getWidth()) {
// if(y+size/2 > star.getY() && y+size/2 < star.getY()+star.getHeight()) {
//
// System.out.print("star.getX():" + star.getX() + " ");
// System.out.print("star.getY():" + star.getY() + " ");
//
// return true;
// }
// return false;
// }
// return false;

  if(x+size/2 > star.getX() && x+size/2 < star.getX()+star.getWidth()) {
     if(y+size/2 > star.getY() && y-size/2 < star.getY()+star.getHeight()) {

        return true;
     }
     return false;
  }
  return false;

}

public boolean pass(Column col1, Column col2) {
return col1.getX() == x || col2.getX() == x;
}

public boolean pass1(Column col1, Column col2) {
return col1.getX() == 2x || col2.getX() == 2x;
}

public boolean passstar(Star star) {
// star.setY(-30);
return star.getX() == x ;

}

public boolean passstar1(Star star) {
// star.setY(-30);
return star.getX() == 2*x ;
}

public class Music extends Thread {
private String fileName;
private final int EXTERNAL_BUFFER_SIZE = 524288;

public Music(String wavFile) {
    this.fileName = wavFile;
}

@SuppressWarnings("unused")
public void run() {
    File soundFile = new File("D:\\Bird\\src\\src\\com\\icss\\bird\\稻香.wav"); // 播放音乐的文件名
    if (!soundFile.exists()) {
        System.err.println("Wave file not found:" + fileName);
        return;
    }
    while (true) { // 设置循环播放
        AudioInputStream audioInputStream = null; // 创建音频输入流对象
        try {
            audioInputStream = AudioSystem.getAudioInputStream(soundFile); // 创建音频对象
        } catch (UnsupportedAudioFileException e1) {
            e1.printStackTrace();
            return;
        } catch (IOException e1) {
            e1.printStackTrace();
            return;
        }
        AudioFormat format = audioInputStream.getFormat(); // 音频格式
        SourceDataLine auline = null; // 源数据线
        DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
        try {
            auline = (SourceDataLine) AudioSystem.getLine(info);
            auline.open(format);
        } catch (LineUnavailableException e) {
            e.printStackTrace();
            return;
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }
        if (auline.isControlSupported(FloatControl.Type.PAN)) {
            FloatControl pan = (FloatControl) auline.getControl(FloatControl.Type.PAN);
        }
        auline.start();
        int nBytesRead = 0;
        byte[] abData = new byte[EXTERNAL_BUFFER_SIZE];
        try {
            while (nBytesRead != -1) {
                nBytesRead = audioInputStream.read(abData, 0, abData.length);
                if (nBytesRead >= 0)
                    auline.write(abData, 0, nBytesRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
            return;
        } finally {
            auline.drain();

// auline.close();
}
}
}
}

运行步骤:导入到idea或者eclipse点击运行即可运行成功了快快和爱慕女孩一起玩,说不定就能收获到爱情啦。(如果有不想动手的小伙伴可以私聊博主获取哦!!!!)

相关文章
|
19小时前
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
75 11
|
4天前
|
JSON Java 数据挖掘
利用 Java 代码获取淘宝关键字 API 接口
在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。
|
22天前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
45 3
|
2月前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
61 24
|
29天前
|
前端开发 Java 测试技术
java日常开发中如何写出优雅的好维护的代码
代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
62 2
|
1月前
|
Java 编译器 数据库
Java 中的注解(Annotations):代码中的 “元数据” 魔法
Java注解是代码中的“元数据”标签,不直接参与业务逻辑,但在编译或运行时提供重要信息。本文介绍了注解的基础语法、内置注解的应用场景,以及如何自定义注解和结合AOP技术实现方法执行日志记录,展示了注解在提升代码质量、简化开发流程和增强程序功能方面的强大作用。
87 5
|
1月前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
64 5
|
2月前
|
Java API 开发者
Java中的Lambda表达式:简洁代码的利器####
本文探讨了Java中Lambda表达式的概念、用途及其在简化代码和提高开发效率方面的显著作用。通过具体实例,展示了Lambda表达式如何在Java 8及更高版本中替代传统的匿名内部类,使代码更加简洁易读。文章还简要介绍了Lambda表达式的语法和常见用法,帮助开发者更好地理解和应用这一强大的工具。 ####
|
1月前
|
安全 Java API
Java中的Lambda表达式:简化代码的现代魔法
在Java 8的发布中,Lambda表达式的引入无疑是一场编程范式的革命。它不仅让代码变得更加简洁,还使得函数式编程在Java中成为可能。本文将深入探讨Lambda表达式如何改变我们编写和维护Java代码的方式,以及它是如何提升我们编码效率的。
|
2月前
|
Java
Java将OffsetDateTime格式化为 yyyy-MM-dd HH:mm:ss 如何写代码?
Java将OffsetDateTime格式化为 yyyy-MM-dd HH:mm:ss 如何写代码?
50 0