仿弹壳特工队,绝地反击活动使用电池翻格子小游戏(JAVA小游戏)

news2024/10/6 12:23:04

近来太无聊,玩了一款割草游戏,里面有个活动感觉挺好玩的,像扫雷一样,寻找线索(灯泡),在这里使用JAVA语言也简单实现下游戏。

先上效果图,鼠标点击对应的块,可以展开相连的方块,点击黄色的正方块(灯泡线索)那么就刷新进入下一关。

附上代码(代码注释都有,很详细了,就不耽误大家玩游戏啦)



import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.LinkedHashMap;
import java.util.Map;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

/**
 * 模仿弹壳特工队,绝地反击活动使用电池翻格子 小游戏
 */
public class MapGame {

	public static class MapGameView extends JPanel {
		private static final int WIDTH = 40;
		private MapGame mapGame;

		public MapGameView(MapGame mapGame) {
			super();
			this.mapGame = mapGame;
			setPreferredSize(new Dimension(450, 330));
			addMouseListener(new MouseAdapter() {

				@Override
				public synchronized void mouseClicked(MouseEvent e) {
					int x = e.getX()/WIDTH;
					int y = e.getY()/WIDTH;
					mapGame.openBlock(y, x);
					
					int sum=0;
					for (Integer val : mapGame.score.values()) {
						sum = sum + val;
					}
					
					System.out.println(sum+"得分:"+mapGame.score);
					
					repaint();
				}
			});
			
		}

		@Override
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			for (int i = 0; i < 64; i++) {
				int x = i % 8;
				int y = i / 8;
				
				
				Block[][] map = mapGame.map;
				Block block = map[x][y];

				final Color color = g.getColor();
				
				if(block==null) {
					//已经没有了
					g.setColor(getBackground());
					g.fill3DRect(x * WIDTH, y * WIDTH, WIDTH, WIDTH, false);
					g.setColor(color);
					continue;
				}
				
				if (!block.open) {
					g.fill3DRect(x * WIDTH, y * WIDTH, WIDTH, WIDTH, true);
					continue;
				}

				
				// 0-红色;1-蓝色;2-紫色;3-绿色;4-灯泡;
				switch (block.value) {
				case 0:
					g.setColor(Color.RED);
					g.fillOval(x * WIDTH, y * WIDTH, WIDTH, WIDTH);

					break;
				case 1:
					g.setColor(Color.BLUE);
					g.fillOval(x * WIDTH, y * WIDTH, WIDTH, WIDTH);
					break;
				case 2:
					g.setColor(Color.CYAN);
					g.fillOval(x * WIDTH, y * WIDTH, WIDTH, WIDTH);
					break;
				case 3:
					g.setColor(Color.GREEN);
					g.fillOval(x * WIDTH, y * WIDTH, WIDTH, WIDTH);
					break;
				case 4:
					g.setColor(Color.ORANGE);
					g.fill3DRect(x * WIDTH, y * WIDTH, WIDTH, WIDTH, true);
					break;
				default:
					break;
				}

				g.setColor(color);

			}

		}
	}

	public static void main(String[] args) {

		MapGame mapGame = new MapGame();
		JFrame frame = new JFrame();
		frame.setTitle("模仿弹壳特工队,绝地反击活动使用电池翻格子");

		frame.getContentPane().add(new MapGameView(mapGame));

		frame.pack();
		frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		frame.setLocationRelativeTo(null);

		frame.setVisible(true);

		/*Scanner scanner = new Scanner(System.in);
		while (true) {
			mapGame.printMapGame();
			String next = scanner.next();
		
			String[] split = next.split("\\.");
		
			int x = Integer.valueOf(split[0]);
			int y = Integer.valueOf(split[1]);
		
			mapGame.openBlock(x, y);
		}*/

	}

	/**
	 * 每个小格子
	 */
	class Block {

		/**
		 * 默认没有开启的
		 */
		boolean open;

		/**
		 * 块内部打开后的东西, 0-红色;1-蓝色;2-紫色;3-绿色;4-灯泡过关;
		 */
		int value = (int) (Math.random() * 10 % 4);

		@Override
		public String toString() {
			if (open) {
				return "" + value;
			} else {
				return "█";
			}
		}
	}

	/**
	 * 得分
	 */
	private Map<Integer, Integer> score = new LinkedHashMap<Integer, Integer>(){
		
		{
			this.put(0, 0);
			this.put(1, 0);
			this.put(2, 0);
			this.put(3, 0);
			this.put(4, 0);
		}
	};

	private Block[][] map = new Block[8][8];

	public MapGame() {
		init();
	}

	/**
	 * 初始化地图
	 */
	public void init() {
		for (int i = 0; i < 64; i++) {
			int x = i % 8;
			int y = i / 8;
			map[x][y] = new Block();
		}

		int xiansuoIndex = (int) (Math.random() * 100 % 64);
		// 线索灯泡位置
		map[xiansuoIndex % 8][xiansuoIndex / 8].value = 4;

		while (true) {
			int startIndex = (int) (Math.random() * 100 % 64);
			// 开始的位置不能与过关的相同
			if (startIndex != xiansuoIndex) {
				map[startIndex % 8][startIndex / 8].open = true;
				break;
			}
		}
	}

	/**
	 * 打开格子
	 */
	public void openBlock(int y, int x) {

		if (map[x][y]==null || !map[x][y].open) {
			// 当前的点击的必须是已经打开的
			return;
		}
		// 相对应的得分增加
		Integer valueSize = score.get(map[x][y].value);
		if (valueSize == null) {
			valueSize = 0;
		}
		score.put(map[x][y].value, valueSize + 1);

		
		
		if (map[x][y].value == 4) {
			// 如果是过关的灯泡,那么下一关,重新初始化格子
			this.init();
			return;
		}
		
		map[x][y] = null;

		// 相连的格子都打开,下面代码就偷懒了,不判断边界,边缘使用异常捕捉了,
		try {
			map[x - 1][y + 1].open = true;
		} catch (Exception e) {

		}
		try {
			map[x - 1][y - 1].open = true;
		} catch (Exception e) {

		}
		try {
			map[x - 1][y].open = true;
		} catch (Exception e) {

		}
		try {
			map[x + 1][y - 1].open = true;
		} catch (Exception e) {

		}
		try {
			map[x][y - 1].open = true;
		} catch (Exception e) {

		}
		try {
			map[x][y + 1].open = true;
		} catch (Exception e) {

		}
		try {
			map[x + 1][y].open = true;
		} catch (Exception e) {

		}
		try {
			map[x + 1][y + 1].open = true;
		} catch (Exception e) {

		}
	}

	/**
	 * 打印输出当前地图游戏信息
	 */
	public void printMapGame() {

		System.out.println("玩家得分:" + score.toString());
		for (int i = 0; i < 8; i++) {
			System.out.print(i + " ");
		}
		System.out.println();
		System.out.println();

		for (int y = 0; y < map.length; y++) {
			for (int x = 0; x < map[y].length; x++) {
				Block block = map[y][x];
				System.out.print(block + " ");
			}
			System.out.println("  " + y);
		}
	}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/954319.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nvm集合node版本,解决新版本jeecgboot3.5.3前端启动失败问题

