uni app 扫雷

news2024/12/28 3:56:52

闲来无聊。做个扫雷玩玩吧,点击打开,长按标记,标记的点击两次或长按取消标记。所有打开结束

<template>

	<view class="page_main">

		<view class="add_button" style="width: 100vw;  margin-bottom: 20rpx; background-color: #efefef; color: #000;">
			{{minesize}}
		</view>

		<scroll-view class="scroll_v" scroll-y="true">
			<view>
				<view class="czqy_mian">


					<view v-for="(row,rowindex) in datalist" :key="rowindex" class="row_main_v">
						<view v-for="(item,index) in row" :key="index">
							<view @click="hz_click(rowindex,index)" @longpress="long_click(rowindex,index)">


								<view class="" v-if="isover">
									<view class="fangge_main_v"
										:style="{ width: fgsize + 'rpx', height: fgsize + 'rpx',background : '#fff' }">


										<view class="" v-if="item.isbj"> <!-- 标记了 -->
											<view class="item_vie" v-if="item.ismine"
												:style="{ width: fgsize + 'rpx', height: fgsize + 'rpx',background : '#f0f' }">
												<!-- 标记了 是雷 -->
												💣
											</view>
											<view class="item_vie" v-else
												:style="{ width: fgsize + 'rpx', height: fgsize + 'rpx',background : '#f00' }">
												<!-- 标记了 不是雷 -->
												🚩

											</view>
										</view>

										<view class="item_vie" v-else-if="item.ismine"><!-- 没标记 是雷 -->
											💣
										</view>
										<view class="item_vie" v-else-if="item.value"
											:style="{ width: fgsize + 'rpx', height: fgsize + 'rpx',background : '#fff' }">
											<!-- 没标记 不是雷 有值 -->
											{{item.value}}
										</view>
										<view class="" v-else
											:style="{ width: fgsize + 'rpx', height: fgsize + 'rpx',background : '#fff' }">
											<!-- 没标记 不是雷 没有值 -->

										</view>
									</view>

								</view>
								<view class="" v-else>
									<view v-if="item.isopen" class="fangge_main_v"
										:style="{ width: fgsize + 'rpx', height: fgsize + 'rpx',background : '#fff' }">
										<!-- 点开 -->
										<view class="item_vie" v-if="item.isblast"><!-- 爆炸了 -->
											💣
										</view>
										<view v-else class="item_vie"><!-- 没爆炸 -->
											{{item.value==0?'':item.value}}

										</view>
									</view>
									<view v-else class="fangge_main_v"
										:style="{ width: fgsize + 'rpx', height: fgsize + 'rpx'  }"><!-- 没点开 -->
										<view class="item_vie" v-if="item.isbj">
											🚩
										</view>
									</view>
								</view>
							</view>

						</view>
					</view>


				</view>
			</view>
		</scroll-view>



		<view class="add_button_view">
			<view class="add_button" style="margin-left: 10rpx;" @click="di_click(0)">
				低
			</view>

			<view class="add_button" style="margin-left: 10rpx;" @click="di_click(1)">
				中
			</view>

			<view class="add_button" style="margin-left: 10rpx;" @click="di_click(2)">
				高
			</view>
		</view>


	</view>

</template>

