前言

嘛,这次是用java编写的Flappy bird,主要是本人最近新学习了多线程的使用,想试试手,变想出来做一个flappy bird的游戏,做出来后的大致效果还行吧2333但也需要进一步改进,还得多搞点事情

使用到的类

这一次使用了比较多的类,算下来好像10个(?)主要是对主要的部分都进行了一定程度的封装,虽然数量多了些,但代码更加清晰了,还算挺划算的

代码

话不多说,直接上代码吧(说太多也不知道有没有人看2333)

zhu类
因为Flappy bird 里面有障碍物,这里是用这个类来记录柱子的长度,并且在这里面执行后续话柱子的操作

public class zhu {int lenth;zhanai za;public zhu(int lenth,zhanai za){this.lenth=lenth;this.za=za;}public int draw(Graphics g,int width,int high,int n,int i,zhu zu){System.out.println("Next");ImageIcon ol = new ImageIcon("c:\\Users\\lenovo\\Desktop\\Flappy bird\\下柱.png");Image ii = ol.getImage();g.drawImage(ii, width / 4 * (i + 1) - n, high - zu.lenth - 18, 30, zu.lenth, null);ol = new ImageIcon("c:\\Users\\lenovo\\Desktop\\Flappy bird\\上柱.png");ii = ol.getImage();g.drawImage(ii, width / 4 * (i + 1) - n, 0, 30, (high) * 2/3 - zu.lenth, null);for(int x=Math.max(width / 4 * (i + 1) - n,0);x<Math.min(width / 4 * (i + 1) - n+30,width);x++){for(int y=high - zu.lenth - 18;y<high-18;y++)za.tu[x][y]=1;for(int y=0;y<(high) * 2/3 - zu.lenth;y++)za.tu[x][y]=1;}return 0;}}

bird类
这个类就是对鸟的位置的一个确定,并在该类中画鸟和确定游戏是否结束。

public class Bird {int x;int y;int width, high;int zen = 0;newzhu k1;ClearScreen k2;JButton bu1;zhanai za;public Bird(int x, int y, JButton bu1, zhanai za, int width, int high) {this.x = x;this.y = y;this.width = width;this.high = high;this.bu1 = bu1;this.za = za;}public void draw(Graphics g) {y++;if (zen > 0) {y -= 4;zen--;}ImageIcon ol = new ImageIcon("c:\\Users\\lenovo\\Desktop\\Flappy bird\\鸟.png");Image ii = ol.getImage();g.drawImage(ii, x, y, 30, 30, null);for (int i = x; i < x + 30; i++)for (int j = y; j < y + 30; j++) {if (za.tu[i][j] == 1) {k1.change();k2.change();bu1.setText("游戏结束");BufferedImage bi = new BufferedImage(width, high, BufferedImage.TYPE_INT_ARGB);Graphics g2 = bi.getGraphics();ol = new ImageIcon("c:\\Users\\lenovo\\Desktop\\Flappy bird\\游戏结束.png");ii = ol.getImage();g2.drawImage(ii, 0, 0, width, high, null);g.drawImage(bi,350,100,width-700,high-200,null);return;}}}
}

Back类
这个就是用来画背景的,天空和陆地啥的,这样每次调用就比较方便

