【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;
        }
    }
}
目录
相关文章
|
1月前
|
Java Apache Maven
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
57 6
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
|
2月前
|
数据采集 运维 前端开发
【Java】全套云HIS源码包含EMR、LIS (医院信息化建设)
系统技术特点:采用前后端分离架构,前端由Angular、JavaScript开发;后端使用Java语言开发。
72 5
|
1天前
|
人工智能 监控 数据可视化
Java智慧工地信息管理平台源码 智慧工地信息化解决方案SaaS源码 支持二次开发
智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程管理需求,满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效,为监管平台提供数据支撑。
11 3
|
6天前
|
运维 自然语言处理 供应链
Java云HIS医院管理系统源码 病案管理、医保业务、门诊、住院、电子病历编辑器
通过门诊的申请,或者直接住院登记,通过”护士工作站“分配患者,完成后,进入医生患者列表,医生对应开具”长期医嘱“和”临时医嘱“,并在电子病历中,记录病情。病人出院时,停止长期医嘱,开具出院医嘱。进入出院审核,审核医嘱与住院通过后,病人结清缴费,完成出院。
28 3
|
12天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
15天前
|
移动开发 前端开发 JavaScript
java家政系统成品源码的关键特点和技术应用
家政系统成品源码是已开发完成的家政服务管理软件,支持用户注册、登录、管理个人资料,家政人员信息管理,服务项目分类,订单与预约管理,支付集成,评价与反馈,地图定位等功能。适用于各种规模的家政服务公司,采用uniapp、SpringBoot、MySQL等技术栈,确保高效管理和优质用户体验。
|
1月前
|
JSON 前端开发 Java
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
文章介绍了Java后端如何使用Spring Boot框架响应不同格式的数据给前端,包括返回静态页面、数据、HTML代码片段、JSON对象、设置状态码和响应的Header。
123 1
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
|
1月前
|
存储 前端开发 Java
Java后端如何进行文件上传和下载 —— 本地版(文末配绝对能用的源码,超详细,超好用,一看就懂,博主在线解答) 文件如何预览和下载?(超简单教程)
本文详细介绍了在Java后端进行文件上传和下载的实现方法,包括文件上传保存到本地的完整流程、文件下载的代码实现,以及如何处理文件预览、下载大小限制和运行失败的问题,并提供了完整的代码示例。
344 1
|
2月前
|
传感器 监控 数据可视化
【Java】智慧工地解决方案源码和所需关键技术
智慧工地解决方案是一种新的工程全生命周期管理理念。它通过使用各种传感器、数传终端等物联网手段获取工程施工过程信息,并上传到云平台,以保障数据安全。
80 7
|
2月前
|
机器学习/深度学习 数据采集 JavaScript
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
ADR药品不良反应监测系统是一款智能化工具,用于监测和分析药品不良反应。该系统通过收集和分析病历、处方及实验室数据,快速识别潜在不良反应,提升用药安全性。系统采用Java开发,基于SpringBoot框架,前端使用Vue,具备数据采集、清洗、分析等功能模块,并能生成监测报告辅助医务人员决策。通过集成多种数据源并运用机器学习算法,系统可自动预警药品不良反应,有效减少药害事故,保障公众健康。
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
下一篇
无影云桌面