<script>
	export default {
		data() {
			return {


				datalist: [

				], //操作数据

				jibie: 0,
				jblist: [{
						row: 9,
						cols: 9,
						size: 10
					},
					{
						row: 16,
						cols: 16,
						size: 40
					},
					{
						row: 30,
						cols: 16,
						size: 99
					},
				],


				isover: false,
				minesize: 10,
				fgsize: 0,






			};
		},
		onReady() {

			this.init()


		},
		onShow() {

		},
		/**
		 * 生命周期函数--监听页面卸载
		 */
		onUnload: function() {

		},
		methods: {

			di_click: function(e) {
				this.jibie = e
				this.init()
			},

			hz_click: function(row, cols) {
				if (this.datalist[row][cols].isbj) { //标记过的。点击两次取消标记
					this.datalist[row][cols].clickcount += 1
					if (this.datalist[row][cols].clickcount == 2) {
						this.datalist[row][cols].isbj = false
					}
				} else if (this.datalist[row][cols].ismine) { //如果是雷  结束 并打开所有盒子
					this.datalist[row][cols].isopen = true
					this.datalist[row][cols].isblast = true
					this.gameover(1)
				} else { //不是标记和雷 打开盒子    打开后有值 显示值 没值  计算片区
					this.datalist[row][cols].isopen = true
					this.jsnotopen()
					if (this.datalist[row][cols].value == 0) { //打开的盒子没值  计算周边
						this.openaqq(row, cols)
					}
				}
			},
			long_click: function(row, cols) {

				if (!this.datalist[row][cols].isopen) {
					if (this.minesize >= 0 && this.minesize < this.jblist[this.jibie].row * this.jblist[this.jibie]
						.cols) {
						if (this.datalist[row][cols].isbj) { //标记过的。点击两次取消标记
							this.datalist[row][cols].isbj = false
							this.minesize += 1
						} else {
							this.datalist[row][cols].isbj = true
							this.minesize -= 1
						}

					}

					this.datalist[row][cols].clickcount = 0

				}
				this.jsnotopen()
				this.$forceUpdate()
			},
			/**
			 * @param {Object} flag 1 点到雷   0  自动结束
			 */
			gameover: function(flag) {
				if (flag) {
					for (var i = 0; i < this.datalist.length; i++) {
						let arr = this.datalist[i]
						for (var j = 0; j < arr.length; j++) {
							arr[j].isopen = true

						}
					}

				}
				this.isover = true
				this.$forceUpdate()
			},

			openaqq: function(row, cols) {

				let directions = [
					[0, 1],
					[0, -1],
					[1, 0],
					[-1, 0],
					[1, 1],
					[1, -1],
					[-1, 1],
					[-1, -1]
				]
				var count = 0
				for (var i = 0; i < directions.length; i++) {

					let lenx = directions[i][0] + row
					let leny = directions[i][1] + cols

					if (lenx >= 0 && leny >= 0 && lenx < this.jblist[this.jibie].row && leny < this.jblist[this.jibie]
						.cols) {
					 
						if (!this.datalist[lenx][leny].isopen) {
							if (!this.datalist[lenx][leny].ismine) {
								this.datalist[lenx][leny].isopen = true
								this.jsnotopen()
								if (this.datalist[lenx][leny].value == 0) {
									this.openaqq(lenx, leny)
								}

							}
						}


					}


				}
				this.datalist[row][cols].isopen = true
				this.jsnotopen()
				// return count
			},

			jisuanvalue: function(datalist, row, cols) {

				let directions = [
					[0, 1],
					[0, -1],
					[1, 0],
					[-1, 0],
					[1, 1],
					[1, -1],
					[-1, 1],
					[-1, -1]
				]
				var count = 0
				for (var i = 0; i < directions.length; i++) {

					let lenx = directions[i][0] + row
					let leny = directions[i][1] + cols

					if (lenx >= 0 && leny >= 0 && lenx < this.jblist[this.jibie].row && leny < this.jblist[this.jibie]
						.cols) {

						if (datalist[lenx][leny].ismine) {
							count += 1
						}

					}


				}
				datalist[row][cols].value = count
				// return count
			},
			jsnotopen: function() {
				var count = 0
				for (var i = 0; i < this.datalist.length; i++) {
					var arr = this.datalist[i]
					for (var j = 0; j < arr.length; j++) {
						if (arr[j].isopen || arr[j].isbj) {
							count += 1
						}
					}
				}

				if (count == this.jblist[this.jibie].row * this.jblist[this.jibie].cols) {

					this.gameover(0)
				}
			},

			/**
			 * 进入页面初始化数据
			 */
			init: function() {

				var array = []
				for (let row = 0; row < this.jblist[this.jibie].row * this.jblist[this.jibie].cols; row++) {
					if (row <= this.jblist[this.jibie].size) {
						array.push({
							ismine: 1,
							value: 0,
							id: row,
							isopen: false,
							isbj: false,
							isblast: false,
							clickcount: 0,
							isselect: false

						})
					} else {
						array.push({
							ismine: 0, //是否是雷 1是
							value: 0, //值
							id: row, //id
							isopen: false, //点开
							isbj: false, //标记
							isblast: false, //爆炸
							clickcount: 0,
							isselect: false
						})
					}


				}
				this.minesize = this.jblist[this.jibie].size
				this.fgsize = (640 / this.jblist[this.jibie].cols).toFixed(0)

				var datalist = this.shuffle(array)

				for (var i = 0; i < datalist.length; i++) {
					var arr = datalist[i]
					for (var j = 0; j < arr.length; j++) {

						this.jisuanvalue(datalist, i, j)

					}
				}

				this.datalist = JSON.parse(JSON.stringify(datalist))

			},
			convertToArray2D: function(array1D, rows, cols) {
				if (array1D.length !== rows * cols) {
					throw new Error('一维数组的长度必须与指定的行列数相乘的结果相等');
				}

				let array2D = [];
				for (let i = 0; i < array1D.length; i += cols) {
					array2D.push(array1D.slice(i, i + cols));
				}
				return array2D;
			},


			// 打乱数组的函数
			shuffle: function(array) {
				let currentIndex = array.length,
					temporaryValue, randomIndex;

				// 当还剩有元素未洗牌时
				while (0 !== currentIndex) {

					// 选取一个剩下的元素
					randomIndex = Math.floor(Math.random() * currentIndex);
					currentIndex -= 1;

					// 并与当前元素交换
					temporaryValue = array[currentIndex];
					array[currentIndex] = array[randomIndex];
					array[randomIndex] = temporaryValue;
				}

				return this.convertToArray2D(array, this.jblist[this.jibie].row, this.jblist[this.jibie].cols);
			},



			/**
			 * 生成min 到 max 的随机数
			 */
			getRandomInt: function(min, max) {
				min = Math.ceil(min);
				max = Math.floor(max);
				return Math.floor(Math.random() * (max - min + 1)) + min;
			}
		}
	};