public class Back {Bird niao;public void draw(Graphics g,int width,int high,int n1){ImageIcon ol = new ImageIcon("c:\\Users\\lenovo\\Desktop\\Flappy bird\\背景.jpg");Image ii = ol.getImage();g.drawImage(ii, 0, 0, width, high, null);ol = new ImageIcon("c:\\Users\\lenovo\\Desktop\\Flappy bird\\陆地.png");ii = ol.getImage();g.drawImage(ii, -n1, high - 18, width + width / 4 * 3, 40, null);}public void csh(Graphics g,int width,int high,Bird niao){ImageIcon ol = new ImageIcon("c:\\Users\\lenovo\\Desktop\\Flappy bird\\背景.jpg");//加背景;Image ii = ol.getImage();g.drawImage(ii, 0, 0, width, high, null);this.niao=niao;niao.draw(g);}
}

UI类
这个就是这个程序的启动的地方了,就是对界面的一个初始化的类。

public class UI {Graphics g;int width = 1000, high = 400;JFrame k = new JFrame();JPanel j1 = new JPanel();JPanel j2 = new JPanel();JButton bu1 = new JButton("开始");public void show() {k.setSize(width, high);k.setLocationRelativeTo(null);k.add(j1, BorderLayout.CENTER);//中心画布k.add(j2, BorderLayout.NORTH);j2.add(bu1);k.setVisible(true);g = j1.getGraphics();zhanai za=new zhanai(width,high-90);//识别柱子Bird niao=new Bird(width/2,high/2-45,bu1,za,width,high-90);//鸟Back bg=new Back();bg.csh(g, width, high-90, niao);//初始化mouslis mou=new mouslis(niao);j1.addMouseListener(mou);java.util.ArrayList<zhu> kk = new java.util.ArrayList<zhu>();ButtonLis u1 = new ButtonLis(high - 90, width, g, kk,bu1,niao,j2,za);bu1.addActionListener(u1);//按钮监听器}public static void main(String[] args) {UI wor = new UI();wor.show();}
}

ButtonLis类
给按钮加的一个监听器,按下开始后游戏开始,游戏结束后点击则恢复到开始界面。

public class ButtonLis implements ActionListener {int high, width;Graphics g;JButton bu1, bu2 = new JButton();int flag = 0;java.util.ArrayList<zhu> kk = new java.util.ArrayList<zhu>();newzhu k1;ClearScreen k2;Bird niao;JPanel j2;zhanai za;int ci = 0;public ButtonLis(int high, int width, Graphics g, java.util.ArrayList<zhu> kk, JButton bu1, Bird niao, JPanel j2,zhanai za) {this.j2 = j2;this.za = za;j2.add(bu2);this.high = high;this.width = width;this.g = g;this.kk = kk;this.bu1 = bu1;k1 = new newzhu(kk, high, za);this.niao = niao;k2 = new ClearScreen(g, width, high, kk, niao, bu2, za);k2.csh();niao.k1 = k1;niao.k2 = k2;// 使鸟的位置可以控制游戏的结束与否}public void actionPerformed(ActionEvent e) {if (flag == 0) {bu2.setText("0");k1.change();k2.change();if (ci == 0) {k1.start();k2.start();}ci++;flag++;bu1.setText("暂停");} else if (flag % 2 == 1) {bu1.setText("继续");flag++;k1.change();k2.change();} else if (flag % 2 == 0) {bu1.setText("暂停");flag++;k1.change();k2.change();}String c1 = e.getActionCommand();if (c1.equals("游戏结束")) {flag = 0;k2.csh();k1.csh();za.csh();niao.y = high / 2;bu1.setText("开始");bu2.setText("0");Back bg=new Back();bg.csh(g, width, high, niao);}}
}

ClearScreen类
绘图函数,主要就是实时绘制,从而使画面更新,(丝般顺滑),这里为了解决屏幕老是乱闪的问题,还用了BufferImage,顺利搞定~这里是第一个线程

public class ClearScreen extends Thread {Graphics g2;int width, high;int qi;int score=0;boolean flag=false;java.util.ArrayList<zhu> k = new java.util.ArrayList<zhu>();Bird niao;JButton bu2=new JButton();zhanai za;int n = -width / 4 * 3;int n2= -width / 4; int n1 = 0, ci = 0;public ClearScreen(Graphics g, int width, int high, java.util.ArrayList<zhu> k,Bird niao,JButton bu2,zhanai za) {this.g2 = g;this.width = width;this.high = high;this.k = k;this.niao=niao;this.za=za;this.bu2=bu2;}public void csh(){n = -width / 4 * 3;n2= -width / 4; n1 = 0;ci = 0;flag=false;score=0;}public void run() {while (true) {String s=""+score;bu2.setText(s);BufferedImage bi = new BufferedImage(width, high, BufferedImage.TYPE_INT_ARGB);Graphics g = bi.getGraphics();try {Thread.sleep(3);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}if (flag == true) {ci++;Back jj = new Back();jj.draw(g, width, high, n1);za.csh();//绘图前清空for (int i = 0; i < k.size() && i <= 4; i++) {zhu zu = k.get(i);zu.draw(g, width, high, n, i, zu);//画出柱子并且加上标记}if (n >= width / 4)// 柱子动{k.remove(0);n = 0;}if(n2>=width/4){n2=0;score++;music df=new music(1);df.start();}if (n1 >= width / 4)// 陆地动n1 = 0;if (ci >= 11) {n += 10;n1 += 10;n2+=10;ci = 0;}niao.draw(g);g2.drawImage(bi, 0, 0, width, high, null);// 整个画上去;}}}public void change(){flag=!flag;}
}

newzhu类
创建新的柱子加到队列中,使其可以顺利的继续下去,这是第二个线程。

public class newzhu extends Thread {// 添加新柱子private java.util.ArrayList<zhu> k;int high;boolean flag=false;zhanai za;public newzhu(java.util.ArrayList<zhu> k, int high,zhanai za) {this.k = k;this.high = high;this.za=za;}public void csh(){flag=false;}public void run() {while (true) {int lenth = (int) (Math.random() * high / 2) + 10;zhu zz = new zhu(lenth,za);if(flag==true)k.add(zz);try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public void change(){flag=!flag;}
}

mouslis类
这个类主要是作为鼠标监听器使用,每次点击使鸟向上飞一段距离,完成跳跃的效果。

public class mouslis implements MouseListener,MouseMotionListener{Bird niao;public mouslis(Bird niao){this.niao=niao;}public void mouseClicked(MouseEvent e){}public void mousePressed(MouseEvent e){//music fly=new music(2);niao.zen+=20;//    fly.start();}public void mouseReleased(MouseEvent e){niao.zen=0;}public void mouseEntered(MouseEvent e){}public void mouseExited(MouseEvent e){}public void mouseDragged(MouseEvent e){}public void mouseMoved(MouseEvent e){}
}

zhanai类
这个类用来存个二维数组,从而来判定是否出现了碰撞。

public class zhanai {int width, high;int[][] tu = new int[2000][2000];// 储存当前的障碍public zhanai(int width,int high){this.high=high;this.width=width;}public void csh()// 初始化{for (int i = 0; i <= width; i++) {for (int j = 0; j <= high; j++) {tu[i][j]=0;}tu[i][0] = tu[i][high - 18] = 1;}}
}

music类
顾名思义,放音乐用的~

public class music extends Thread{int n;File f = new File("c:\\Users\\lenovo\\Desktop\\Flappy bird\\fly.wav");File f2 = new File("c:\\Users\\lenovo\\Desktop\\Flappy bird\\得分.wav");URL sy;public music(int n){this.n=n;}public void run(){if(n==1)this.df();if(n==2)this.fly();}private void fly() {try {sy = f.toURL();AudioClip aau;aau = Applet.newAudioClip(sy);// 播放声音文件aau.play();try {Thread.sleep(500);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}aau.stop();} catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}private void df() {try {sy = f2.toURL();AudioClip aau;aau = Applet.newAudioClip(sy);// 播放声音文件aau.play();try {Thread.sleep(2000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}aau.stop();} catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

和之前的国际跳棋不大同,这次算是我做的第一个灵活性较高的游戏了,下一步准备继续玩些大的23333

Flappy bird相关推荐

