时间:2020-10-28 17:14:10 | 栏目:JAVA代码 | 点击:次
本文实例为大家分享了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();//游戏开始 } }
程序截图: