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布谷鸟闯关游戏的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java实现经典游戏推箱子的示例代码

    目录 前言 主要设计 功能截图 代码实现 核心类 声音播放类 总结 前言 <推箱子>推箱子是一个古老的游戏,目的是在训练你的逻辑思考能力.在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务. 游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 控制搬运工上下左右移动,来将箱子推到指定地点 主要设计 1.游戏面板生成显示

  • java实现Flappy Bird游戏源代码

    本文实例为大家分享了java实现Flappy Bird游戏的具体代码,供大家参考,具体内容如下 /* 2017/7/23 */ import java.awt.Graphics; //import java.util.Timer; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseListener; import java.awt.event.Mo

  • Java实现经典游戏Flappy Bird的示例代码

    目录 前言 主要设计 功能截图 代码实现 游戏启动类 核心类 工具类 总结 前言 <布谷鸟闯关-简单版>是一个基于java的布谷鸟闯关游戏,摁上键控制鸟的位置穿过管道间的缝隙,需要做碰撞检测,监听键盘事件,背景图片的切换,障碍物管道产生时y轴上需要随机位置. 主要设计 设计游戏界面,用swing实现 设计背景 设计移动墙 设计布谷鸟 设计障碍物 设计背景音乐和音效 由几个关键的布尔类型变量start,crash,over是产生键键盘事件时用来控制界面显示的弹框的 操作:空格键开始游戏,ente

  • 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

  • Java实现Flappy Bird游戏源码

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

  • Java实现Android拼图游戏设计过程解析

    目录 1.项目介绍 2.项目原理 3.项目设计 4.项目实现 5.获取布局 6.准备图片 7.初始化item 8.游戏图片的切换 9.游戏胜利的判断 10.游戏封面 1.项目介绍 这是一款基于 Java 开发的移动端安卓小游戏——大家来拼图 2.项目原理 把选定的一张图片切分很多份,先是 33 格式,在一定的时间内点击格子交换使图形拼成一张完整的图片就算闯关成功,这样关卡也很容易设计,33:44:55:6*6: 3.项目设计 我们需要一个容器,可以放这些图片的块块,为了方便,我们准备使用Rela

  • Java实现升级版布谷鸟闯关游戏的示例代码

    目录 前言 主要设计 功能截图 代码实现 游戏启动类 核心类 线程类用于重复绘图 总结 前言 <布谷鸟闯关-升级版>是一个基于java的布谷鸟闯关游戏,鼠标左键点击控制鸟的位置穿过管道间的缝隙,需要做碰撞检测,监听键盘事件,背景图片的切换,障碍物管道产生时y轴上需要随机位置. 主要设计 1.设计游戏界面,用swing实现 2.设计背景 3.设计移动墙 4.设计布谷鸟 5.设计障碍物 6.设计背景音乐和音效 7.新增用户账号注册登录功能 8.引用mysql数据库,管理用户账号密码和储存排行榜等信

  • Java实现经典拳皇误闯冒险岛游戏的示例代码

    目录 前言 主要设计 功能截图 代码实现 游戏主界面 英雄 总结 前言 <拳皇误闯冒险岛>是拳皇和冒险岛素材的基于JavaSwing的动作类游戏,独创改编. 主要需求 拳皇迷迷糊糊醒来,发现自己在一间废弃的工厂里,地上爬满怪兽..这么可爱的怪兽,一拳下去,应该会哭很久吧~拳皇心里吐槽了下,向怪兽的怀抱冲了上去~~ 主要设计 1.游戏面板生成显示 2.背景选用冒险岛素材图 3.设计英雄,包含生命值,法术值,英雄的动作变化处理,英雄的技能特效 4.设计怪兽,包含怪物血量,攻击力,位置,步长等 5.

  • Java实现可视化走迷宫小游戏的示例代码

    目录 效果图 数据层 视图层 控制层 效果图 数据层 本实例需要从 .txt 文件中读取迷宫并绘制,所以先来实现文件读取IO类 MazeData.java,该程序在构造函数运行时将外部文件读入,并完成迷宫各种参数的初始化,注意规定了外部 .txt 文件的第一行两个数字分别代表迷宫的行数和列数.此外还提供了各类接口来读取或操作私有数据. import java.io.BufferedInputStream; import java.io.File; import java.io.FileInput

  • gameboy网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点

    前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. 本文讲描述, 如何在网页端实现一个仿微信的聊天窗口界面, 以及其中涉及到的一些技术点. 作者前端是初学者, 请大拿们轻拍. 效果展示: 这种聊天对话的布局模式, 比PC端QQ的那种聊天方式更贴近移动端, 我个人感觉. 需求设定: 让我们先过一遍, 实现该聊天窗口需要支持的一些功能点. • 聊天消息结构和布局 聊天消息包括: 人物(头像)和

  • Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶

    目录 导语 正文 一.小编有话说 ​二.游戏规则 2.1闯关模式 2.2技能提示 三.游戏素材 3.1像素画风-- 3.2机甲模型-- 3.3冒险闯关 四.环境安装 五.项目代码 5.1加载动画以及音效 5.2初始化地图 5.3关卡动画 5.4玩家角色 5.5敌人死亡删除 5.6 敌方大BOSS 5.7敌方BOSS章鱼怪 5.8敌方BOSS 绿坦克 5.9掉落的血瓶 5.10捡血包 5.11结束类 六.效果展示 总结 导语 大家早上好哈!--有没有想我啊? 木木子来啦,今日上线放一波大招给大家!

  • Python开发之射击闯关游戏的实现

    目录 项目功能 地图编辑器 游戏主运行程序 部分游戏截图 项目功能 地图编辑器:可以实现玩家自己定义每一关卡的样式和难易程度 运行界面:实现了玩家的移动,跳跃,发射子弹,投掷手雷,以及敌人的AL(移动,发射子弹,扔手雷),同时游戏中有一系列的道具(生命值药箱,子弹补给,手雷补给)以及各种动画和音乐音效,还有各种花草岩石装饰品,以及悬崖和水涡危险地方,更多未知,自己体验就能感受到! 总代码累计1100行左右! 地图编辑器 import pygame import sys import csv im

  • Java实现萝卜勇者游戏的示例代码

    目录 前言 主要设计 功能截图 代码实现 启动类 键盘监听 核心算法 总结 前言 <萝卜勇者>是由国内玩家自制的一款独立游戏,玩家扮演萝卜勇士闯关,打败各种邪恶的敌人,获得最后的胜利. <萝卜勇者>游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 参考<萝卜勇者>的剧情,实现JAVA版本的单机游戏. 主要设计 1. 用Swing库做可视化界面 2.键盘监听,用WSAD可以控制光标移动,J是确定,K是取消,游戏中,WSA

  • Java实现泡泡堂对战版游戏的示例代码

    目录 前言 主要设计 功能截图 代码实现 游戏启动类 核心监听类 核心线程类 总结 前言 <泡泡堂II>是一个基于java的自制游戏,使用了MVC模式,分离了模型.视图和控制器,使得项目结构清晰易于扩展,使用配置文件来设置游戏基本配置,扩展地图人物道具等.同时,该程序编写期间用了单例模式.工厂模式.模板模式等设计模式.为了游戏的可玩性,特意设计了平滑碰撞以及机器人. 主要设计 设计游戏界面,用swing实现 绘制游戏启动界面.结束界面.地图.主角.道具 实现泡泡爆炸 为了尽量复原泡泡堂游戏,初

  • JAVA实现经典扫雷游戏的示例代码

    目录 前言 主要设计 功能截图 代码实现 总结 前言 windows自带的游戏<扫雷>是陪伴了无数人的经典游戏,本程序参考<扫雷>的规则进行了简化,用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 1.要有难度等级,初级,中级,高级 2.由玩家逐个翻开方块,以找出所有地雷为最终游戏目标.如果玩家翻开的方块有地雷,则游戏结束 3.游戏主区域由很多个方格组成.使用鼠标左键随机点击一个方格,方格即被打开并显示出方格中的数字:方格中数字则表示其

  • Java+Swing实现五子棋游戏的示例代码

    目录 一.系统介绍 1.开发环境 2.技术选型 3.系统功能 二.系统展示 三.部分代码 AI.java Chess.java Gobang.java GobangListener.java 一.系统介绍 1.开发环境 开发工具:Eclipse2021 JDK版本:jdk1.8 Mysql版本:8.0.13 2.技术选型 Java+Swing 3.系统功能 实现五子棋游戏,开始游戏,悔棋,认输,退出功能. 二.系统展示 1.首页 2.黑棋走 3.白棋走 三.部分代码 AI.java packag

随机推荐