uni app 写的 小游戏,文字拼图?文字拼写?不知道叫啥

news2025/1/12 19:16:45

从下方的偏旁部首中选在1--3个组成上面文章中的文字,完成的文字标红

不喜勿喷

《满江红》 其中用到了两个文件 strdata.json  parameters.json  这两个文件太大 放到资源中了

资源文件

<template>
	<view class="wenzi_page_main">



		<view class="wenzi_main_view">
			<view v-for="(item,index) in words" :key="index">
				<text :style="{color:item.color}">{{item.name}}</text>
			</view>
		</view>

		<view class="bushou_main_view">


			<view class="mall">
				<view v-for="(item,index) in ppbslist" :key="index" class="item" :class="item.disabled ? 'disabled' :''"
					@click="move(item,index)" :id="item.id" :style="{
					width: size+'rpx',
					height: size+'rpx',
					left: item.left + 'rpx',
					top: item.top + 'rpx'
				}">
					<image :style="{
					width: (size-6)+'rpx',
					height: (size-6)+'rpx',
					borderRadius: '8rpx',
					backgroundColor: '#fff',
					border: '2rpx solid #71a419',
					borderBottom: '10rpx solid #71a419'
				}" :src="item.src"></image>
				</view>
			</view>

		</view>
		<view class="yixuan_main_view">

			<view v-for="(item,index) in select" :key="index">
				<image :src="item.src" class="item_image">
				</image>
			</view>


		</view>

		<view class="add_button_view">
			<text class="add_button" @click="spick_click"> 满江红</text>
			<text class="add_button" @click="spick_click"> 开始</text>
		</view>

	</view>
</template>

