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 相关文章推荐
解决tk mapper 通用mapper的bug问题
Jun 16 Java/Android
解决SpringBoot跨域的三种方式
Jun 26 Java/Android
Java反应式框架Reactor中的Mono和Flux
Jul 25 Java/Android
SpringBoot+Vue+JWT的前后端分离登录认证详细步骤
Sep 25 Java/Android
Java Spring 控制反转(IOC)容器详解
Oct 05 Java/Android
Netty分布式客户端处理接入事件handle源码解析
Mar 25 Java/Android
Spring Boot DevTools 全局配置学习指南
Mar 31 Java/Android
零基础学java之带参数以及返回值的方法
Apr 10 Java/Android
SpringBoot使用ip2region获取地理位置信息的方法
Jun 21 Java/Android
spring 项目实现限流方法示例
Jul 15 Java/Android
Spring boot实现上传文件到本地服务器
Aug 14 Java/Android
Java实现贪吃蛇游戏的示例代码
Sep 23 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
main.php
2006/12/09 PHP
PHP数据过滤的方法
2013/10/30 PHP
thinkPHP自动验证、自动添加及表单错误问题分析
2016/10/17 PHP
PHP实现提高SESSION响应速度的几种方法详解
2019/08/09 PHP
js的正则test,match,exec详细解析
2014/01/29 Javascript
js阻止事件追加的具体实现
2014/10/15 Javascript
JS中Location使用详解
2015/05/12 Javascript
jQuery+Ajax实现无刷新分页
2015/10/30 Javascript
JavaScript中Function函数与Object对象的关系
2015/12/17 Javascript
js css实现垂直方向自适应的三角提示菜单
2016/06/26 Javascript
详解Vue 实例中的生命周期钩子
2017/03/21 Javascript
使用AngularJS对表单提交内容进行验证的操作方法
2017/07/12 Javascript
移动设备手势事件库Touch.js使用详解
2017/08/18 Javascript
NodeJs实现定时任务的示例代码
2017/12/05 NodeJs
JavaScript时间戳与时间日期间相互转换
2017/12/11 Javascript
在vue中使用v-bind:class的选项卡方法
2018/09/27 Javascript
JS如何获取地址栏的参数实例讲解
2018/10/06 Javascript
elementUI Tree 树形控件的官方使用文档
2019/04/25 Javascript
ES6 Promise对象概念及用法实例详解
2019/10/15 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
JS出现404错误原理及解决方案
2020/07/01 Javascript
VUE实现吸底按钮
2021/03/04 Vue.js
python查找第k小元素代码分享
2013/12/18 Python
详解Python函数可变参数定义及其参数传递方式
2017/08/02 Python
python with提前退出遇到的坑与解决方案
2018/01/05 Python
python找出一个列表中相同元素的多个索引实例
2019/06/11 Python
python字符串,元组,列表,字典互转代码实例详解
2020/02/14 Python
让你相见恨晚的十个Python骚操作
2020/11/18 Python
英国国家美术馆商店:National Gallery
2019/05/01 全球购物
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
2016/04/13 面试题
运动会稿件300字
2014/02/14 职场文书
学校查摆问题整改措施
2014/09/28 职场文书
普通党员个人整改措施
2014/10/27 职场文书
党员检讨书范文
2014/12/27 职场文书
入学证明
2015/06/23 职场文书
毕业赠语大全
2015/06/23 职场文书