uni app 扫雷

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

<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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

瑞_23种设计模式_迭代器模式

文章目录 1 迭代器模式&#xff08;Iterator Pattern&#xff09;★★★1.1 介绍1.2 概述1.3 迭代器模式的结构1.4 中介者模式的优缺点1.5 中介者模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 JDK源码解析 &#x1f64a; 前言&#xff1a;本文…

TypeScript语法快速上手

TypeScript语法 对比ts编译器类型注解新增类型数组自定义类型注解函数类型对象类型元组类型类型推断枚举类型 对比 最大区别&#xff1a;ts能在编译时就能发现类型错误的问题&#xff0c;而js只有在系统运行时再通过异常中断来发现 ts的底层仍是js&#xff0c;但ts能够有效减少…

思腾推出支持大规模深度学习训练的高性能AI服务器

近日人工智能研究公司OpenAI公布了其大型语言模型的最新版本——GPT-4&#xff0c;可10秒钟做出一个网站&#xff0c;60秒做出一个游戏&#xff0c;参加了多种基准考试测试&#xff0c;它的得分高于88%的应试者&#xff1b;随后百度CEO李彦宏宣布正式推出大语言模型“文心一言”…

element-ui message 组件源码分享

今日简单分享 message 组件的源码&#xff0c;主要从以下四个方面来分享&#xff1a; 1、message 组件的页面结构 2、message 组件的 options 配置 3、mesage 组件的方法 4、个人总结 一、message 组件的页面结构 二、message 组件的 options 配置 前置说明&#xff1a;m…

Meta Pixel:助你实现高效地Facebook广告追踪

Meta Pixel 像素代码是用來衡量Facebook广告效果的一个官方数据工具&#xff0c;只要商家有在Facebook上投放广告就需要串联Meta Pixel 像素代码来查看相关数据。 它本质上是一段 JavaScript 代码&#xff0c;安装后可以让用户在自己网站上查看到访客活动。它的工作原理是加载…

FPGA高端图像处理开发板-->鲲叔4EV:12G-SDI、4K HDMI2.0、MIPI等接口谁敢与我争锋?

目录 前言鲲叔4EV----高端FPGA图像处理开发板核心板描述底板描述配套例程源码描述配套服务描述开发板测试视频演示开发板获取 前言 在CSDN写博客传播FPGA开发经验已经一年多了&#xff0c;帮助了不少人&#xff0c;也得罪了不少人&#xff0c;有的人用我的代码赢得了某些比赛、…

基于FPGA的HDMI视频接口设计

HDMI介绍 HDMI(High-DefinitionMultimedia Interface)又被称为高清晰度多媒体接口,是首个支持在单线缆上传输,不经过压缩的全数字高清晰度、多声道音频和智能格式与控制命令数据的数字接口。HDMI接口由Silicon Image美国晶像公司倡导,联合索尼、日立、松下、飞利浦、汤姆逊、东…

使用 Django 构建简单 Web 应用

当我们在使用Django构建Web应用时&#xff0c;通常将会涉及到多个步骤&#xff0c;从创建项目到编写视图、模板、模型&#xff0c;再到配置URL路由和静态文件&#xff0c;最后部署到服务器上。所以说如果有一个环节出了问题&#xff0c;都是非常棘手的&#xff0c;下面就是我们…

iPhone设备中定位应用程序崩溃问题的日志分析技巧

​ 目录 如何在iPhone设备中查看崩溃日志 摘要 引言 导致iPhone设备崩溃的主要原因是什么&#xff1f; 使用克魔助手查看iPhone设备中的崩溃日志 奔溃日志分析 总结 摘要 本文介绍了如何在iPhone设备中查看崩溃日志&#xff0c;以便调查崩溃的原因。我们将展示三种不同的…

Matlab|【核心复现】同时考虑考虑孤岛与重构的配电网故障恢复运行策略

目录 主要内容 基本知识 1.问题引出 2.可控负荷 3.网络拓扑约束 4.算法流程 结果一览 1.原文结果 2.程序运行结果 下载链接 主要内容 该模型复现文章《同时考虑考虑孤岛与重构的配电网故障恢复运行策略》&#xff0c;以IEEE33配电网为分析对象&#xff0c;…

iPhone设备中通过开发者选项查看应用程序崩溃日志的实用技术

​ 目录 如何在iPhone设备中查看崩溃日志 摘要 引言 导致iPhone设备崩溃的主要原因是什么&#xff1f; 使用克魔助手查看iPhone设备中的崩溃日志 奔溃日志分析 总结 摘要 本文介绍了如何在iPhone设备中查看崩溃日志&#xff0c;以便调查崩溃的原因。我们将展示三种不同的…

基于GaN的半导体光学放大器SOA

摘要 基于GaN的材料可覆盖很宽的光谱范围&#xff0c;以紫外、紫、蓝、绿和红波发射的激光二极管已经商业化。基于GaN的半导体光学放大器&#xff08;SOA&#xff09;具有提高激光二极管输出功率的能力&#xff0c;因此SOA将有很多潜在应用。未来需要利用短波、超快脉冲特性的…

Mac安装Parallels Desktop 19 For Mac v19.1.0 PD19虚拟机中文一键激活版

在 Mac 上运行 Windows&#xff0c;简单&#xff0c;强大&#xff0c;无缝。 全新Parallels Desktop 19 for Mac 增强 Mac 的功能&#xff0c;在虚拟机上运行 Windows&#xff0c;同时获得超过 200000 款可用于工作、开发、学习、测试和玩游戏的 Windows 应用。已经获得Microso…

Go-知识协程

Go-知识协程 1. 基本概念1.1 进程1.2 线程1.3 协程 2. 协程的优势3. 调度模型3.1 线程模型3.2 Go调度器模型 4. 调度策略4.1 队列轮转4.2 系统调用4.3 工作量窃取4.4 抢占式调度 5. GOMAXPROCS对性能的影响 一个小活动&#xff1a; https://developer.aliyun.com//topic/lingma…

【Go】十三、面向对象:方法

文章目录 1、面向对象2、结构体实例的创建3、结构体之间的转换4、方法5、结构体值拷贝6、方法的注意点7、方法和函数的区别8、跨包创建结构体实例 1、面向对象 Go的结构体struct ⇒ Java的Class类Go基于struct来实现OOP相比Java&#xff0c;Go去掉了方法重载、构造函数和析构函…

面向对象编程中的StringBuffer类详解

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

vulhub中Apache solr XML 实体注入漏洞复现(CVE-2017-12629)

Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发&#xff0c;主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个XML/JSON响应来实现。此次7.1.0之前版本总共爆出两个漏洞&#xff1a;XML…

VSCode 设置vue2模板

点击设置 > 用户代码片段 > 输入Vue &#xff08;打开vue.json&#xff09;> 将代码复制内 "Print to console": {"prefix": "<","body": ["<template>"," <div class$1></div>"…

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

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

FPGA高端项目:解码索尼IMX327 MIPI相机+图像缩放+HDMI输出,提供开发板+工程源码+技术支持

目录 1、前言2、相关方案推荐本博主所有FPGA工程项目-->汇总目录我这里已有的 MIPI 编解码方案 3、本 MIPI CSI-RX IP 介绍4、个人 FPGA高端图像处理开发板简介5、详细设计方案设计原理框图IMX327 及其配置MIPI CSI RX图像 ISP 处理自研HLS图像缩放详解图像缓存HDMI输出工程…