<script>
	import strdata from './strdata.json'
	import parameters from './parameters.json'

	// 以下功能库请按需使用

	export default {
		data() {
			return {
				allppbslist: [],
				ppbslist: [],
				words: [],

				strword: '怒发冲冠,凭阑处、潇潇雨歇。抬望眼,仰天长啸,壮怀激烈。三十功名尘与土,八千里路云和月。莫等闲、白了少年头,空悲切。靖康耻,犹未雪。臣子恨,何时灭。驾长车,踏破贺兰山缺。壮志饥餐胡虏肉,笑谈渴饮匈奴血。待从头、收拾旧山河,朝天阙。',

				select: [],
				isover: false,

				layerCount: 5, //绘制4层
				//行
				rows: 7,
				//列
				cols: 7,

				//卡片大小
				size: 70,

				canMove: true
			}
		},

		onLoad() {





		},
		onShow() {





		},

		onReady() {



		},
		methods: {
			move(item, index) {
				if (this.isover || item.disabled || item.click) {
					return
				}


				item.left = 800
				item.top = 10000
				item.id = item.id + '-move'
				item.click = true



				this.select.push(JSON.parse(JSON.stringify(item)))


				this.pipei()

			},

			getppbs: function(str, id) {
				let strdatas = strdata[str]
				var word = {
					isbj: false,
					id: id,
					name: str,
					childcodes: [],
					color: "#666"
				}
				if (strdatas) {
					var valuearr = strdatas[strdatas.length - 1]
					for (let j = 0; j < valuearr.length; j++) {
						word.childcodes.push(this.convertTextToUnicode(valuearr[j]))
					}
				} else {
					word.childcodes.push(this.convertTextToUnicode(str))
				}
				this.words.push(word)

			},

			convertTextToUnicode: function(text) {

				return ("" + text).charCodeAt(0).toString(16).toUpperCase().toLowerCase();

			},


			init: function() {

				var ppbslist = JSON.parse(JSON.stringify(this.allppbslist))


				this.ppbslist = this.convertToArray5x7x7(ppbslist)


				this.checkDisabled()


			},
			convertToArray5x7x7: function(flatArray) {

				const cellHtml = []
				//整理

				//第一步画表格
				//先绘制  最上面一层    然后  从顶层到底层绘制  进行行和列的 数据循环
				for (let ly = this.layerCount - 1; ly >= 0; ly--) {
					for (let i = 0; i < this.rows; i++) {
						for (let j = 0; j < this.cols; j++) {

							let pyStep = (ly + 1) % 2 === 0 ? this.size / 2 : 0 //给偏移量和不给偏移量  实现错开的效果
							//进行  图层的渲染   id 是必要的   这个定义了 第几层ly 第几行 i 第几列j  可以判断这个卡片有没有被盖住
							//最终  我们会以绝对定位的方式 进行 布局
							//整个随机数
							let item = (flatArray.pop()) //取完随机数  然后用pop  随用 随删  直到没有为止
							item && cellHtml.push({
								ly: ly,
								i: i,
								j: j,
								left: this.size * j + pyStep,
								top: this.size * i + pyStep,
								id: 'm' + ly + '-' + i + '-' + j,
								name: item.name,
								src: item.image,
								code: item.code,
								isMove: false
							})

						}
					}
				}
				console.log(cellHtml.length)
				return cellHtml.reverse()


			},



			checkDisabled() {
				this.ppbslist.forEach((v, index) => {
					const arr = v.id.substring(1).split('-').map(v => Number(v))
					const isPy = (arr[0] + 1) % 2 === 0
					for (let i = arr[0] + 1; i <= this.layerCount - 1; i++) {
						const isPyB = (i + 1) % 2 === 0
						if (isPy === isPyB) {
							let el = this.ppbslist.find(item => {
								return item.id === 'm' + i + '-' + arr[1] + '-' + arr[2]
							})
							if (el) {
								v.disabled = true
								break;
							}
						} else if (isPy && !isPyB) {
							[
								`${i}-${arr[1]}-${arr[2]}`,
								`${i}-${arr[1]}-${arr[2] + 1}`,
								`${i}-${arr[1] + 1}-${arr[2]}`,
								`${i}-${arr[1] + 1}-${arr[2] + 1}`
							].every(k => {
								let el = this.ppbslist.find(item => {
									return item.id === 'm' + k
								})
								return !el
							})
							if (![
									`${i}-${arr[1]}-${arr[2]}`,
									`${i}-${arr[1]}-${arr[2] + 1}`,
									`${i}-${arr[1] + 1}-${arr[2]}`,
									`${i}-${arr[1] + 1}-${arr[2] + 1}`
								].every(k => {
									let el = this.ppbslist.find(item => {
										return item.id === 'm' + k
									})
									return !el
								})) {
								v.disabled = true
								break;
							} else {
								v.disabled = false
							}
						} else if (!isPy && isPyB) {
							if (![
									`${i}-${arr[1]}-${arr[2]}`,
									`${i}-${arr[1]}-${arr[2] - 1}`,
									`${i}-${arr[1] - 1}-${arr[2]}`,
									`${i}-${arr[1] - 1}-${arr[2] - 1}`
								].every(k => {
									let el = this.ppbslist.find(item => {
										return item.id === 'm' + k
									})
									return !el
								})) {
								v.disabled = true
								break;
							} else {
								v.disabled = false
							}
						}
					}
				})

			},


			//将数组打乱
			shuffle: function(array) {
				if (!Array.isArray(array)) {
					return array;
				}
				for (var i = array.length - 1; i > 0; i--) {
					var j = Math.floor(Math.random() * (i + 1));
					[array[i], array[j]] = [array[j], array[i]]
				}
				return array;
			},


			spick_click: function() {


				this.isover = false
				this.allppbslist = this.shuffle(JSON.parse(JSON.stringify(parameters)))

				this.words = []
				this.select = []
				for (let i = 0; i < this.strword.length; i++) {

					this.getppbs(this.strword[i], i)

				}

				this.init()
			},







			pipei: function() {


				// 将arrayC中的code提取到一个Set中,以便快速查找
				let setC = new Set(this.select.map(item => item.code));




				for (let i = 0; i < this.words.length; i++) {

					if (!this.words[i].isbj) {
						let allChildCodesMatched = this.words[i].childcodes.every(code => setC.has(code));


						if (allChildCodesMatched) {
							this.words[i].color = "#f00"; // 如果全部匹配,将父元素的color设置为红色
							this.words[i].isbj = true

							for (let j = 0; j < this.words[i].childcodes.length; j++) {

								for (let z = 0; z < this.select.length; z++) {
									if (this.words[i].childcodes[j] == this.select[z].code) {
										this.select.splice(z, 1)
										if (this.select.length != 6) {
											this.isover = false

										}
										break

									}

								}

							}
							this.checkDisabled()
							return
						}

					}

				}

				if (this.select.length == 6) {
					this.isover = true
					uni.showToast({
						title: "结束",
						icon: "none"
					})
				} else {
					this.checkDisabled()
				}




			},




		}
	}
</script>