</script>

<style scoped>
	.fangge_main_v {

		border: solid 1rpx #000;
		background-color: #afafaf;

	}

	.item_vie {
		width: 100%;
		height: 100%;
		display: flex;
		flex-direction: column;
		justify-content: center;
		align-items: center;
	}

	.czqy_mian {

		width: 100vw;
		height: 100%;
		display: flex;
		flex-direction: column;
		justify-content: center;
		align-items: center;
	}

	.row_main_v {
		width: 100vw;
		display: flex;
		flex-direction: row;
		justify-content: center;
		align-items: center;

	}

	.page_top {
		height: 100rpx;
		width: 100vw;
	}

	.scroll_v {

		height: 80vh;
		width: 100vw;
	}

	.page_main {

		background-color: #efefef;
		display: flex;
		flex-direction: column;
		justify-content: center;
		align-items: center;
		text-align: center;
	}

	.add_button_view {
		display: flex;

		/*row 横向  column 列表  */
		flex-direction: row;
		justify-content: center;
		align-items: center;
		text-align: center;
		height: 10vh;
		width: 100vw;
		background: #fff;

		border-top: solid 1rpx #efefef;



		position: fixed;
		bottom: 0;

	}

	.add_button {


		flex: 1;
		height: 88rpx;
		border: solid 2rpx #07a5a6;
		color: #fff;
		background: #07a5a6;
		font-size: 32rpx;
		border-radius: 10rpx;
		align-items: center;
		justify-content: center;
		display: flex;
	}
</style>

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

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

相关文章

鸿蒙OS开发实例:【NAPI入门】

背景 公司内部已经有现成的MQTT动态库&#xff0c;想在HarmonyOS平台上共享使用。查找官方指导后&#xff0c;发现可以通过NAPI方式&#xff0c;将MQTT C库导入进来&#xff0c;然后封装一层ArkTS接口就可直接使用。 本篇内容是在按照官方指导下&#xff0c;自己做的一些调研…

