Java实现经典游戏泡泡堂的示例代码


Posted in Java/Android onApril 04, 2022

前言

《泡泡堂I》是一个基于java的自制游戏,游戏设计为双人pk积分赛模式,在这个模式里面,玩家只要率先达到一定分数既可以赢得比赛。玩家可以通过炸箱子可以得到少量的分数,也可以通过炸掉对手然后戳破包围对手的水泡得到大量分数。而玩家如果被泡泡爆炸击中,会被泡泡包裹一段时间,在这段时间内不可以移动和放泡泡,需要等时间过去或者被对手戳破水泡才能获得自由。但如果玩家被自己放的泡泡炸中,会扣一定的分数。

主要设计

  • 设计游戏界面,用swing实现
  • 绘制游戏启动界面、结束界面、地图、主角、道具
  • 实现泡泡爆炸
  • 实现双主角PK(积分制)
  • 实现道具掉落和相应属性加成
  • 实现游戏音效和背景音乐

功能截图

游戏启动界面:

Java实现经典游戏泡泡堂的示例代码

游戏开始界面:

Java实现经典游戏泡泡堂的示例代码

移动效果:

Java实现经典游戏泡泡堂的示例代码

释放泡泡

Java实现经典游戏泡泡堂的示例代码

泡泡爆炸效果:

Java实现经典游戏泡泡堂的示例代码

代码实现

游戏启动类

public class GameStart {
    public static void main(String[] args) {

        //整个程序的入口 启动
        StartFrame startFrame = new StartFrame();
        startFrame.setVisible(true);
    }
}

核心监听类

public class GameListener implements KeyListener {
	private List<?> list;
	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
	}
	//按下 左37 右39 下40 上38 w87 a65 s83 d68 空格32 enter10
	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
		//System.out.println("keypressed"+e.getKeyCode());
		list = ElementManager.getInstance().getElementList("play");
		Player oneplayer = (Player)list.get(0);
		Player twoPlayer = (Player)list.get(1);
		switch (e.getKeyCode()) {
		case 65:
			oneplayer.setLEFT(true);
//			oneplayer.setStop(false);
			break;
		case 87:
			oneplayer.setUP(true);
//			oneplayer.setStop(false);
			break;
		case 68:
			oneplayer.setRIGHT(true);
//			oneplayer.setStop(false);
			break;
		case 83:
			oneplayer.setDOWN(true);
//			oneplayer.setStop(false);
			break;
		case 32:
			oneplayer.setPk(true);
			break;
		case 37:
			twoPlayer.setLEFT(true);
			break;
		case 38:
			twoPlayer.setUP(true);
			break;
		case 39:
			twoPlayer.setRIGHT(true);
			break;
		case 40:
			twoPlayer.setDOWN(true);
			break;
		case 10:
			twoPlayer.setPk(true);
			break;
		}
	}
	//松开
	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub
		//System.out.println("keyreleased"+e.getKeyCode());
		list = ElementManager.getInstance().getElementList("play");
		Player oneplayer = (Player)list.get(0);
		Player twoPlayer = (Player)list.get(1);
		switch (e.getKeyCode()) {
		case 65:
//			if (oneplayer.isLEFT()) {
//				oneplayer.setStop(true);
//			}
			oneplayer.setLEFT(false);
			
			break;
		case 87:
//			if (oneplayer.isUP()) {
//				oneplayer.setStop(true);
//			}
			oneplayer.setUP(false);
			break;
		case 68:
//			if (oneplayer.isRIGHT()) {
//				oneplayer.setStop(true);
//			}
			oneplayer.setRIGHT(false);
			break;
		case 83:
//			if (oneplayer.isDOWN()) {
//				oneplayer.setStop(true);
//			}
			oneplayer.setDOWN(false);
			break;	
		case 32:
			oneplayer.setPk(false);
			break;
		case 37:
			twoPlayer.setLEFT(false);
			break;
		case 38:
			twoPlayer.setUP(false);
			break;
		case 39:
			twoPlayer.setRIGHT(false);
			break;
		case 40:
			twoPlayer.setDOWN(false);
			break;	
		case 10:
			twoPlayer.setPk(false);
			break;
		}
	}
}

