前端:运用HTML+CSS+JavaScript实现拼图游戏

2023-09-20 12:50:46

前一段时间突然来了一个想法,就是运用前端知识实现一个拼图游戏,但是不知道具体怎样实现。今天,想到既然实现不了现实中我们看到的那种拼块,那么就用正方形来代替吧!请添加图片描述
效果如下:
在这里插入图片描述
想到就是当小的图片块放到合适的位置上时,表示拼图完成。

1. 前端布局

运用css浮动样式,具体效果为:
请添加图片描述
两个div盒子,均采用左浮动,即它们的css样式表示为:float:left
至于小图片块交换位置动态效果,只是在css样式中设置这个属性即可。

.right li{
	transition: all 1s;
}

这个css属性小编觉得真的很不错,其实,现实中我们在网页端看到的轮播图等效果都有它的影子,实现一个轮播图只需用到相对定位和绝对定位、或者采用z-index等技术结合transition 等css属性可以完美实现(额外扩展一下!)
请添加图片描述

2. js脚本实现小图片块变换位置
1. 确定随机小图片块的选择

既然提到随机,那么肯定用到 Math.random() 这个函数呀!这个函数生成的随机数范围为0~1之间的随机小数,如果我们用 Math.floor(Math.random()Xnum),那么它的结果将是0~num(不包括num)。这个num为总的小图片块的总数,这样我们用生成的这个随机数即可确定一个小图片块的坐标,如 num = 37,每一行最多可以放小图片块数量为18,那么这个num表示的小图片块的位置为:(parseInt(num/18),num%18)=(2,1) ,通过这个坐标运用绝对定位相关知识,从而确定看到的效果中小图片块的样式位置。

let randomPosArr = [];
let randomMap = {},map2 = {};
let countSum = count_w * count_h;
// 小图片的总数
let i = 0;
while(i < randomNum){
	let pos = Math.floor(Math.random() * countSum);
	// 0 ~ 179
	let x = pos%count_w,y=Math.floor(pos/count_w);
	let pos_str = `${y},${x}`;
	if(randomMap[pos_str] === undefined){
		randomMap[pos_str] = true;
	}else{
		continue;
	}
	
	let num;
	while(true){
		num = Math.floor(Math.random() * randomNum);
		// 向下取整 0 ~ randomNum - 1 
		if(map2[num] === undefined){
			map2[num] = true;
			break;
		}
	}
	
	randomPosArr.push([y,x,num]);
	i ++;
}
2. 打乱随机小图片块的对应关系

虽然得到的随机生成的小图片的位置,那么怎样打乱它们的对应的关系呢?这里举一个例子,比如原来的顺序为 1,2,3,打乱之后,现在它们的顺序为2,3,1,即处于下标为0的1用2来占,下标为1的2用3来占,下标为2的3用1来占。这样的对应关系,不论随机小图片块的数量为奇数还是偶数,均可以打乱之间的顺序。
请添加图片描述

let posMap = {};
for(let i=0;i<randomNum;i++){
	let pos_y = randomPosArr[i][0],pos_x = randomPosArr[i][1],index = randomPosArr[i][2];
	let pos_str = `${pos_y},${pos_x}`;
	let pos3 = randomPosArr[index];
	let pos_str2 = `${pos3[0]},${pos3[1]}`;
	posMap[pos_str] = pos_str2;
}

这里没有用到随机函数 Math.random(),因为在上一个代码处,已经确定了,这里用 i 和生成的数组randomPosArr[i][2]来进行对应关系。

3. 点击小图片块进行拼图操作

当点击一个没有乱序的小图片块时,代码会给出相关提示。
请添加图片描述
当点击到一个乱序的图片时,就进行拼图操作,即把当前位置正确的小图片块拼回来,把当前图片放到当前位置正确的小图片块位置上。

function fun2(ele,v){
	let index = $(ele).attr('index'), index2 = $(ele).attr('index2');
	if(index2 === undefined || index2 === ''){
		alert('无需操作!');
		return;
	}
	// index2 当前位置
	else{
		let obj = fun3(index2);
		// console.log(obj);
		if(obj !== null){
			let _index2 = obj.attr('index2'),_arr2 = obj.attr('index').split(',');
			$(ele).attr('index2',_index2);
			obj.attr('index2','');
			// obj 已经回到原始位置,去掉index2属性中的值
			let _arr1 = _index2.split(',');
			
			obj.css({
				'top': parseInt(_arr2[0]) * param + 'px',
				'left': parseInt(_arr2[1]) * param + 'px'
			});
			
			$(ele).css({
				'top': parseInt(_arr1[0]) * param + 'px',
				'left': parseInt(_arr1[1]) * param + 'px'
			});
			
			if(fun4()){
				setTimeout(function(){
					alert('拼图成功!');
				},2000);
			}
		}
	}
}

fun2函数对应小图片块上的点击事件。

4. 更改小图片块的大小和小图片块的个数

代码头部这里进行修改参数即可。
请添加图片描述
【注】:上传的图片宽至少大于或等于900像素