面对复杂多变的网络攻击,企业应如何守护网络安全

企业上云&#xff0c;即越来越多的企业把业务和数据&#xff0c;迁移到云端。随着云计算、大数据、物联网、人工智能等技术的发展&#xff0c;用户、应用程序和数据无处不在&#xff0c;企业之间的业务边界逐渐被打破&#xff0c;网络攻击愈演愈烈&#xff0c;手段更为多。 当前…

目标检测:数据集划分 XML数据集转YOLO标签

文章目录 1、前言&#xff1a;2、生成对应的类名3、xml转为yolo的label形式4、优化代码5、划分数据集6、画目录树7、目标检测系列文章 1、前言&#xff1a; 本文演示如何划分数据集&#xff0c;以及将VOC标注的xml数据转为YOLO标注的txt格式&#xff0c;且生成classes的txt文件…

AI绘图cuda与stable diffusion安装部署始末与避坑

stable diffusion的安装说起来很讽刺&#xff0c;最难的不是stable diffusion&#xff0c;而是下载安装cuda。下来我就来分享一下我的安装过程&#xff0c;失败了好几次&#xff0c;几近放弃。 一、安装cuda 我们都知道cuda是显卡CPU工作的驱动&#xff08;或者安装官网的解释…

vscode前后台分离Nodejs+vue校园影院售票系统_490gq

柚子校园影院在设计与实施时&#xff0c;采取了模块性的设计理念&#xff0c;把相似的系统的功能整合到一个模组中&#xff0c;以增强内部的功能&#xff0c;减少各组件之间的联系&#xff0c;从而达到减少相互影响的目的。 后台主要包括首页&#xff0c;个人中心&#xff0c;用…

【QT+QGIS跨平台编译】056:【pdal_arbiter+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdal_arbiter介绍二、pdal下载三、文件分析四、pro文件五、编译实践一、pdal_arbiter介绍 pdal_arbiter是 PDAL 项目的一个库,用于帮助管理应用程序运行在 EC2 实例上的 AWS 凭证。 当应用程序需要调用 AWS API 时,它们必须使用 AWS 凭据对 AP…

Git、TortoiseGit、SVN、TortoiseSVN 的关系和区别

Git、TortoiseGit、SVN、TortoiseSVN 的关系和区别 &#xff08;二&#xff09;Git&#xff08;分布式版本控制系统&#xff09;:&#xff08;二&#xff09;SVN&#xff08;集中式版本控制系统&#xff09;&#xff08;三&#xff09;TortoiseGit一、下载安装 git二、安装过程…

HarmonyOS 应用开发之通过关系型数据库实现数据持久化

场景介绍 关系型数据库基于SQLite组件&#xff0c;适用于存储包含复杂关系数据的场景&#xff0c;比如一个班级的学生信息&#xff0c;需要包括姓名、学号、各科成绩等&#xff0c;又或者公司的雇员信息&#xff0c;需要包括姓名、工号、职位等&#xff0c;由于数据之间有较强…

docker容器之etcd

一、etcd介绍 1、etcd是什么 etcd是CoreOS团队于2013年6月发起的开源项目&#xff0c;它的目标是构建一个高可用的分布式键值(key-value)数据库。 2、etcd特点 简单的接口&#xff0c;通过标准的HTTP API进行调用&#xff0c;也可以使用官方提供的 etcdctl 操作存储的数据。…

HBuilder uniapp发行h5遇到报错:此应用 DCloud appid 为 __UNI__95950AD ,您不是这个应用的项目成员。

uniapp打包遇到不是项目成员问题&#xff0c;如下截图&#xff1a; 解决方法如下&#xff1a; 打开项目的mainfest.json文件&#xff0c;在AppID位置点击重新获取&#xff0c;获取后重新点发行打包即可 另遇到HBuilder账号认证问题&#xff0c;如公司wifi打不开认证地址&#…

深入理解 SQL 中的数据集合和数据关联

