java實(shí)現(xiàn)Flappy Bird游戲源代碼
本文實(shí)例為大家分享了java實(shí)現(xiàn)Flappy Bird游戲的具體代碼,供大家參考,具體內(nèi)容如下
/*
2017/7/23
*/
import java.awt.Graphics;
//import java.util.Timer;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.Rectangle;
import java.awt.*;
import java.util.*;
import javax.swing.JFrame;
import javax.swing.Timer;
import javax.swing.*;
import javax.swing.JPanel;
class Renderer extends JPanel
{
private static final long serialVersionUID = 1L;
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
FlappyBird.flappyBird.repaint(g);
}
}
public class FlappyBird implements ActionListener, MouseListener, KeyListener
{
public static FlappyBird flappyBird;
public final int WIDTH = 900, HEIGHT = 800;
public Renderer renderer;
public Rectangle bird;
public ArrayList<Rectangle> columns;
public int ticks, yMotion, score;
public boolean gameOver, started;
public Random rand;
public FlappyBird()
{
JFrame jframe = new JFrame();
Timer timer = new Timer(20,this);
renderer = new Renderer();
rand = new Random();
jframe.add(renderer);
jframe.setTitle("Flappy Bird");
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jframe.setSize(WIDTH,HEIGHT);
jframe.addMouseListener(this);
jframe.addKeyListener(this);
jframe.setResizable(false);
jframe.setVisible(true);
bird = new Rectangle(WIDTH / 2 - 10, HEIGHT / 2 - 10, 20, 20);
columns = new ArrayList<Rectangle>();
addColumn(true);
addColumn(true);
addColumn(true);
addColumn(true);
timer.start();
}
public void addColumn(boolean start)
{
int space = 300;
int width = 100;
int height = 50 + rand.nextInt(300);
if(start)
{
columns.add(new Rectangle(WIDTH + width + columns.size() * 300, HEIGHT - height - 120, width, height));
columns.add(new Rectangle(WIDTH + width + (columns.size()-1)*300, 0, width, HEIGHT - height - space));
}
else
{
columns.add(new Rectangle(columns.get(columns.size() - 1).x + 600, HEIGHT - height - 120, width, height));
columns.add(new Rectangle(columns.get(columns.size() - 1).x , 0, width, HEIGHT - height - space));
}
}
public void paintColumn(Graphics g, Rectangle column)
{
g.setColor(Color.green.darker());
g.fillRect(column.x, column.y, column.width, column.height);
}
public void jump()
{
if (gameOver)
{
bird = new Rectangle(WIDTH / 2 - 10, HEIGHT / 2 - 10, 20, 20);
columns.clear();
yMotion = 0;
score = 0;
addColumn(true);
addColumn(true);
addColumn(true);
addColumn(true);
gameOver = false;
}
if(!started)
{
started = true;
}
else if(!gameOver)
{
if(yMotion > 0)
{
yMotion = 0;
}
yMotion -= 10;
}
}
public void actionPerformed(ActionEvent e)
{
int speed = 10;
ticks++;
if(started )
{
for( int i = 0; i < columns.size(); i++)
{
Rectangle column = columns.get(i);
column.x -= speed;
}
if(ticks % 2 ==0 && yMotion < 15)
{
yMotion += 2;
}
for (int i = 0; i < columns.size(); i++)
{
Rectangle column = columns.get(i);
if (column.x + column.width < 0)
{
columns.remove(column);
if(column.y ==0)
{
addColumn(false);
}
}
}
bird.y += yMotion;
for(Rectangle column : columns)
{
if(bird.x + bird.width / 2 > column.x + column.width / 2 - 5
&& bird.x + bird.width / 2 < column.x + column.width / 2 + 5
&& column.y == 0)
{
score++;
}
if(column.intersects(bird))
{
gameOver = true;
if(bird.x <= column.x)
{
bird.x = column.x - bird.width;
}
else
{
if(column.y != 0)
{
bird.y = column.y - bird.height;
}
else if(bird.y < column.height)
{
bird.y = column.height;
}
}
}
}
if(bird.y > HEIGHT - 120 || bird.y < 0 )
{
gameOver = true;
}
if(bird.y + yMotion >= HEIGHT -120)//(gameOver)
{
bird.y = HEIGHT -120 - bird.height;
}
}
renderer.repaint();
}
public void repaint(Graphics g)
{
//System.out.println("hello");
g.setColor(Color.cyan);
g.fillRect(0,0,WIDTH,HEIGHT);
g.setColor(Color.orange);
g.fillRect(0, HEIGHT - 120, WIDTH, 150);
g.setColor(Color.green);
g.fillRect(0, HEIGHT - 120, WIDTH, 20);
g.setColor(Color.red);
g.fillRect(bird.x, bird.y, bird.width, bird.height);
for ( Rectangle column : columns )
{
paintColumn(g,column);
}
g.setColor(Color.white);
g.setFont(new Font("Arial",1,70));
if(!started)
{
g.drawString("Click to start!",90,HEIGHT / 2-50);
}
if(gameOver)
{
g.drawString("Game Over! You suck!",40,HEIGHT / 2-50);
}
if(!gameOver && started)
{
g.drawString(String.valueOf(score), WIDTH / 2, 100);
}
}
public static void main(String[]args)
{
flappyBird = new FlappyBird();
}
public void mouseClicked(MouseEvent e)
{
jump();
}
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void keyPressed(KeyEvent e){}
public void keyTyped(KeyEvent e){}
public void keyReleased(KeyEvent e)
{
if(e.getKeyCode() == KeyEvent.VK_SPACE)
{
jump();
}
}
}
效果圖:


