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

目录
  • 前言
  • 主要设计
  • 功能截图
  • 代码实现
    • 游戏启动类
    • 核心监听类
    • 核心线程类
  • 总结

前言

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

主要设计

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

功能截图

游戏启动界面:

游戏开始界面:

移动效果:

释放泡泡

泡泡爆炸效果:

代码实现

游戏启动类

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泡泡堂内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java实现经典游戏打砖块游戏的示例代码

    目录 前言 主要设计 功能截图 代码实现 游戏核心类 小球类 砖块类 总结 前言 <JAVA打砖块>游戏是自制的游戏.玩家操作一根萤幕上水平的“棒子”,让一颗不断弹来弹去的“球”在撞击作为过关目标消去的“砖块”的途中不会落到萤幕底下. 主要设计 设计游戏界面,用swing实现 设计砖块,砖块类, 设计小球,满屏乱跑的小球类,负责打碎砖块 设计棒子,左右移动的木头板类 球碰到砖块.棒子与底下以外的三边会反弹,落到底下会失去一颗球,把砖块全部消去就可以破关. 小球碰到砖块的回调算法设计 小球碰到棒

  • Java实现经典大富翁游戏的示例详解

    目录 前言 主要设计 功能截图 代码实现 总结 前言 大富翁,又名地产大亨.是一种多人策略图版游戏.参与者分得游戏金钱,凭运气(掷骰子)及交易策略,买地.建楼以赚取租金.英文原名monopoly意为“垄断”,因为最后只得一个胜利者,其余均破产收场. <大富翁>游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 可多人参与的大富翁游戏,玩家有初始资金,通过掷骰子,玩家移动指定骰子点数步骤,根据对应格子上的交易策略,来决定是赚钱还是亏钱,其他玩家破

  • Java实现经典捕鱼达人游戏的示例代码

    目录 前言 主要设计 功能截图 代码实现 游戏窗体 鱼 鱼池类继承自Jpanel 总结 前言 <捕鱼达人>是一款以深海狩猎为题材的休闲竞技游戏.这是一场海底世界的远征,享受捕获大鱼的乐趣,但不是所有的鱼都是友善的,它们会用自己的方式保护自己,保卫属于自己的海底世界.当然,这里也是冒险与机遇共存的地方,诸多埋藏于海底的宝藏等待着被探寻. 游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 在鱼池中有很多鱼,鱼各自游动. 有一张渔网,随鼠标移动,点

  • Java编写实现坦克大战小游戏

    本文实例为大家分享了Java实现坦克大战小游戏的具体代码,供大家参考,具体内容如下 创作背景:n年前的学期末课题设计,从b站上学的,一个代码一个代码敲出来的. 小游戏介绍: 红色坦克是我们的操纵坦克,黑色是敌人坦克.上下左右键控制坦克移动方向按ctrl键发射炮弹红色坦克可以穿墙,黑色不可以 具体页面如下: 奉上全部源代码: Tank.java import java.awt.*; import java.awt.event.*; import java.util.*; public class

  • Java练习之潜艇小游戏的实现

    首先是主方法里定义的窗口(这些都是固定的格式,不会的也没什么事,直接Ctrl+c+v就行,基本上看一下数据都能看的懂) 写一个超类,超类里需要有潜艇,深水炸弹,水雷和战舰的宽,高,以及出场时的x,y坐标,和移动速度.所有对象的图片,所有对象的移动方法,以及碰撞 然后再写派生类,根据击败一个水雷潜艇,战舰会获得一条命,击败其他潜艇,战舰会获得分数,所以,需要定义两个接口,一个是用来加命,另一个用来加分 完整代码如下(图片什么的可以自己去找,只需要改一下Image类和各个对象的宽高就可以) 游戏世界

  • JAVA实现的CrazyArcade泡泡堂游戏

    项目地址 https://github.com/SCNU-A225/CrazyArcade 示例图片 项目结构 frame:包含如开始.游戏中.结束的JFrame main:包含程序入口和其它游戏控制 model: model.loader:包含资源加载器用于读取配置文件等信息,使用了单例设计模式 model.manager:包含元素管理器.工厂等,用于控制游戏各元素 model.vo:各种实体类,包括玩家.NPC.炸弹.方块等等 pro:配置文件目录,包含人物.道具.地图.方块.游戏设置等配置

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

    目录 前言 主要设计 功能截图 代码实现 游戏启动类 核心监听类 核心线程类 总结 前言 <泡泡堂I>是一个基于java的自制游戏,游戏设计为双人pk积分赛模式,在这个模式里面,玩家只要率先达到一定分数既可以赢得比赛.玩家可以通过炸箱子可以得到少量的分数,也可以通过炸掉对手然后戳破包围对手的水泡得到大量分数.而玩家如果被泡泡爆炸击中,会被泡泡包裹一段时间,在这段时间内不可以移动和放泡泡,需要等时间过去或者被对手戳破水泡才能获得自由.但如果玩家被自己放的泡泡炸中,会扣一定的分数. 主要设计 设计

  • JAVA实现经典游戏坦克大战的示例代码

    目录 前言 主要设计 功能截图 代码实现 总结 前言 小时候大家都玩过坦克大战吧,熟悉的旋律和丰富的关卡陪伴了我们一整个寒暑假,还记得传说中的经典坦克大战 吗?那些怀旧的记忆,伴随着我们一起走过来的经典坦克大战,刚开始那战战兢兢,屡屡被敌人坦克击毁的情景历历在目.现在好了,再也不用担心敌人坦克了,可 以横冲直撞,横扫敌人坦克了.快哉!!! <坦克大战>游戏以坦克战斗为主题,用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 可以生成不同的地图,消灭地

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

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

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

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

  • Java实现经典游戏黄金矿工的示例代码

    目录 前言 主要设计 功能截图 代码实现 游戏核心类 钩子类 总结 前言 <黄金矿工>游戏是一个经典的抓金子小游戏,它可以锻炼人的反应能力..该游戏中,可以通过“挖矿”获得积分,游戏道具:有3瓶药水,在回收绳子抓金子的时候速度稍快点. 主要设计 设计游戏界面,用swing实现 随机创建金块算法 随机创建石块算法 计时系统设计 积分系统设计 设置鼠标事件,鼠标左键出钩子:鼠标右键开始游戏,确认吃药水等功能. 功能截图 游戏开始: 抓金子 代码实现 游戏核心类 public class GameW

  • Java实现经典游戏飞机大战-I的示例代码

    目录 前言 主要设计 功能截图 代码实现 启动类 核心类 核心算法 总结 前言 <飞机大战-I>是一款融合了街机.竞技等多种元素的经典射击手游.华丽精致的游戏画面,超炫带感的技能特效,超火爆画面让你肾上腺素爆棚,给你带来全方位震撼感受,体验飞行战斗的无限乐趣. 游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 玩家控制一台战斗机,以消灭所有的敌机为胜利,有些敌机会掉落装备,不可错过哦 主要设计 1. 用Swing库做可视化界面 2.鼠标控制战

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

    目录 前言 主要设计 功能截图 代码实现 界面布局类 业务逻辑类 总结 前言 2014年Gabriele Cirulli利用周末的时间写2048这个游戏的程序,仅仅只是好玩而已.他想用一种不同的视觉展现效果和更快速的动画来创造属于自己的游戏版本. 游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 每次控制所有方块向同一个方向运动,两个相同数字的方块撞在一起之后合并成为他们的和,每次操作之后会在空白的方格处随机生成一个2或者4,最终得到一个“20

  • Java实现经典游戏超级玛丽的示例代码

    目录 前言 主要设计 功能截图 代码实现 游戏主界面 马里奥 小怪 总结 前言 在你的童年记忆里,是否有一个蹦跳.顶蘑菇的小人? 如果你回忆起了它,你定然会觉得现在它幼稚.无聊,画面不漂亮,游戏不精彩……但请你记住:这才是真正的游戏,它给了你无限的欢乐! 马里奥是靠吃蘑菇成长,闻名世界的超级巨星.特征是大鼻子.头戴帽子.身穿背带工作服.还留着胡子. 如此经典的游戏,你怎么能错过,快来玩玩吧. <超级玛丽>游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想.

随机推荐