程序员教你用代码制作飞翔的小鸟--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点击运行即可运行成功了快快和爱慕女孩一起玩,说不定就能收获到爱情啦。(如果有不想动手的小伙伴可以私聊博主获取哦!!!!)

相关文章
|
7天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
21天前
|
Java 程序员
JAVA程序员的进阶之路:掌握URL与URLConnection,轻松玩转网络资源!
在Java编程中,网络资源的获取与处理至关重要。本文介绍了如何使用URL与URLConnection高效、准确地获取网络资源。首先,通过`java.net.URL`类定位网络资源;其次,利用`URLConnection`类实现资源的读取与写入。文章还提供了最佳实践,包括异常处理、连接池、超时设置和请求头与响应头的合理配置,帮助Java程序员提升技能,应对复杂网络编程场景。
47 9
|
21天前
|
XML 安全 Java
Java反射机制:解锁代码的无限可能
Java 反射(Reflection)是Java 的特征之一,它允许程序在运行时动态地访问和操作类的信息,包括类的属性、方法和构造函数。 反射机制能够使程序具备更大的灵活性和扩展性
34 5
Java反射机制:解锁代码的无限可能
|
6天前
|
SQL 存储 Java
面向 Java 程序员的 SQLite 替代品
SQLite 是轻量级数据库,适用于小微型应用,但其对外部数据源支持较弱、无存储过程等问题影响了开发效率。esProc SPL 是一个纯 Java 开发的免费开源工具,支持标准 JDBC 接口,提供丰富的数据源访问、强大的流程控制和高效的数据处理能力,尤其适合 Java 和安卓开发。SPL 代码简洁易懂,支持热切换,可大幅提高开发效率。
|
17天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
48 3
|
23天前
|
存储 安全 Java
系统安全架构的深度解析与实践:Java代码实现
【11月更文挑战第1天】系统安全架构是保护信息系统免受各种威胁和攻击的关键。作为系统架构师,设计一套完善的系统安全架构不仅需要对各种安全威胁有深入理解,还需要熟练掌握各种安全技术和工具。
64 10
|
18天前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
17天前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
18天前
|
SQL Java 程序员
倍增 Java 程序员的开发效率
应用计算困境:Java 作为主流开发语言,在数据处理方面存在复杂度高的问题,而 SQL 虽然简洁但受限于数据库架构。SPL(Structured Process Language)是一种纯 Java 开发的数据处理语言,结合了 Java 的架构灵活性和 SQL 的简洁性。SPL 提供简洁的语法、完善的计算能力、高效的 IDE、大数据支持、与 Java 应用无缝集成以及开放性和热切换特性,能够大幅提升开发效率和性能。
|
24天前
|
IDE Java 程序员
C++ 程序员的 Java 指南
一个 C++ 程序员自己总结的 Java 学习中应该注意的点。
21 5