java实现flappy Bird小游戏

本文实例为大家分享了java实现flappy Bird游戏的具体代码,供大家参考,具体内容如下

整个游戏由3个类构成。Bird类,Pipe类,stage类

第一步:首先写一个Bird类

//鸟类
public class Bird {
 private int flyHeight;//飞行高度
 private int xpos;//距离y轴(窗口左边缘)的位置,
 public static int Up=1;//向上飞
 public static int Down=-1;//向下飞
 public Bird()
 {
 flyHeight=200;
 xpos=30;
 }
 public void fly(int direction)
 {
 if(direction==Bird.Up)
 flyHeight-=20;//每次向上飞20m
 if(direction==Bird.Down)
 flyHeight+=20;//每次向下飞20m
 }
 public int getFlyHeight()//获得当前飞行高度
 {
 return flyHeight;
 }
 public int getXpos()//获得当前鸟的水平位置
 {
 return xpos;
 }
 public Boolean hit(Pipe pipe[])//检测是否碰到管道。只有在鸟经过管道的过程才有可能相撞
 {
 for(int i=0;i<pipe.length;i++)//遍历管道进行检测,是否相撞
 {
 if(getXpos()+20>=pipe[i].getXpos()&&getXpos()<=pipe[i].getXpos()+20)//鸟经过管道
 if(flyHeight<pipe[i].getUpHeight()||flyHeight>pipe[i].getDownHeight())//鸟与管道相撞
  return true;
 }
 return false;
 }
}

第二步:写一个Pipe类,Pipe类 里有3个成员,upHeight表示顶管道端的高度,downHeight表示底端管道段的高度,同样要记录管道的水平位置。

public class Pipe {
 private int upHeight;//表示顶管道端的高度
 private int downHeight;//表示底端管道段的高度
 private int xpos;
 public Pipe()
 {
 upHeight=0;
 downHeight=0;
 xpos=0;
 }
 public Pipe(int maxHeight,int xpos)//给管道一个最大总长度(maxHeight)=upHeight+downHeight。还有管道的水平位置
 {
 double num;
 num=Math.random();
 while(num==0)
 num=Math.random();
 upHeight=(int) (maxHeight*num);//随机产生一个顶端管道段高度(<maxHeight)
 downHeight=maxHeight-upHeight;//用总长度减去upHeight
 this.xpos=xpos;
 }
 public void setXpos(int xpos)
 {
 this.xpos=xpos;
 }
 public int getXpos()
 {
 return xpos;
 }
 public int getUpHeight()
 {
 return upHeight;
 }
 public int getDownHeight()
 {
 return downHeight;
 }
 public String toSting()
 {
 return "("+upHeight+","+downHeight+")";
 }
}