jeecgboot前端3.5.3页面如下 使用之前的pnpm启动会报错&#xff0c;pnpm是node进行安装的&#xff0c;查询后发现&#xff0c;vue3版本的页面至少需要node16版本&#xff0c;我之前的版本只有15.5&#xff0c;适用于vue2 那么我将先前的node15.5版本删除&#xff0c;然后安装…

【知识分享】C语言应用-易错篇

一、C语言简介 C语言结构简洁&#xff0c;具有高效性和可移植性&#xff0c;因此被广泛应用。但究其历史的标准定义&#xff0c;C语言为了兼容性在使用便利性作出很大牺牲。在《C陷阱与缺陷》一书中&#xff0c;整理出大部分应用过程中容易出错的点&#xff0c;本文为《C陷阱与…

ffmpeg把RTSP流分段录制成MP4,如果能把ffmpeg.exe改成ffmpeg.dll用,那音视频开发的难度直接就降一个维度啊

比如&#xff0c;原来我们要用ffmpeg录一段RTSP视频流转成MP4&#xff0c;我们有两种方案&#xff1a; 方案一&#xff1a;可以使用以下命令将rtsp流分段存储为mp4文件 ffmpeg -i rtsp://example.com/stream -vcodec copy -acodec aac -f segment -segment_time 3600 -reset_t…

ubuntu20.04+ROS noetic在线运行单USB双目ORB_SLAM

双目摄像头主要有以下几种&#xff0c;各有优缺点。 1.单USB插口&#xff0c;左右图像单独输出2.双USB插口&#xff0c;左右图像单独输出&#xff08;可能存在同步性问题&#xff09;3.双USB插口&#xff0c;左右图像合成输出4.单USB插口&#xff0c;左右图像合成输出 官方版…

【C++】线程安全问题

原子类型非线程安全 #include <iostream> #include <thread>int main() {int num 0;int count 100000;std::thread thread1([&](){for(int i 0; i < count; i){num;}});std::thread thread2([&](){for(int i 0; i < count; i){num;}});std::thr…

jsp+servlet零食商城java网上购物超市Mysql源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目介绍 项目名:网上零食商城 技术栈 jspservlet 系统有3权限…

动静分红,循环购模式:微三云门门

动静分红&#xff0c;循环购模式&#xff1a;微三云门门 商业模式概述&#xff1a; 动静分红&#xff0c;循环购模式是一种创新商业模式&#xff0c;旨在解决平台用户复购率和C端裂变的难题。该模式以能量值和贡献值为核心资产&#xff0c;结合动态和静态奖金池&#xff0c;为…

产品展示视频拍摄制作流程