<style>
	.wenzi_page_main {
		background-color: #efefef;
		width: 100vw;
		height: 100vh;
	}

	.wenzi_main_view {

		margin-top: 26rpx;
		display: flex;
		flex-wrap: wrap;
		flex-direction: row;
		background: #fff;
		min-height: 32px;
		padding: 32rpx 32rpx 32rpx 32rpx;
	}

	.yixuan_main_view {
		width: 100%;
		margin-top: 26rpx;
		display: flex;
		flex-wrap: wrap;
		flex-direction: row;
		background-color: #efefef;
		min-height: 40px;
		padding: 32rpx 32rpx 32rpx 32rpx;
	}


	.item_image {
		width: 30px;
		height: 30px;
		border: 1rpx solid #efefef;
		margin: 2rpx;


	}

	.start_tv {
		width: 100vw;
		height: 80rpx;
		background-color: #fff;
		display: flex;
		justify-content: center;
		align-items: center;
		position: fixed;
		bottom: 0;
	}


	.bushou_main_view {
		display: block;
		height: 450rpx;
		width: 100vw;
		justify-content: center;
		align-items: center;
		position: relative;
		margin-top: 26rpx;
		margin-left: 100rpx;
		flex-wrap: wrap;
		flex-direction: row;
		background-color: #efefef;
		min-height: 32px;
		padding: 32rpx 32rpx 32rpx 32rpx;
	}



	.main {
		position: relative;
	}

	.item {
		position: absolute;
		color: #fff;
		display: flex;
		justify-content: center;
		align-items: center;
		border-radius: 10rpx;
		transition: left .3s, top .3s;
	}

	/* 如果被压在底下的颜色  应该是一种灰色 */
	.item:after {
		content: '';
		position: absolute;
		top: 0;
		bottom: 0;
		left: 0;
		right: 0;
		transition: background-color .3s;
	}

	/* 这个是为了   当配够  有disabled 属性的时候 就会透明掉 */
	.disabled:after {
		background-color: rgba(0, 0, 0, 0.7);
	}


	.add_button_view {
		display: flex;
		z-index: 4;
		/*row 横向  column 列表  */
		flex-direction: row;
		justify-content: center;
		align-items: center;
		text-align: center;
		height: 140rpx;
		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;
		margin-left: 16rpx;
		margin-right: 16rpx;
	}

	.not_add_button {

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

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

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

相关文章

DBeaver执行本地的sql语句文件避免直接在客户端运行卡顿

直接在客户端运行 SQL 语句和通过加载本地文件执行 SQL 语句可能会出现不同的性能表现&#xff0c;原因可能包括以下几点&#xff1a; 客户端资源使用&#xff1a; 当你在客户端界面直接输入和执行 SQL 语句时&#xff0c;客户端可能会消耗资源来维护用户界面、语法高亮、自动完…

基于STM32的智能电表可视化设计:ESP8266、AT指令集、python后端Flask(代码示例)

一、项目概述 随着智能家居的普及&#xff0c;智能电表作为家庭用电管理的重要工具&#xff0c;能够实时监测电流、电压及功率&#xff0c;并将数据传输至后台进行分析和可视化。本项目以STM32C8T6为核心&#xff0c;结合交流电压电流监测模块、ESP8266 Wi-Fi模块、OLED显示屏…

MySQL 如何赶上 PostgreSQL 的势头?

原文地址 我与 MySQL 社区的前辈交谈时&#xff0c;经常遇到这个问题&#xff1a;「为什么 MySQL 这么棒&#xff0c;而且&#xff08;至少根据 DB-Engines 的计算&#xff09;仍然比 PostgreSQL 更流行&#xff1b;但它的地位在下降&#xff0c;PostgreSQL 却势不可挡地越来越…

关于在windows系统中编译ffmpeg并导入到自己项目中这件事

关于在windows系统中编译ffmpeg并导入到自己项目中这件事 前因&#xff08;可跳过不看&#xff09; 前阵子由于秋招需求&#xff0c;写了一个简易的安卓播放器&#xff0c;最终因为时间问题还有一些功能没有实现着实可惜&#xff0c;如&#xff1a;倍速播放&#xff0c;快进操…

word中电流符号i或者j,这两个字母的头上的点会消失---完美解决办法

上图中&#xff0c;是我已经改好的格式。 具体解决办法是将公式转成LATEX格式&#xff0c;然后在字母i或者j前加上//&#xff0c;再转换会unicode&#xff0c;专业形式即可解决。更快的解决办法就是复制我在word文档里面写的。 word文档放在资源里面了&#xff0c;有需要自取即…

【C++】std::string和size()函数进阶解析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;基础知识&#xff1a;C 中的std::string字符串的基础概念size() 函数基础使用size()实例&#xff1a;计算字符串长度 &#x1f4af;基于size()的字符串解析和访问方式代码实…

《OpenCV计算机视觉实战项目》——银行卡号识别

文章目录 项目任务及要求项目实现思路项目实现及代码导入模块设置参数对模版图像中数字的定位处理银行卡的图像处理读取输入图像&#xff0c;预处理找到数字边框使用模版匹配&#xff0c;计算匹配得分 画出并打印结果 项目任务及要求 任务书&#xff1a; 要为某家银行设计一套…

【开发环境搭建篇】Visual Studio 2022 安装和使用

本文收录于 《C编程入门》专栏&#xff0c;从零基础开始&#xff0c;介绍C编程入门相关的内容&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、下载三、安装四、使用五、总结 一、前言 本文介绍如何在Windows环境下安装Visual Studio 2022。 什么是Vi…

【面试题】技术场景 5、日志采集ELK

日志采集的重要性与采集方式 重要性&#xff1a;在项目开发、测试及生产环境中&#xff0c;日志是定位系统问题的关键手段&#xff0c;对系统维护与问题排查至关重要。采集方式 常规采集&#xff1a;按天保存日志文件至专门目录&#xff0c;文件名包含项目名、端口及日期&…

matlab的绘图的标题中(title)添加标量以及格式化输出

有时候我们需要在matlab绘制的图像的标题中添加一些变量&#xff0c;这样在修改某些参数后&#xff0c;标题会跟着一块儿变。可以采用如下的方法&#xff1a; x -10:0.1:10; %x轴的范围 mu 0; %均值 sigma 1; %标准差 y normpdf(x,mu,sigma); %使用normpdf函数生成高斯函数…

element plus 使用 upload 组件达到上传数量限制时隐藏上传按钮

最近在重构项目&#xff0c;使用了 element plus UI框架&#xff0c;有个功能是实现图片上传&#xff0c;且限制只能上传一张图片&#xff0c;结果&#xff0c;发现&#xff0c;可以限制只上传一张图片&#xff0c;但是上传按钮还在&#xff0c;如图&#xff1a; 解决办法&…

简单说一下 类

类的定义 类是用来对一个实体&#xff08;对象&#xff09;进行描述&#xff0c;类就是用来描述这个对象具有一些什么属性。 类的定义格式 //创建类 class ClassName{ field; //简单概述为字段(属性)或者成员变量 method; //简单概述为行为或者是成员方法 } cl…

HOW - Form 表单 label 和 wrapper 对齐场景

一、背景 在日常使用 表单 时&#xff0c;我们一般有如下布局&#xff1a; 可以通过 Form 表单提供的配置直接设置&#xff1a; <Formform{form}labelCol{{ span: 4 }}wrapperCol{{ span: 20 }}onFinish{handleSubmit}><Form.Itemlabel"输入框"name"…

01 Oracle自学环境搭建(Windows系统)

1 Oracle12C安装 1.1 下载 官网地址&#xff1a;https://www.oracle.com/ 进入官网→Resource→Customer Downloads 如果没有登录&#xff0c;会提示登录后后才能下载 选择适合自己的版本&#xff08;我电脑是Windows系统 64位&#xff09; 选择需要的安装包进行下载 双击下载…

vue el-table 数据变化后,高度渲染问题

场景&#xff1a;el-table设置了height属性&#xff0c;但是切换查询条件后再次点击查询重新获取data时&#xff0c;el-table渲染的高度会有问题&#xff0c;滚动区域变矮了。 解决办法&#xff1a;使用doLayout方法‌&#xff0c;在表格数据渲染后调用doLayout方法可以重新布局…

vue3+ts+element-plus 输入框el-input设置背景颜色

普通情况&#xff1a; 组件内容&#xff1a; <el-input v-model"applyBasicInfo.outerApplyId"/> 样式设置&#xff1a; ::v-deep .el-input__wrapper {background-color: pink; }// 也可以这样设置 ::v-deep(.el-input__wrapper) {background-color: pink…

【漫话机器学习系列】044.热点对特性的影响(Effect Of One Hot On Feature Importance)

热点对特性的重要性影响&#xff08;Effect of One-Hot Encoding on Feature Importance&#xff09; 一热编码&#xff08;One-Hot Encoding&#xff09; 是处理类别型数据的常用方法&#xff0c;将每个类别特征转换为一组独立的二进制特征。这种方法在提高模型处理非数值数据…

使用MATLAB正则表达式从文本文件中提取数据

使用MATLAB正则表达式从文本文件中提取数据 使用Python正则表达式从文本文件中提取数据的代码请看这篇文章使用正则表达式读取文本数据【Python】-CSDN博客 文本数据格式 需要提取 V 后面的数据, 并绘制出曲线. index 1V 0.000000W 0.000000E_theta 0.000000UINV 0.0…

JAVA:Spring Boot 集成 JWT 实现身份验证的技术指南

1、简述 在现代Web开发中&#xff0c;安全性尤为重要。为了确保用户的身份&#xff0c;JSON Web Token&#xff08;JWT&#xff09;作为一种轻量级且无状态的身份验证方案&#xff0c;广泛应用于微服务和分布式系统中。本篇博客将讲解如何在Spring Boot 中集成JWT实现身份验证…

PHP进阶-在Ubuntu上搭建LAMP环境教程

本文将为您提供一个在Ubuntu服务器上搭建LAMP&#xff08;Linux, Apache, MySQL, PHP&#xff09;环境的完整指南。通过本文&#xff0c;您将学习如何安装和配置Apache、MySQL、PHP&#xff0c;并将您的PHP项目部署到服务器上。本文适用于Ubuntu 20.04及更高版本。 一、系统更新…