  1. 人形图案c语言程序_做游戏,学编程(C语言) 7 学习EasyX图形交互功能----flappy bird源代码...

    经过之前的学习,我们基本掌握了开发小游戏所需要的语法知识和搭建方法,但是基础C语言的可视化与交互功能实在是太弱了 . 利用免费的EasyX插件,我们可以快速上手,简单实现很酷的视觉效果 . EasyX ...

  2. 一步步分析AI如何玩Flappy Bird

    一.Flappy Bird 游戏展示 在介绍模型.算法前先来直接看下效果,上图是刚开始训练的时候,画面中的小鸟就像无头苍蝇一样乱飞,下图展示的是在本机(后面会给出配置)训练超过10小时后(训练步数超过 ...

  3. flappy bird游戏源代码揭秘和下载后续---移植到android真机上

    前言:         上一篇博客 flappy bird游戏源代码揭秘和下载,源码是运行在window或者mac系统上的,现在我们需要把代码移植到android真机上,让小鸟在手机里飞起来! ps: ...

  4. 【Unity3D基础教程】给初学者看的Unity教程(四):通过制作Flappy Bird了解Native 2D中的RigidBody2D和Collider2D...

    作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 在第一篇文章[Unity3D基础教程] ...

  5. 【教程】HTML5+JavaScript编写flappy bird

         作者: 风小锐      新浪微博ID:永远de风小锐      QQ:547953539      转载请注明出处 PS:新修复了两个bug,已下载代码的同学请查看一下 大学立即要毕业了. ...

  6. 下坠的小鸟(flappy bird)速算版

    下坠的小鸟速算版是根据著名的像素鸟(flappy bird)改编而成的一款运行在pc web上的游戏,它跟传统的玩法稍有不同,你必须时刻计算当前数字的倍数,以便为通过下一个数字缺口做准备,而不仅仅只是 ...

  7. Flappy bird需求规格说明书

    1.引言     1.1.编写目的 该需求分析为说明书通过对<flappy bird>游戏软件的客户需求分析,明确了所要开发的游戏软件的功能以及界面等的处理,从而使小组成员更清楚的了解用户 ...

  8. 【玩转cocos2d-x之三十六】Flappy Bird大集结

    前几天看到cocos2d-x官网论坛让各种姿势的flappy bird霸占了,矮油真受不鸟,你们够啦!!! 今天准备用一个贴来 秒杀 你们.准备好了么...放图镇楼: 1.C++版 先来个传统版,@O ...

  9. c语言图形库三角形,Flappy Bird C语言实现及C图形库Easyx的使用

    学习Eaxy X图形库后我的成果: 花了一周时间做出并完善了Flappy Bird,目前功能如下: 1. 背景的显示 2. 加入小鸟image 3. 小鸟自由下落,按空格键/鼠标右键后上升 4. 加入 ...

  10. 详解用65行javascript代码做Flappy Bird

    点击查看特效 JavaScript做Flappy Bird游戏,代码仅仅65行 资源包括: javascript源码:phaser.min.js:main.js:index.html 素材:两张图片! ...

最新文章

  1. pyhon 数据类型转换函数
  2. JS window事件全集解析
  3. sql server compact
  4. 手机客户端连接linux
  5. 入门篇|学渣是如何自学数据结构的?
  6. python numpy数组切片_python中numpy数组切片实验解释
  7. Kubernetes详解(九)——资源配置清单创建Pod实战
  8. oracle alter database close,alter database close
  9. js动态填充select
  10. 红外图像动态范围压缩和对比度增强
  11. 【Android】ActivityManager的介绍
  12. 基础学习——MySQL基础
  13. 推荐6个实用的Vue模板
  14. 电脑键盘为什么无法输入
  15. [Mac软件推荐] paste - 好用的剪切板记录增强工具
  16. 深入浅出强化学习:原理入门(待更新)
  17. (Modern Family S01E03) Part 1  PhilClaire  Phil看球赛 Dylan等Haley Clarie说Phil现在依然和Jay呆在一起很不自在
  18. 爱快软路由设置DHCP多个LAN处于同一网段
  19. 圣地亚哥分校 计算机,美国加州大学圣地亚哥分校计算机科学专业.pdf
  20. Python学习(六)——格式化输出

热门文章

  1. Django项目nginx+gunicorn 部署
  2. 线性代数笔记【空间向量】
  3. linux网络驱动 poll,网络 – Linux网络驱动程序中的并发:probe()VS ndo_open(),ndo_start_xmit()VS NAPI poll()...
  4. 比较简单的单间租房协议!
  5. [转]爬虫的现状和反爬虫
  6. 安利一个简单实用的小技巧:图片怎么批量改尺寸
  7. 判断手机是否有虚拟键盘
  8. AI吻合度100%,某业余6段棋手吊打围甲7段,疑似AI附体-0
  9. 数据结构课程设计——电话号码查询系统(C语言)
  10. 计算机网络(自顶向下方法)读书笔记----吐血整理