通过精心策划和制作的产品展示视频&#xff0c;展示产品的独特魅力和卓越功能。激发受众对产品的兴趣和购买欲望。为了确保产品展示视频的制作质量和效果&#xff0c;需要团队一起探讨具体的拍摄制作流程。深圳产品活动视频制作公司老友记小编为您分析产品展示视频的拍摄制作过…

中国人民大学与加拿大女王金融硕士——为什么读金融硕士,这些理由够不够?

金融硕士要不要读&#xff1f;身在金融行业的我们拥有的本科学历还够用吗&#xff1f;随着教育的发展&#xff0c;高学历的人才越来越多。金融行业好多职位的招聘门槛已经提升到硕士学历了。面对职场高学历人才的涌入&#xff0c;对于在职的我们来说&#xff0c;是一种潜在的压…

【STM32】IIC的初步使用

IIC简介 物理层 连接多个devices 它是一个支持设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中&#xff0c;可连接多个 I2C 通讯设备&#xff0c;支持多个通讯主机及多个通讯从机。 两根线 一个 I2C 总线只使用两条总线线路&#xff0c;一条双向串行数…

linux————pxe网络批量装机

目录 一、概述 什么是pxe pxe组件 二、搭建交互式pxe装机 一、配置基础环境 二、配置vsftpd 三、配置tftp 四、准备pxelinx.0文件、引导文件、内核文件 一、准备pxelinux.0 二、准备引导文件、内核文件 五、配置dhcp 一、安装dhcp 二、配置dhcp 六、创建default文…

要用linux,不会shell 基本语法搞不来~

01.变量 1、环境变量 echo $PATH 2、自定义变量 hello"hello_world" echo $hello 3、存储 Linux 命令执行结果作为变量 (2 种方式&#xff0c;推荐使用第二中&#xff0c;第一种是 ~键上面的斜点比较难识别) filesls -al path(pwd)注意点定义变量号两边不能有空…

koa路由自动注册

安装 pnpm install require-directory 路由加载 static initRouters() {// 绝对路径const apiDir ${process.cwd()}/router;// 自动加载路由requireDirectory(module, apiDir, {visit: whenLoadModule});// 判断加载模块是否是路由function whenLoadModule(obj) {if (obj i…

小白带你学习linux的ELK日志收集系统

目录 目录 一、概述 1、ELK由三个组件构成 2、作用 3、为什么使用&#xff1f; 二、组件 1、elasticsearch 2、logstash 3、kibana 三、架构类型 1、ELK 2、ELKK 3、ELFK 4、ELFKK 四、ELK日志收集系统集群实验 1、实验拓扑 2、环境配置 3、 安装node1与node2…

算法设计 || 第12题:12皇后回溯算法(C语言代码)

之前关于8皇后更详细总结&#xff1a; 算法设计 || 实验四 回溯算法-八皇后问题&#xff08;纯手敲保姆级详细讲解小白适用头歌解析&#xff09;_MSY&#xff5e;学习日记分享的博客-CSDN博客 学习的功夫一定要在平时&#xff0c;这样你考试前不必慌张&#xff0c;不用着急&a…

Leetcode54螺旋矩阵

思路&#xff1a;用set记录走过的地方&#xff0c;记下走的方向&#xff0c;根据方向碰壁变换 class Solution:def spiralOrder(self, matrix: list[list[int]]) -> list[int]:max_rows len(matrix)max_cols len(matrix[0])block_nums max_cols * max_rowscount 1i 0j…

这个 web 自动化测试框架真香 ,selenium进阶pro plus版

在 web 自动化测试当中&#xff0c; selenium 架构应该是很难绕过的&#xff0c;很多宣称要超 selenium 的下一代 web 自动化测试框架最终都败下阵来。 不过&#xff0c; selenium 的 api 确实比较复杂&#xff0c;所以也有很多库尝试对他进行上层封装&#xff0c;splinter 是其…

Ubuntu18.04安装cuDNN

注册账号 https://developer.nvidia.com/rdp/cudnn-archive 该网站下载安装包需要先进行注册。登录成功后&#xff0c;找到与CUDA对应的版本。 选择Linux版本进行下载。 下载后的格式为.tar.xz 解压 tar xvJf cudnn-linux-x86_64-8.9.3.28_cuda12-archive.tar.xz配置环境 su…

全新配色 smart 精灵#1 BRABUS性能版于成都车展正式上市

新奢智能纯电汽车品牌smart携旗下全系车型&#xff0c;盛大亮相第二十六届成都国际汽车展览会&#xff08;4号馆H402展台&#xff09;。此次车展上&#xff0c;smart首次公开披露智能驾驶技术迭代战略路线、“南拓西进”全球化市场布局策略&#xff0c;加速成为全球领先的智能纯…

运动耳机怎么选、运动耳机排行榜前十名推荐

对于热爱跑步和运动的人来说&#xff0c;音乐是最好的伴侣&#xff0c;可以消除孤独感和乏味。随着蓝牙无线耳机的出现&#xff0c;耳机的无线化给我们的生活带来了巨大改变&#xff0c;特别是在运动场景下&#xff0c;蓝牙无线耳机的优势更加明显。然而&#xff0c;在选择适合…