java实现flappyBird游戏

整个游戏由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();//游戏开始
	}

}


程序截图:




转载于:https://www.cnblogs.com/chenny3/p/10226239.html

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值