核心线程类

public class GameThread extends Thread{
	//计时数据
	private static int time ;
	private boolean flag=true;
	//重构老项目
	@Override
	public void run() {
		//这个循环控制游戏整体进度
//		while(flag){
			// 死循环 状态变量进行控制
			//1.加载地图 人物
			loadElement();
			//2.显示地图人物(流程 自动化(移动,碰撞))
			time = 0;
			loadBGM();
			runGame();
			//3.结束地图



			try {
				TimeUnit.MILLISECONDS.sleep(150);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
//		}
	}
	//控制进度 但是作为控制 请不要接触load 只能通过元素管理器访问元素
	public void loadElement(){
		ElementManager.getInstance().load();
	}
	public void runGame(){
		//这个循环控制每个关卡 地图中玩的状态
		ElementManager manager = ElementManager.getInstance();
		while(flag){

			Map<String, List<SuperElement> > map = manager.getMap();
			Set<String> set = map.keySet();
			List<String> temp = new ArrayList<>();
			temp.addAll(set);
			//迭代器在遍历的过程中,迭代器中的元素不可以变化(增加或减少)
			for (int i=temp.size()-1; i>=0 ; i--) {
				List<SuperElement> list = map.get(temp.get(i));
				for (int j = 0; j < list.size(); j++) {
					SuperElement superElement = list.get(j);
					superElement.update();
					if (!superElement.isVisible()) {
						manager.removeElementByPx(superElement.getY(), superElement.getX());
						list.remove(j);

					}
				}
			}
			//使用一个独立的方法来进行判定
			PK();

			//游戏的流程控制
			linkGame();


			try {
				TimeUnit.MILLISECONDS.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			//死亡 通关状态 结束runGame方法
			overGame();


			time++; //一秒钟增加10
		}
	}

	public void PK() {
		// TODO Auto-generated method stub
		List<SuperElement> players = ElementManager.getInstance().getElementList("play");
		List<SuperElement> enemys = ElementManager.getInstance().getElementList("enemylist");
		//进行比较
		listPK(players, enemys);
	}
	public void listPK(List<SuperElement> list1,List<SuperElement> list2){
		for (int i = 0; i < list1.size(); i++) {
			for (int j = 0; j < list2.size(); j++) {
				if (list1.get(i).gamePK(list2.get(j))) {
					list2.get(j).setVisible(false);

				}
			}
		}
	}
	public void overGame(){
		Player player1 = (Player)(ElementManager.getInstance().getElementList("play").get(0));
		Player player2 = (Player)(ElementManager.getInstance().getElementList("play").get(1));
		if(player1.getNum()>=1000||player2.getNum()>=1000) {
			flag = false;
			new Thread() {
				public void run() {
					new audioPlay(Audio.OVER).player();
				}
			}.start();
		}

	}
	//游戏的流程控制
	public void linkGame(){
//		Map< String , List<SuperElement> > map =
//				ElementManager.getInstance().getMap();
//		List<SuperElement> enemys = map.get("enemylist");
//		//一秒钟增加一个敌机
//		if (time%10 == 0) {
//			enemys.add(Enemy.createEnemy(""));
//		}
		ElementManager.getInstance().linkGame(time);
	}
	public static int getTime() {
		return time;
	}
	public static void setTime(int time) {
		GameThread.time = time;
	}

	private void loadBGM() {
		new Thread() {
			public void run() {
				while(flag) {
					audioPlay play = new audioPlay(Audio.BGM);
					play.player();
					if(!flag) {
						play.stop();
					}
				}

			}
		}.start();

	}
	//敌机的创建
	
	
}

总结

通过此次的《泡泡堂I》实现,让我对JAVA的相关知识有了进一步的了解,对java这门语言也有了比以前更深刻的认识。

java的一些基本语法,比如数据类型、运算符、程序流程控制和数组等,理解更加透彻。java最核心的核心就是面向对象思想,对于这一个概念,终于悟到了一些。

到此这篇关于Java实现经典游戏泡泡堂的示例代码的文章就介绍到这了,更多相关Java泡泡堂内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Java/Android 相关文章推荐
解决SpringBoot跨域的三种方式
Jun 26 Java/Android
SpringBoot读取Resource下文件的4种方法
Jul 02 Java/Android
SpringMVC 整合SSM框架详解
Aug 30 Java/Android
关于Spring配置文件加载方式变化引发的异常详解
Jan 18 Java/Android
关于MybatisPlus配置双数据库驱动连接数据库问题
Jan 22 Java/Android
MybatisPlus EntityWrapper如何自定义SQL
Mar 22 Java/Android
Android Flutter实现3D动画效果示例详解
Apr 07 Java/Android
Java 通过手写分布式雪花SnowFlake生成ID方法详解
Apr 07 Java/Android
ConditionalOnProperty配置swagger不生效问题及解决
Jun 14 Java/Android
SpringBoot使用AOP实现统计全局接口访问次数详解
Jun 16 Java/Android
SpringBoot详解执行过程
Jul 15 Java/Android
AndroidStudio图片压缩工具ImgCompressPlugin使用实例
Aug 05 Java/Android
Dubbo+zookeeper搭配分布式服务的过程详解
SpringBoot整合minio快速入门教程(代码示例)
Apr 03 #Java/Android
SpringBoot整合Minio文件存储
Apr 03 #Java/Android
Java中Quartz高可用定时任务快速入门
Apr 03 #Java/Android
Spring Security使用单点登录的权限功能
Spring Boot 底层原理基础深度解析
Java 超详细讲解数据结构中的堆的应用
You might like
如何使用PHP中的字符串函数
2006/10/09 PHP
PHP聊天室技术
2006/10/09 PHP
实例讲解PHP面向对象之多态
2014/08/20 PHP
PHP扩展模块memcached长连接使用方法分析
2014/12/24 PHP
完美的php分页类
2017/10/24 PHP
JS组件Bootstrap dropdown组件扩展hover事件
2016/04/17 Javascript
JS留言功能的简单实现案例(推荐)
2016/06/23 Javascript
jQuery子元素过滤选择器用法示例
2016/09/09 Javascript
js动态生成form 并用ajax方式提交的实现方法
2016/09/09 Javascript
新手学习前端之js模仿淘宝主页网站
2016/10/31 Javascript
js中作用域的实例解析
2017/03/16 Javascript
详解Vue中watch的高级用法
2018/05/02 Javascript
Koa2微信公众号开发之消息管理
2018/05/16 Javascript
jquery无缝图片轮播组件封装
2020/11/25 jQuery
微信小程序实现判断是分享到群还是个人功能示例
2019/05/03 Javascript
浅谈使用nodejs搭建web服务器的过程
2020/07/20 NodeJs
Vue+Java 通过websocket实现服务器与客户端双向通信操作
2020/09/22 Javascript
vue 使用class创建和清除水印的示例代码
2020/12/25 Vue.js
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
python查看zip包中文件及大小的方法
2015/07/09 Python
深入讲解Python函数中参数的使用及默认参数的陷阱
2016/03/13 Python
python在每个字符后添加空格的实例
2018/05/07 Python
python3.6 tkinter实现屏保小程序
2019/07/30 Python
Flask框架学习笔记之表单基础介绍与表单提交方式
2019/08/12 Python
基于python的BP神经网络及异或实现过程解析
2019/09/30 Python
Python 音频生成器的实现示例
2019/12/24 Python
Python astype(np.float)函数使用方法解析
2020/06/08 Python
Visual Studio Code搭建django项目的方法步骤
2020/09/17 Python
CSS3田字格列表的样式编写方法
2018/11/22 HTML / CSS
英国最大的经认证的有机超市:Planet Organic
2018/02/02 全球购物
英国布鲁姆精品店:Bloom Boutique
2018/03/01 全球购物
Microsoft Advertising美国:微软搜索广告
2019/05/01 全球购物
加入学生会演讲稿
2014/04/24 职场文书
政府采购方案
2014/06/12 职场文书
教师文明餐桌光盘行动倡议书
2015/04/28 职场文书
python迷宫问题深度优先遍历实例
2021/06/20 Python