引言 在数据库管理系统中&#xff0c;数据集合和数据关联是 SQL 查询中常见的概念。它们是构建复杂查询和分析数据的基石。本文将深入探讨 SQL 中的数据集合和数据关联&#xff0c;包括它们的概念、常见用途以及实际示例。 首先引入一下数学中的集合 集合的基本概念&#x…

【MATLAB源码-第26期】基于matlab的FBMC/OQAM的误码率仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 FBMC&#xff08;Filter Bank Multicarrier&#xff09;是一种多载波调制技术&#xff0c;它采用滤波器组来处理频域内的子载波&#xff0c;以在有限带宽内实现高效的数据传输。OQAM&#xff08;Offset Quadrature Amplitude…

OpenHarmony分布式五子棋-使用Canvas组件 实现棋盘、棋子的绘制

介绍 五子棋是一款比较流行的棋类游戏&#xff0c;此游戏使用分布式数据管理功能开发完成的。 本示例使用Canvas组件 实现棋盘、棋子的绘制&#xff0c;使用分布式数据管理 实现两台设备间数据的同步。 本示例使用分布式设备管理能力接口ohos.distributedDeviceManager。 分…

【stm32】USART编码部分--详细步骤

USART编码部分(文章最后附上源码) 如果看不懂步骤可以根据源码参考此篇文章就能轻而易举学会USART通信啦&#xff01; 编码步骤 第一步 开启时钟 把需要用到的USART和GPIO的时钟打开 第二部 GPIO初始化 把TX配置成复用输出&#xff0c;RX配置成输入(上拉输入、浮空输入)。…

VMware虚拟机添加磁盘

在VMware中添加磁盘 &#xff08;虚拟机关闭状态下执行&#xff09; 然后选择默认一步一步点下去&#xff0c;最后创建好新磁盘 开启虚拟机&#xff0c;挂载磁盘 通过命令 lsblk -f 查看未挂载的新磁盘 lsblk -f 通过fdisk命令进行磁盘分区 # 1. 给硬盘/dev/sdb进行分区&am…

2024年04月数据库流行度最新排名

点击查看最新数据库流行度最新排名&#xff08;每月更新&#xff09; 2024年04月数据库流行度最新排名 TOP DB顶级数据库索引是通过分析在谷歌上搜索数据库名称的频率来创建的 一个数据库被搜索的次数越多&#xff0c;这个数据库就被认为越受欢迎。这是一个领先指标。原始数…

Qt6.6添加多媒体模块Multimedia报错问题

问题 QT包含多媒体模块Multimedia时提示未知的模块&#xff1a; error: Project ERROR: Unknown module(s) in QT: multimedia 在帮助文档中只可以找到QMediaPlayer类&#xff0c;但是点进去是空的&#xff0c;这是因为没有安装多媒体模块及对应的帮助文档。 解决 使用在线…

RTOS中临界区嵌套保护的实现原理(基于RT-Thread)

0 前言 什么是临界区&#xff08;临界段&#xff09;&#xff1f; 裸机编程中由于不涉及线程和线程切换&#xff0c;因此没有临界区这一个概念。在RTOS中由于存在线程切换等场景&#xff0c;便有了临界区这个概念。简单来说&#xff0c;临界区就是不允许被中断的代码区域。什么…

【操作系统】FCFS、SJF、HRRN、RR、EDF、LLF调度算法及python实现代码

文章目录 一、先来先服务调度算法&#xff08;FCFS&#xff09; 二、短作业优先调度算法&#xff08;SJF&#xff09; 三、高响应比优先调度算法&#xff08;HRRN&#xff09; 四、轮转调度算法&#xff08;RR&#xff09; 五、最早截至时间优先算法&#xff08;EDF&#…

ES学习日记(七)-------Kibana安装和简易使用

前言 首先明确一点&#xff0c;Kibana是一个软件&#xff0c;不是插件。 Kibana 是一款开源的数据分析和可视化平台&#xff0c;它是 Elastic stack 成员之一&#xff0c;设计用于和Elasticsearch 协作。您可以使用 Kibana 对 Elasticsearch 索引中的数据进行搜索&#xff0c;…