Java实现升级版布谷鸟闯关游戏的示例代码
前言
《布谷鸟闯关-升级版》是一个基于java的布谷鸟闯关游戏,鼠标左键点击控制鸟的位置穿过管道间的缝隙,需要做碰撞检测,监听键盘事件,背景图片的切换,障碍物管道产生时y轴上需要随机位置。
主要设计
1.设计游戏界面,用swing实现
2.设计背景
3.设计移动墙
4.设计布谷鸟
5.设计障碍物
6.设计背景音乐和音效
7.新增用户账号注册登录功能
8.引用mysql数据库,管理用户账号密码和储存排行榜等信息
- 需要提前创建好数据库"game",字符集选“utf8mb4”
- 然后执行mysql表结构和初始化数据脚本
- 修改代码里的DBUtils的参数值
9.新增游戏商城模块
10.新增排行榜模块
功能截图
用户注册:
游戏欢迎界面:
游戏开始界面:
鼠标左键点击控制鸟的位置穿过管道间的缝隙
代码实现
游戏启动类
//开始界面 public class frame extends JFrame { private JPanel pane; public static frame frame; public frame(){ this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(240,150); ImageIcon backGround = new ImageIcon("images/frame.png"); JLabel bkgImage = new JLabel(backGround); bkgImage.setSize(240,150); bkgImage.setLocation(0,0); JPanel bkgPanel = (JPanel) this.getContentPane(); bkgPanel.setOpaque(false); //注册按钮 JButton button_regist =new JButton("注册"); button_regist.setBounds(30,40, 60,30); bkgPanel.add(button_regist); button_regist.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ new frame_regist().setVisible(true); } }); //登录按钮 JButton button_log=new JButton("登录"); button_log.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ new frame_log(frame).setVisible(true); } }); button_log.setBounds(130,40, 60, 30); bkgPanel.add(button_log); this.getContentPane().add(bkgImage); } //弹出显示传入String的提示框 public static void frame_warning(String warning) { JFrame frame=new JFrame(); JPanel pane=new JPanel(); frame.setBounds(540, 360, 300, 150); frame.setContentPane(pane); pane.setBorder(new EmptyBorder(5, 5, 5, 5)); pane.setLayout(null); JLabel label_warning=new JLabel(warning); label_warning.setBounds(50,20,150,50); pane.add(label_warning); JButton button_yes = new JButton("确定"); button_yes.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { frame.setVisible(false); } }); button_yes.setBounds(80, 80, 93, 23); pane.add(button_yes); frame.setVisible(true); } public static void main(String[] args){ frame =new frame(); frame.setLocationRelativeTo(null); frame.setVisible(true); } /** * */ }
核心类
import static java.lang.Thread.sleep; public class GameplayingFrame extends JFrame{ private static final long serialVersionUID = 1L; user_inf user; MainFrame mainframe; List<rank_information> rfs; Graphics g=this.getGraphics(); GameplayingFrame(user_inf user,List<rank_information> rfs,MainFrame mainframe) { this.mainframe=mainframe; this.rfs=rfs; this.user=user; this.setTitle("Fly Bird"); this.setSize(Constant.Frame_Width,Constant.Frame_Height); this.setResizable(false); this.setLocationRelativeTo(null); this.setVisible(true); Scene stage = new Scene(user); Graphics g = this.getGraphics(); ImageIcon backGround = new ImageIcon("images/bg_day.png"); JLabel bkgImage = new JLabel(backGround); bkgImage.setSize(288,512); bkgImage.setLocation(0,0); JPanel bkgPanel = (JPanel) this.getContentPane(); bkgPanel.setOpaque(false); this.getContentPane().add(bkgImage); //为界面加入鼠标的响应事件 this.addMouseListener(new MouseListener(){ @Override public void mouseReleased(MouseEvent e) {} @Override public void mousePressed(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseClicked(MouseEvent e) { stage.speed_y=-175; } }); JLabel scoreText = new JLabel(); Font font = new Font(Font.SERIF, Font.ITALIC, 30); scoreText.setFont(font); scoreText.setText(String.valueOf(0)); this.setLayout(null); scoreText.setBounds(129,0,30,30); this.add(scoreText); //添加一个线程对象,用于重复绘图,来节约主线程的资源,使游戏运行更加流畅 new Thread(new playingThread(stage,g,this,user,rfs,mainframe)).start(); } } /* * 场景类,包含了游戏界面的物品以及游戏实现的算法 */ class Scene{ //后缀_x/_y表示横/纵坐标,窗口左上角为原点 public final int bird_x = 88; //重力加速度 public final int G = 300; public double bird_y; public double birdRadius; //速度——正值为向下,负值为向上 public int speed_x; public int speed_y; private Ground land= new Ground(GameUtil.toBufferedImage(GameUtil.getImage("ioo/land.png"))); BufferedImage back= GameUtil.toBufferedImage(GameUtil.getImage("ioo/bg_day.png")) ; Barrier barrier; Barrier barrier1; Ground ground; FlyingBird bird=null; Scene(user_inf user){ bird_y = 200; bird=new FlyingBird(bird_x,bird_y,user); birdRadius = 22; speed_x = 3; speed_y = 0; ground = new Ground(GameUtil.toBufferedImage(GameUtil.getImage("ioo/land.png"))); barrier= new Barrier(GameUtil.toBufferedImage(GameUtil.getImage("ioo/pipe_down1.png"))); barrier1= new Barrier(GameUtil.toBufferedImage(GameUtil.getImage("ioo/pipe_down.png"))); } //返回true是游戏已经结束,返回false表示游戏继续进行 boolean ifGameOver(){ //碰到地面 if(bird_y + birdRadius > 512 - ground.getHeight()){ System.out.println("hit ground"); return true; } //碰到顶 if(bird_y - birdRadius < 0){ System.out.println("hit sky"); return true; } //未过左边界时 if(bird_x + birdRadius <= barrier.location_x){ return false; } //接近左边界时 if(bird_x + birdRadius > barrier.location_x && bird_x < barrier.location_x){ if(bird_y < barrier.topHeight || bird_y + birdRadius*0.7 > 512 - barrier.bottomHeight){ System.out.println("hit left edge"); return true; } return false; } //通过管道时 if(bird_x >= barrier.location_x && bird_x < barrier.location_x + barrier.width){ boolean y1 = bird_y + birdRadius > 512 - barrier.bottomHeight; boolean y2 = bird_y <barrier.topHeight; if(y1 || y2){ System.out.println("hit inside"); } return y1 || y2; } //已通过管道 if(bird_x >= barrier.location_x + barrier.width){ return false; } return false; } //ifGameOver=false时才执行 boolean ifGetScore(){ return bird_x + birdRadius > barrier.location_x; } //第二次之后的绘图 public void drawItems(Graphics g){ //鸟 bird.draw(g); //下障碍物 g.drawImage(barrier.img, barrier.location_x, 512 - barrier.bottomHeight,33,barrier.bottomHeight, null); //上障碍物 g.drawImage(barrier1.img,barrier.location_x, 0,33,barrier.topHeight, null); //地面 g.drawImage(ground.getBufferedImage(),0,512-30, null); ground.checkGround(); barrier.checkBarrier(); } //更新各个物体的位置(每秒30次) public void itemMove() { //计算鸟的速度 speed_y += G*0.033; //鸟最大的向下速度为220 if(speed_y > 220){ speed_y = 220; } //计算鸟的纵坐标 bird_y += speed_y*0.033; bird.y=bird_y; //计算障碍物和地面的横坐标 barrier.location_x -= speed_x; ground.setX(ground.getX()-speed_x); } //变速方法,根据分数调整速度 public void shift(int score){ if(score < 1) { speed_x = 3; } else if (score < 100){ speed_x = 4; } else if (score < 200){ speed_x = 5; } else if (score < 300){ speed_x = 6; } else if (score < 400){ speed_x = 7; } else if (score < 500){ speed_x = 8; } else speed_x = 9; } }
线程类用于重复绘图
public class playingThread implements Runnable { Scene stage; private Image iBuffer; private Graphics gBuffer; List<rank_information> rfs; user_inf user; MainFrame mainframe; Graphics g ; GameplayingFrame playingframe ; public static boolean flag = true;//控制计分板的变量 public int score = 0;//分数 playingThread(Scene stage,Graphics g,GameplayingFrame playingframe ,user_inf user,List<rank_information> rfs,MainFrame mainframe) { this.mainframe=mainframe; this.rfs=rfs; this.user=user; this.stage=stage; this.g=g; this.playingframe=playingframe; } @Override public void run() { while (!stage.ifGameOver()){ stage.drawItems(g);//绘画 stage.itemMove();//物体移动 //33ms刷新一次 try { sleep(33); } catch (InterruptedException e) { e.printStackTrace(); } if(stage.ifGetScore()){ score++; } stage.shift(score); //playingframe.update(g); //清除上一次绘画结果 //双缓冲方法清除上一次绘画结果 if (iBuffer == null){ iBuffer = playingframe.createImage(playingframe.getSize().width,playingframe.getSize().height); gBuffer = iBuffer.getGraphics(); } playingframe.paint(gBuffer); g.drawImage(iBuffer,0,0,null); // stage.drawItems(g);//再绘画 } user.setCoin(user.getCoin()+score); new user_dao().update(user); playingframe.setVisible(false); rank_information rf=new rank_information(); rf.setScore(score); rf.setName(user.getUser_name()); rfs.add(rf); new rank_dao().update_rank(rfs); new resultFrame(score,user,rfs,mainframe); System.out.println("game over"); } }
总结
通过此次的《布谷鸟闯关-升级版》实现,让我对JAVA的相关知识有了进一步的了解,对java这门语言也有了比以前更深刻的认识。
java的一些基本语法,比如数据类型、运算符、程序流程控制和数组等,理解更加透彻。java最核心的核心就是面向对象思想,对于这一个概念,终于悟到了一些。
以上就是Java实现升级版布谷鸟闯关游戏的示例代码的详细内容,更多关于Java布谷鸟闯关游戏的资料请关注猪先飞其它相关文章!
原文出处:https://juejin.cn/post/7069294504150302727
相关文章
- 这篇文章主要介绍了如何利用java语言实现经典《复杂迷宫》游戏,文中采用了swing技术进行了界面化处理,感兴趣的小伙伴可以动手试一试...2022-02-01
java 运行报错has been compiled by a more recent version of the Java Runtime
java 运行报错has been compiled by a more recent version of the Java Runtime (class file version 54.0)...2021-04-01- 这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了教你怎么用Java获取国家法定节假日,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-23
- 这篇文章主要介绍了Java如何发起http请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-31
- 说起C#和Java这两门语言(语法,数据类型 等),个人以为,大概有90%以上的相似,甚至可以认为几乎一样。但是在工作中,我也发现了一些细微的差别...2020-06-25
- 这篇文章主要介绍了解决Java处理HTTP请求超时的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-29
- 这篇文章主要介绍了java 判断两个时间段是否重叠的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
java 画pdf用itext调整表格宽度、自定义各个列宽的方法
这篇文章主要介绍了java 画pdf用itext调整表格宽度、自定义各个列宽的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-31- 这篇文章主要介绍了超简洁java实现双色球若干注随机号码生成(实例代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-02
- 这篇文章主要介绍了Java生成随机姓名、性别和年龄的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-01
- 这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
Java使用ScriptEngine动态执行代码(附Java几种动态执行代码比较)
这篇文章主要介绍了Java使用ScriptEngine动态执行代码,并且分享Java几种动态执行代码比较,需要的朋友可以参考下...2021-04-15- 这篇文章主要介绍了Java开发实现人机猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-03
- 这篇文章主要介绍了Java List集合返回值去掉中括号('[ ]')的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-29
Java 8 Stream 的终极技巧——Collectors 功能与操作方法详解
这篇文章主要介绍了Java 8 Stream Collectors 功能与操作方法,结合实例形式详细分析了Java 8 Stream Collectors 功能、操作方法及相关注意事项,需要的朋友可以参考下...2020-05-20Java中lombok的@Builder注解的解析与简单使用详解
这篇文章主要介绍了Java中lombok的@Builder注解的解析与简单使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-01-06- 下面小编就为大家带来一篇java中String类型变量的赋值问题介绍。小编觉得挺不错的。现在分享给大家,给大家一个参考。...2016-03-28
- 这篇文章主要介绍了Java线程池中的各个参数如何合理设置操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-19
- 这篇文章主要介绍了详解Java后端优雅验证参数合法性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-18