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 相关文章推荐
Java中PriorityQueue实现最小堆和最大堆的用法
Jun 27 Java/Android
Java基础之this关键字的使用
Jun 30 Java/Android
解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题
Jul 01 Java/Android
SpringRetry重试框架的具体使用
Jul 25 Java/Android
java如何实现socket连接方法封装
Sep 25 Java/Android
OpenCV实现反阈值二值化
Nov 17 Java/Android
SpringDataJPA实体类关系映射配置方式
Dec 06 Java/Android
SSM项目使用拦截器实现登录验证功能
Jan 22 Java/Android
Java生成日期时间存入Mysql数据库的实现方法
Mar 03 Java/Android
Mybatis-Plus进阶分页与乐观锁插件及通用枚举和多数据源详解
Mar 21 Java/Android
Java字符串逆序方法详情
Mar 21 Java/Android
Spring Boot DevTools 全局配置学习指南
Mar 31 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(3) php 函数
2010/02/15 PHP
php通过淘宝API查询IP地址归属等信息
2015/12/25 PHP
ThinkPHP5.0框架控制器继承基类和自定义类示例
2018/05/25 PHP
PHP实现的CURL非阻塞调用类
2018/07/26 PHP
JQuery select标签操作代码段
2010/05/16 Javascript
利用jQuery的deferred对象实现异步按顺序加载JS文件
2013/03/17 Javascript
jquery使用经验小结
2015/05/20 Javascript
jquery html动态添加的元素绑定事件详解
2016/05/24 Javascript
angular.js指令中的controller、compile与link函数的不同之处
2017/05/10 Javascript
Vue中封装input组件的实例详解
2017/10/17 Javascript
jQuery Validate插件ajax方式验证输入值的实例
2017/12/21 jQuery
vue-scroller记录滚动位置的示例代码
2018/01/17 Javascript
Vue.directive()的用法和实例详解
2018/03/04 Javascript
json对象及数组键值的深度大小写转换问题详解
2018/03/30 Javascript
基于Vue实现微信小程序的图文编辑器
2018/07/25 Javascript
angular6.x中ngTemplateOutlet指令的使用示例
2018/08/09 Javascript
js中怎么判断两个字符串相等的实例
2019/01/17 Javascript
vue-router传参用法详解
2019/01/19 Javascript
vue实现图片预览组件封装与使用
2019/07/13 Javascript
javascript随机变色实例代码
2019/10/15 Javascript
python网络编程实例简析
2014/09/26 Python
python实现从ftp服务器下载文件的方法
2015/04/30 Python
python3音乐播放器简单实现代码
2020/04/20 Python
Python中的默认参数实例分析
2018/01/29 Python
Python用于学习重要算法的模块pygorithm实例浅析
2018/08/16 Python
Django实现跨域请求过程详解
2019/07/25 Python
解决运行出现'dict' object has no attribute 'has_key'问题
2020/07/15 Python
如何在Win10系统使用Python3连接Hive
2020/10/15 Python
ALEX AND ANI:手镯,项链,耳环和更多
2017/04/20 全球购物
学校岗位设置方案
2014/01/16 职场文书
网络教育自我鉴定
2014/02/04 职场文书
农村党支部书记四风问题个人对照检查材料
2014/09/21 职场文书
整改通知书
2015/04/20 职场文书
环保主题班会教案
2015/08/13 职场文书
教师法制教育培训学习心得体会
2016/01/14 职场文书
开网店计划分析
2019/07/30 职场文书