最后一步,写好舞台类,即操作游戏的类

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.lang.reflect.Array;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class stage extends JPanel{
 private Pipe pipe[];//管道数组
 private Bird bird;//鸟
 private int space;//上下管道之间的间隔
 public JLabel scoreBoard;//计分面板
 private int score;//计分
 public stage()
 {
 space=150;//<span style="font-family: Arial, Helvetica, sans-serif;">上下管道之间的间隔为150</span>
 score=0;
 scoreBoard=new JLabel("得分:"+score);
 pipe=new Pipe[5];//总共5跟根
 for(int i=0;i<pipe.length;i++)
 {
 pipe[i]=new Pipe(400-space,i*130+110);//柱子每隔110m放一根
 //System.out.println(pipe[i].toSting());
 }
 bird=new Bird();
 }
 public void play()
 {
 Timer timer=new Timer();//定时任务,即使不操作也能动
 timer.schedule(new TimerTask()
 {
  public void run()
  {

  if(bird.hit(pipe))//碰到,重置所有数据成员
  {
  //System.out.println("碰到了");
  score=0;
  scoreBoard.setText("得分:"+score);
  pipe=new Pipe[10];
  for(int x=0;x<pipe.length;x++)
  pipe[x]=new Pipe(400-space,x*130+110);
  bird=new Bird();
  }
  else{//没碰到
  //System.out.println("没碰到");
  bird.fly(Bird.Down);//鸟默认向下飞
  for(int x=0;x<pipe.length;x++)//管道每次往前移动10m,造成鸟向右移动的效果
  {
   pipe[x].setXpos(pipe[x].getXpos()-10);
  }
  score=score+10;
  scoreBoard.setText("得分:"+score);
  }
  repaint();
  }
 }, 0, 1000);//在不操作的情况下,每一秒飞一次
 this.requestFocus();//获取”输入“焦点
 this.addKeyListener(new KeyAdapter() {//加入键盘时间
 public void keyPressed(KeyEvent e)
 {
 if(e.getKeyCode()==38)
 <span style="white-space:pre"> </span>action(Bird.Up);
 else if(e.getKeyCode()==40)
 action(Bird.Down);
 });
 }
 public void action(int direction)//按下上下方向键后执行的函数
 {

 if(bird.hit(pipe))
 {
 //System.out.println("碰到了");
 score=0;
 scoreBoard.setText("得分:"+score);
 pipe=new Pipe[10];
 for(int x=0;x<pipe.length;x++)
 pipe[x]=new Pipe(400-space,x*130+110);
 bird=new Bird();
 }
 else{
 //System.out.println("没碰到");
 if(direction==Bird.Up)
 {
 bird.fly(Bird.Up);
 }
 else if(direction==Bird.Down)
 {
 bird.fly(Bird.Down);
 }
 for(int x=0;x<pipe.length;x++)//管道每次往前移动10m,造成鸟向右移动的效果
 {
 pipe[x].setXpos(pipe[x].getXpos()-10);
 }
 score=score+10;
 scoreBoard.setText("得分:"+score);
 }
 repaint();
 }
 public void paint(Graphics g)
 {
 g.setColor(g.getColor());
 g.fillRect(0, 0, getWidth(), getHeight());//用默认颜色清屏
 g.setColor(Color.red);
 g.fill3DRect(bird.getXpos(), bird.getFlyHeight(), 20, 20, true);//红色画鸟
 g.setColor(Color.green);
 for(int i=0;i<pipe.length;i++)//绿色画管道
 {
 g.fill3DRect(pipe[i].getXpos(), 0, 20, pipe[i].getUpHeight(), true);
 g.fill3DRect(pipe[i].getXpos(),pipe[i].getUpHeight()+space, 20, pipe[i].getDownHeight(), true);
 }
 if(pipe[0].getXpos()+20<=0)//如果第一根管道出界,就删掉第一根管道,把后面的往前挪,再新创建一根管道
 {
 for(int i=1;i<pipe.length;i++)
  pipe[i-1]=pipe[i];
 pipe[pipe.length-1]=new Pipe(400-space,(pipe.length-1)*130+110);
 //System.out.println(pipe[pipe.length-1].toSting());
 }
 }
 public static void main(String[] args) {
 // TODO Auto-generated method stub
 JFrame jf=new JFrame("flappyBird");
 stage app=new stage();
 jf.setLayout(null);
 app.setBounds(0,20,600,400);
 app.scoreBoard.setBounds(0, 0, 100, 20);
 jf.add(app);
 jf.add(app.scoreBoard);
 jf.setSize(610, 460);
 jf.setVisible(true);
 app.play();//游戏开始
 }

}

程序截图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java连连看游戏菜单设计

    本文实例为大家分享了java连连看游戏菜单的具体实现代码,供大家参考,具体内容如下 先写GUI. 首先初始化框架,菜单,按钮,需要把菜单和按钮都添加在框架中.注意添加的顺序,首先要设置菜单,再设置框架,再设置按钮,如果交换了设置菜单和框架的顺序,会导致菜单显示不出,被框架挡住.对菜单设置了三个选项,第一个选项有五个下拉按键,用循环添加,第二个和第三个选项的下拉按键直接添加. GUI代码如下: package gui; import java.awt.Font; import javax.swin

  • java实现斗地主游戏

    感想: 第一次写博客,感觉编辑器挺复杂厉害的,感觉自己的内容挺简单的.有什么问题请多多指教! 思路: 1.创建一个扑克牌的实体类Poker,设置了四个参数:花色.数字.牌值(判断大小).是否地主牌,实现getset方法和构造方法: 2.创建一个玩家的实体类Player,设置了四个参数: 初始牌集合,排序后牌集合,牌值集合,是否地主,实现getset方法和构造方法: 3.洗牌:循环嵌套花色数组跟数字数组生成52个Poker,手动加入大小王Poker,放进map(int,Poker)里面,利用Col

  • 小伙熬夜用Java重现经典超级马里奥代码实例

    说起Java,很多人都想问,Java这么火但是Java能干什么呢?Java主要是做企业级的应用开发,其实Java还可以做游戏开发,Java不仅开发过电脑端的游戏,手游也有开发过,经典的游戏有很多,比如<我的世界>.<吃豆>等等,今天小编来分享一个用Java开发超级马里奥. 游戏界面展示: 游戏代码如下: 以上所述是小编给大家介绍的Java重现经典超级马里奥详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的.在此也非常感谢大家对我们网站的支持!

  • java实现24点游戏

    游戏规则 从扑克中每次取出4张牌.使用加减乘除,第一个能得出24者为赢.(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏. 基本要求 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式 列出表达式无重复 用户初始生命值为一给定值(比如3),初始分数为0.随机生成4个代表扑克牌牌面的数字或字母,由用户输入包含这4个数字或字母的运算表达式(可包含括号),如果表达式计算结果为24则代表用户赢了此局. 使用计时器要求用户在规定时间内输入表达式,如

  • Java Swing实现扫雷小游戏

    swing设计扫雷心得,供大家参考,具体内容如下 最近学习swing学习之余做了一个小游戏:扫雷 1.前期设计 2.实现 其实完成这个游戏的核心就在于对数组的操纵,下面贴主要代码Main.java: package first; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.GridLayout; import java.awt.Image; import java.

  • Java实现的打地鼠小游戏完整示例【附源码下载】

    本文实例讲述了Java实现的打地鼠小游戏.分享给大家供大家参考,具体如下: 这里涉及到java线程和GUI的相关知识,一个简单的java小游戏打地鼠,有兴趣的朋友可以优化一下.先来看看运行效果: 具体代码: Mouse.java: import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt

  • java实现简单扫雷小游戏

    本文实例为大家分享了java实现扫雷游戏的具体代码,供大家参考,具体内容如下 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.GridLayout; import java.awt.Insets; import java.awt.Label; import java.awt.event.ActionEvent; import java.awt.event

  • java实现猜拳游戏

    本文实例为大家分享了java实现猜拳游戏的具体代码,供大家参考,具体内容如下 package com.farsight.session7; import java.util.Scanner; /** * 根据输入的数字,判断数组strs的值 然后进行逻辑判断 */ public class 猜拳 { public static void main(String[] args) { String[] strs = { "石头", "剪刀", "布"

  • Java实现Flappy Bird游戏源码

    本文实例为大家分享了Java实现Flappy Bird游戏的具体代码,供大家参考,具体内容如下 1.首先在mainActivity.xml中放置一个View,ID为viewDraw 2.开始编程,程序中自定义一个View类的子类,与viewDraw关联,程序除了放置如一个view控件,没有其他控件,程序上面的所有图片都是通过控制canvas画图实现 3.游戏是依据flappybird的游戏过程重新写的算法,功能与原版游戏相似,可能有些地方不足,完全是学习练习编程而已,做的不好见谅 4.原图片大小

  • Java版AI五子棋游戏

    本文实例为大家分享了java五子棋游戏的具体代码,供大家参考,具体内容如下 AI思路:通过判断棋盘上每个空位的分数,去分数最高的几个点,随机下棋 分数计算思路:能成5个说明能赢了,给最高分 不能成5个,对方能成5个,说明对方要赢了,给第二高分 能成活4,给第三高分 能成活3,给第四高分 能成冲4,给第五高分 能成冲3,给第六高分 能成活2,给第七高分 能成冲2,给第八高分 其他,给最低分 分数设定可自己定义. 因为是去年写的了,思路记得大概就是这样.最近根据书上写了个棋类游戏的设计框架,待完善后

随机推荐