【Java实现小游戏】飞翔的小鸟(源码)

简介: 【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;
}
    @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;
        }
    }
}
目录
相关文章
|
30天前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
64 7
|
2月前
|
数据采集 人工智能 Java
Java产科专科电子病历系统源码
产科专科电子病历系统,全结构化设计,实现产科专科电子病历与院内HIS、LIS、PACS信息系统、区域妇幼信息平台的三级互联互通,系统由门诊系统、住院系统、数据统计模块三部分组成,它管理了孕妇从怀孕开始到生产结束42天一系列医院保健服务信息。
37 4
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
87 2
|
22天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
107 13
|
2月前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
57 12
|
30天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
2月前
|
人工智能 监控 数据可视化
Java智慧工地信息管理平台源码 智慧工地信息化解决方案SaaS源码 支持二次开发
智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程管理需求,满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效,为监管平台提供数据支撑。
53 3
|
2月前
|
运维 自然语言处理 供应链
Java云HIS医院管理系统源码 病案管理、医保业务、门诊、住院、电子病历编辑器
通过门诊的申请,或者直接住院登记,通过”护士工作站“分配患者,完成后,进入医生患者列表,医生对应开具”长期医嘱“和”临时医嘱“,并在电子病历中,记录病情。病人出院时,停止长期医嘱,开具出院医嘱。进入出院审核,审核医嘱与住院通过后,病人结清缴费,完成出院。
123 4
|
1月前
|
人工智能 移动开发 安全
家政上门系统用户端、阿姨端源码,java家政管理平台源码
家政上门系统基于互联网技术,整合大数据分析、AI算法和现代通信技术,提供便捷高效的家政服务。涵盖保洁、月嫂、烹饪等多元化服务,支持多终端访问,具备智能匹配、在线支付、订单管理等功能,确保服务透明、安全,适用于家庭生活的各种需求场景,推动家政市场规范化发展。
|
2月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。