5. 改进方案

小编觉得还可以加一个操作,就是当我们点击没有乱序的图片时,把当前图片再加几个小图片块加入到这个随机小图片块中,这样难度就高一些了,也更加完美,哈哈!
请添加图片描述

3. 实现参考代码和运行结果

参考代码已经上传到GitCode,链接为:拼图游戏.html
请添加图片描述
运行结果为:

前端:运用HTML+CSS+JavaScript实现拼图游戏

更多推荐

opencv滤波技术

文章目录前言一、均值滤波二、中值滤波三、高斯滤波四、双边滤波五、自适应滤波六、滤波器大小总结前言在OpenCV中,有多种滤波技术可以用于图像处理和图像增强。下面我将介绍五种常见的滤波技术,包括均值滤波、中值滤波、高斯滤波、双边滤波和自适应滤波,并提供相应的函数和使用方法。一、均值滤波均值滤波(MeanFiltering

rust迭代器

迭代器用来遍历容器。迭代器就是把容器中的所有元素按照顺序一个接一个的传递给处理逻辑。Rust中的迭代器标准库中定义了Iterator特性traitIterator{typeItem;fnnext(&mutself)->Option<Self::Item>;}实现了Iterator特性的结构体就是迭代器。很多类型都有it

线程、进程和管程

一、线程1.1定义线程:线程是进程中的实体,一个进程可以拥有多个线程,一个线程必须有一个父进程。线程有时被称为轻量级进程,是程序执行流的最小单元。线程的组成部分:1.线程ID:线程标识符2.当前指令指针(PC)3.寄存器集合:存储单元寄存器的集合4.堆栈:堆栈是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在

【Linux】自动化构建工具-make/Makefile详解

前言大家好吖,欢迎来到YY滴Linux系列,热烈欢迎!本章主要内容面向接触过Linux的老铁,主要内容含欢迎订阅YY滴Linux专栏!更多干货持续更新!以下是传送门!订阅专栏阅读:YY的《Linux》系列❀❀❀❀❀【Linux系列-P1】Linux环境的搭建【Linux系列-P2】Linux的基本知识与指令【Linux

HTTP、HTTPS协议详解

文章目录HTTP是什么报文结构请求头部响应头部工作原理用户点击一个URL链接后,浏览器和web服务器会执行什么http的版本持久连接和非持久连接无状态与有状态Cookie和Sessionhttp方法:get和post的区别状态码HTTPS是什么ssl如何搞到证书nginx中的部署加密CA数字证书hash算法对称加密非对

【雕爷学编程】MicroPython动手做(25)——语音合成与语音识别2

知识点:什么是掌控板?掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED显示屏、RGB灯、加速度计、麦克风、光线传感器、蜂鸣器、按键开关、触摸开关、金手指外部拓展接口,

【PostgreSQL】系列之 一 用户创建和授权(三)

🍁博主"开着拖拉机回家"带您GotoNewWorld.✨🍁🦄个人主页——🎐开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客🎐✨🍁🪁🍁希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥目录🍁博主"开着拖拉机回家"带您GotoNewWorld.✨🍁一、Postgre

掌握无人机遥感数据预处理的全链条理论与实践流程、典型农林植被性状的估算理论与实践方法、利用MATLAB进行编程实践(脚本与GUI开发)以及期刊论文插图制作等

目录专题一认识主被动无人机遥感数据专题二预处理无人机遥感数据专题三定量估算农林植被关键性状专题四期刊论文插图精细制作与Appdesigner应用开发近地面无人机植被定量遥感与生理参数反演更多推荐遥感技术作为一种空间大数据手段,能够从多时、多维、多地等角度,获取大量的农情数据。数据具有面状、实时、非接触、无伤检测等显著优

【Spring Boot】单元测试

单元测试单元测试在日常项目开发中必不可少,SpringBoot提供了完善的单元测试框架和工具用于测试开发的应用。接下来介绍SpringBoot为单元测试提供了哪些支持,以及如何在SpringBoot项目中进行单元测试。1.SpringBoot集成单元测试单元测试主要用于测试单个代码组件,以确保代码按预期方式工作。目前流

入门Echarts数据可视化:从基础到实践

目录引言数据可视化的重要性Echarts资源与拓展Echarts简介及开发准备什么是EchartsEcharts的特点与优势安装Echarts引入Echarts库第一个图表使用Echarts绘制一个简单的柱状图数据准备与图表配置数据格式要求图表标题与标签设置实践与性能优化提升图表渲染性能的技巧响应式设计与移动端适配引言

数据分析实战│价格预测挑战【文末赠书】

文本分析是指对文本信息的表示及特征项的选取,商品文本的描述能够反映特定立场、观点、价值和利益。考虑到网上海量的商品数量,对产品的定价难度很大,因此可以使用商品描述帮助商户定价。比如,服装具有较强的季节性价格趋势,受品牌影响很大,而电子产品则根据产品规格波动。因此,根据商品提供的文本信息进行合理地定价,能够有效地帮助商家

热文推荐