以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C語言實(shí)現(xiàn)flappy bird游戲
- Qt實(shí)現(xiàn)Flappy Bird游戲
- python實(shí)現(xiàn)flappy bird游戲
- Java實(shí)現(xiàn)Flappy Bird游戲源碼
- java實(shí)現(xiàn)flappy Bird小游戲
- C語言實(shí)現(xiàn)Flappy Bird小游戲
- C語言簡易版flappy bird小游戲
- 純JavaScript 實(shí)現(xiàn)flappy bird小游戲?qū)嵗a
- C++版本簡易Flappy bird
- Unity實(shí)現(xiàn)Flappy Bird游戲開發(fā)實(shí)戰(zhàn)
相關(guān)文章
mybatis?example如何自動(dòng)生成代碼?排序語句
這篇文章主要介紹了mybatis?example如何自動(dòng)生成代碼?排序語句,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
java模擬ajax訪問另一個(gè)項(xiàng)目的controller代碼實(shí)例
今天小編就為大家分享一篇關(guān)于java模擬ajax訪問另一個(gè)項(xiàng)目的controller代碼實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03
Java后端實(shí)現(xiàn)生成驗(yàn)證碼圖片的示例代碼
驗(yàn)證碼是一種用于驗(yàn)證用戶身份或確保用戶操作安全的技術(shù)手段,通常以圖形、聲音或文字的形式出現(xiàn),本文主要介紹了如何通過java實(shí)現(xiàn)生成驗(yàn)證碼圖片,需要的可以參考下2023-12-12
Java實(shí)現(xiàn)數(shù)據(jù)庫圖片上傳功能詳解
這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)數(shù)據(jù)庫圖片上傳功能,包含從數(shù)據(jù)庫拿圖片傳遞前端渲染,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-03-03
Java中使用MongoDB數(shù)據(jù)庫實(shí)例Demo
MongoDB是由C++語言編寫的,基于分布式文件存儲(chǔ)的數(shù)據(jù)庫,是一個(gè)介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是最接近于關(guān)系型數(shù)據(jù)庫的NoSQL數(shù)據(jù)庫,下面這篇文章主要給大家介紹了關(guān)于Java中使用MongoDB數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下2023-12-12
關(guān)于Tomcat出現(xiàn)The origin server did not find a current represent
這篇文章主要介紹了關(guān)于Tomcat出現(xiàn)The origin server did not find a current representation for the target resourc...的問題,感興趣的小伙伴們可以參考一下2020-08-08
Maven分模塊開發(fā)與依賴管理和聚合和繼承及屬性深入詳細(xì)介紹
依賴管理是項(xiàng)目管理中非常重要的一環(huán)。幾乎任何項(xiàng)目開發(fā)的時(shí)候需要都需要使用到庫。而這些庫很可能又依賴別的庫,這樣整個(gè)項(xiàng)目的依賴形成了一個(gè)樹狀結(jié)構(gòu),而隨著這個(gè)依賴的樹的延伸和擴(kuò)大,一系列問題就會(huì)隨之產(chǎn)生2022-10-10
springboot 使用logback啟動(dòng)報(bào)警報(bào)錯(cuò)的解決
這篇文章主要介紹了springboot 使用logback啟動(dòng)報(bào)警報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07

