Web前端项目-拼图游戏【附源码】

拼图游戏

拼图游戏是一种经典的益智游戏,通过HTMLCSSJavaScript等前端技术的综合运用来实现;拼图游戏可以锻炼玩家的观察能力、空间认知能力和逻辑思维能力。游戏开始时,一张图片会被切割成多个小块,并以随机顺序排列在游戏区域内。玩家需要通过点击并拖拽小块来移动它们的位置,以恢复原始图片

运行效果:
在这里插入图片描述
在这里插入图片描述

一:index.html

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>拼图</title>
<link type="text/css" rel="stylesheet" href="css/mgame2.css" />
<script src="js/jquery.js"></script>
<script src="js/mgame2.js"></script>
</head><body>
<div class="cover"><div class="cover_bg"></div><div class="cover_inner"><p style="margin-bottom: 10px;"><button class="startGame">开始游戏</button></p><p class="choice-level"><select><option value="3">简单</option><option value="4">中等难度</option><option value="5">高难</option><option value="6">令人发疯的</option><option value="7">使人癫狂的</option></select></p></div>
</div>
<div class="piece_container" points="1">
</div>
<div class="rule-description"><p>在10秒内完成拼图会有奖励的哦</p><p>移动<span class="over-step">0</span></p><p>用时<span class="over-time">0</span></p><p><button>恢复</button></p>
</div>
</body>
</html>

二:mgame2.css

@charset "utf-8";
* {margin: 0;padding: 0;
}body {font-family: "微软雅黑", "宋体", "黑体";font-size: 13px;
}.piece_container {width: 320px;height: 310px;margin: auto;text-align: center;overflow: hidden;
}
.piece_container div {float: left;margin: 1px;
}.cover {position: relative;z-index: 998;
}.cover_bg {position: absolute;width: 100%;opacity: 0.7;z-index: 999;background: #000;
}
.cover_inner {position: absolute;z-index: 1000;
}.rule-description {text-align: center;
}
.rule-description .over-time {color: red;
}
.rule-description p {text-align: center;margin: auto;
}
.rule-description .over-step {color: green;
}

三:mgame2.js

var points = 1,timeCount = 0,//设置起始游戏时间timer = null,stepCount = 0,level = 3;//规定拼图的方块数3*3或者4*4
var puzzleGame = function(){var square,sort=0;for(var i = 0; i < level; i++){for(var j = 0; j < level; j++){square = document.createElement("div");$(square).css({"width": 300/level,"height": 300/level,"background": "url(img/1.gif) no-repeat","backgroundPosition": -j*300/level +"px "+(-i)*300/level + "px"})sort++;$(square).attr({"sort": sort//给各个小方格加上正确的顺序})$(".piece_container").append(square);}}init();
}
init = function(){var pageLeft = 0,pageTop = 0,getStartX = 0,getStartY = 0,floatLayer = "",getSort = "",getBkP="",nextCheck = "<button class='nextcheck'>下一关</button>",playAgain = "<button class='playagain'>再来一次</button>";//按下方格触发方法$("div[sort]").on("touchstart mousedown",function(e){e.preventDefault();if(floatLayer != ""){floatLayer.remove();}var getEvent = window.event || arguments.callee.caller.arguments[0];//获取触发事件的元素thisE = getEvent.target;//获取鼠标按下时的方格if(getEvent.changedTouches){//手机情况下if(getEvent.changedTouches.length == 1){var thisElement = getEvent.target;getSort = $(thisElement).attr("sort");//获取触摸时的元素的sortgetBkP = $(thisElement).css("backgroundPosition");var getBkImg = $(thisElement).css("backgroundImage");var getPoints = parseInt($(thisElement).parents(".piece_container").attr("points"));floatLayer = $(document.createElement("div")).attr({"sort": getSort}).css({"backgroundPosition":getBkP, "backgroundImage": getBkImg, "position": "fixed", "width": 300/level,"height": 300/level});//创建浮层并加上样式//取得手指相对于文档的边距getStartX = getEvent.changedTouches[0].pageX;getStartY =  getEvent.changedTouches[0].pageY;pageLeft = $(thisElement).offset().left;pageTop = $(thisElement).offset().top;floatLayer.css({top: pageTop+1, left: pageLeft+1});floatLayer.appendTo("body");}}else {//电脑情况下var thisElement = getEvent.target;getSort = $(thisElement).attr("sort");//获取点击时的元素的sortgetBkP = $(thisElement).css("backgroundPosition");var getBkImg = $(thisElement).css("backgroundImage");var getPoints = parseInt($(thisElement).parents(".piece_container").attr("points"));floatLayer = $(document.createElement("div")).attr({"sort": getSort}).css({"backgroundPosition":getBkP, "backgroundImage": getBkImg, "position": "fixed", "width": 300/level,"height": 300/level});//创建浮层并加上样式//取得手指相对于文档的边距getStartX = getEvent.pageX;getStartY =  getEvent.pageY;pageLeft = $(thisElement).offset().left;pageTop = $(thisElement).offset().top;floatLayer.css({top: pageTop+1, left: pageLeft+1});floatLayer.appendTo("body");}return true;})//移动手指或鼠标触发事件$(document).on("touchmove mousemove",function(e){e.preventDefault();//获取触发touchmove的对象var getEvent = window.event || arguments.callee.caller.arguments[0];if(getEvent.changedTouches){if(getEvent.changedTouches.length == 1){//确保只有一个手指//获取手指的位置var getCurrentX = getEvent.changedTouches[0].pageX;var getCurrentY = getEvent.changedTouches[0].pageY;}}else{//获取鼠标的位置var getCurrentX = getEvent.pageX;var getCurrentY = getEvent.pageY;}if(floatLayer){floatLayer.css({top: getCurrentY - (getStartY - pageTop), left: getCurrentX - (getStartX - pageLeft)});//决定图层的样式}})//手指离开触发事件$(document).on("touchend mouseup",function(e){e.preventDefault();var getEvent = window.event || arguments.callee.caller.arguments[0];//获取触发事件的元素if(floatLayer){//取得浮层的位置var getLayerX = floatLayer.offset().left;var getLayerY = floatLayer.offset().top;var layerValX = parseInt(getLayerX);var layerValY = parseInt(getLayerY);var layerCenterX = layerValX + floatLayer.width()/2;var layerCenterY = layerValY + floatLayer.height()/2;floatLayer.remove();//删除浮层var piece = $("div[sort]");for(var i=0; i<piece.length; i++){//取得每一个小方格的位置var getPieceX = $(piece[i]).offset().left;var getPieceY = $(piece[i]).offset().top;var pieceValX = parseInt(getPieceX);var pieceValY = parseInt(getPieceY);var pieceEndX = pieceValX+$(thisE).width();var pieceEndY = pieceValY+$(thisE).height();if(stepCount <= 40){//限制最多移动的步数if((pieceValX < layerCenterX && pieceValY < layerCenterY) && (pieceEndX > layerCenterX && pieceEndY > layerCenterY)){var getEndSort = $(piece[i]).attr("sort");//手指或鼠标松开时所在的方格var getEndBkP = $(piece[i]).css("backgroundPosition");if(getEndSort != getSort){//确定把浮层移动到了另外一个方格stepCount++;$(thisE).attr("sort",getEndSort).css("backgroundPosition",getEndBkP);$(piece[i]).attr("sort",getSort).css("backgroundPosition",getBkP);$(".over-step").text(stepCount);}}}else{$("p.choice-level").remove();//移除选择关卡$(".cover").find("button").remove();$(".cover .cover_inner").prepend(playAgain);$(".cover").show().css("opacity",1);alert("真笨!都N步了,还弄不完???");clearInterval(timer);break;}}pageLeft = 0;pageTop = 0;getStartX = 0;getStartY = 0;floatLayer = "";getSort = "";getBkP = "";for(var i=0; i < piece.length; i++){//如果排序正确,继续往下执行!否则返回var getSortVal = parseInt($(piece[i]).attr("sort"));var number = i+1;if(getSortVal == number){continue;}else{return;}}if(timeCount <= 70){alert("♡♡♡♡♡♡大神!用时" + $(".rule-description .over-time").text() +"秒 "+"♡♡♡♡♡♡!我好崇拜你啊!");$(".cover").find("button.startGame").text("再来一次");$(".cover_inner button.startGame").remove();//移除开始游戏按钮$("p.choice-level").remove();//移除选择关卡//下一关if($(".nextcheck").length == 0){//如果没有下一关按钮,就加上一个$(".cover .cover_inner").prepend(nextCheck);}if($(".playagain").length == 0){$(".cover .cover_inner").prepend(playAgain);}$(".cover_inner button.playagain").one("touchstart click", function(){//再来一次timeCount = 0;stepCount = 0;$(".rule-description .over-time").text(timeCount);$(".rule-description .over-step").text(stepCount);$(this).parents(".cover").animate({"opacity": 0},2000,function(){$(this).hide();});setTimeout(upsetPiece, 2000);})if(!$._data($(".cover_inner button.nextcheck")[0], "events")){//判断是否绑定了事件,如果绑定了,就不再继续绑定$(".cover_inner button.nextcheck").one("touchstart click", function(){if(points == 10){//设定通关的关数alert("你已经通关了。这个世界已经没有什么可以阻止你了!去做任何你想做的事情吧!");return;}$(this).parents(".cover").animate({"opacity": 0},2000,function(){$(this).hide()});points++;timeCount = 0;stepCount = 0;$(".rule-description .over-time").text(timeCount);$(".rule-description .over-step").text(stepCount);$(".piece_container").attr("points", points);$(".piece_container div[sort]").css("backgroundImage","url(img/" + points + ".gif)");//去掉上一关卡的样式,加上本关卡的样式var cover2 = "<div id='white-cover' style='width: 100%; height: 100%; position: fixed; top: 0; left: 0; text-align: center'><h1 style='margin-top: 120px; opacity: 0.6; background: #fff; padding: 8px;'>请记住这张图,点击屏幕任意位置开始游戏</h1></div>"$("body").append(cover2);$("#white-cover").on("touchstart click", function(){$(this).remove();upsetPiece();})$(this).off("touchstart click");//解除点击事件,防止冒泡})}$(".cover").show().css("opacity",1);}else{//时间过长则不能进入下一关alert("用这么长时间?太慢了!!等得我花都谢了!");$("p.choice-level").remove();$(".cover").find("button").remove();$(".cover .cover_inner").prepend(playAgain);$(".cover").show().css("opacity",1);}clearInterval(timer);}else{return;}})
}//创建一个没有重复数字的随机数组,并打乱方格的顺序
function upsetPiece(){if(timeCount >= 0){timer = setInterval(setTime,1000);}var pieceArr = $(".piece_container div[sort]"),randomArr = [],//创建一个随机数数组bkPArr = [];//创建一个数组,用来存储每个方格背景的定位!//取得每个方格的背景元素的定位for(var i=0; i< pieceArr.length; i++){bkPArr.push($(pieceArr[i]).css("backgroundPosition"));}for(var i=0; i< pieceArr.length; i++){var random = Math.floor(Math.random()*(level*level+1));if(random != 0){if(randomArr.length == 0){randomArr.push(random);}else{var la = 0;for(var j=0; j < randomArr.length; j++){if(randomArr[j] == random){i--;break;}la++;}if(la == randomArr.length){randomArr.push(random);}}}else{i--;continue;}}//打乱方格的顺序for(var i=0; i<randomArr.length; i++){$(pieceArr[i]).css("backgroundPosition",bkPArr[parseInt(randomArr[i])-1]);$(pieceArr[i]).attr("sort",randomArr[i]);}
}//倒计时方法
function setTime(){timeCount++;$(".rule-description .over-time").text(timeCount);
}$(document).ready(function(){$(".cover_bg").css("height",$(document).height());//黑色背景高度$(".cover_inner").css({//将按钮放在屏幕中央"left": $(document).width()/2 - $(".cover_inner").width()/2,"top": $(document).height()/2 - $(".cover_inner").height()/2});//点击 开始按钮$(".cover_inner button.startGame").on("touchstart click", function(e){level = $(".choice-level").find("option:selected").val();puzzleGame();clearInterval(timer);$(this).parents(".cover").animate({"opacity": 0},2000,function(){$(this).hide();});var cover2 = "<div id='white-cover' style='width: 100%; height: 100%; position: fixed; top: 0; left: 0; text-align: center'><h1 style='margin-top: 120px; opacity: 0.5; background: #fff; padding: 8px;'>请记住这张图,点击屏幕任意位置开始游戏</h1></div>"$("body").append(cover2);$("#white-cover").on("touchstart click", function(){$(this).remove();upsetPiece();})})//恢复按钮$(".rule-description button").on("touchstart click",function(){clearInterval(timer);upsetPiece();timeCount = 0;stepCount = 0;$(".rule-description .over-time").text(timeCount);$(".rule-description .over-step").text(stepCount);})
})

注意:

由于博客字数限制,本篇文章所展示的代码并不全面(其实在导入一个jquery.js和图片就可以运行啦)。关于本项目的完整代码随后会上传资源(记得关注哦),大家可以自行去下载~ ~ ~

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

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

相关文章

CMOS图像传感器——列噪声(CFPN)去除

目前CMOS 图像传感器系统中列共用结构应用最为广泛,在该结构中,虽然像素曝光均匀,但是由于列输出系统处理属性的变动,对于不同列,像素的输出是不均匀的。因此,基于列的CMOS 图像传感器表现出垂直条纹固定模式噪声(CFPN),从而降低了图像的质量。由于人眼 的关系,CFPN …

「布道师系列文章」宝兰德徐清康解析 Kafka 和 AutoMQ 的监控

作者&#xff5c;北京宝兰德公司解决方案总监徐清康 01 前言 当我们使用一个软件的时候&#xff0c;经常都会问这个软件怎么监控、监控他的哪些指标&#xff1f;Kafka 的监控挺长时间都是一个老大难的问题&#xff0c;社区在监控方面一直没有投入太大的精力。如果要实现一…

kotlin 中的字符串

一、字符类访问 1、字符串的访问跟js一样&#xff0c;可以使用索引来访问或者直接循环。 fun main() {val a: String "2024"// 方式一&#xff1a;for (item in a) {println(item) // 输出每一个字符}// 方式二&#xff1a;println("${a[0]}, ${a[1]}, ${a[2…

IAP固件升级进阶(Qt上位机)

前言 时隔近一年&#xff0c;再次接触IAP固件升级&#xff0c;这次修改了以前的一些bug&#xff0c;同时新增一些实用性的功能。 有纰漏请指出&#xff0c;转载请说明。 学习交流请发邮件 1280253714qq.com。 上位机界面 视频演示 当Up对iap固件升级的机制有了更深的理解后…

【C++】类和对象的引入

文章目录 前言一、类的定义二、类的访问控制与封装三、类的作用域四、类的实例化五、类的存储方式及大小计算六、隐藏的this指针 前言 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&…

算法题解记录29+++全排列(百日筑基)

一、题目描述 题目难度&#xff1a;中等 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示…

iCopy for Mac 剪切板 粘贴工具 历史记录 安装(保姆级教程,新手小白轻松上手)

Mac分享吧 文章目录 效果可留存文本、图片、文件等复制历史记录也可根据关键字进行历史记录检索点击一下&#xff0c;可复制双击两下&#xff0c;复制内容&#xff0c;并将信息粘贴至鼠标指针处 一、准备工作二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹…

Audio2Face相关建模BS绑定对应表

文章说明 相信大家都可以在网上看到52点位的ARKit绑定对照表&#xff0c;但英伟达旗下Audio2Face这款软件出来的数据应该如何映射到BS上边&#xff0c;都比较迷茫。 所以对于Unity方面的46点位在建模时的对照图&#xff0c;我这边总结了一下。发出来供大家参考&#xff0c;如果…

简易版 | 代码生成器(包含插件)

一、代码生成器 先导入依赖 <!-- Mybatis-Plus --> <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.6</version> </dependency><!-- 代码生成器 --…

Cisco Packet Tracer实验(五)不同vlan间的通信简单配置

1&#xff0e;单臂路由(图) 环境&#xff1a;一台路由器&#xff0c;一台二层交换机&#xff0c;两台pc机 单臂路由&#xff08;Single Arm Routing&#xff09;是指在网络架构中&#xff0c;只有一个物理接口&#xff08;单臂&#xff09;连接到路由器三层交换机&#xff0c;而…

碉堡了!云原生大佬撰写的K8s学习指南,有点炸裂,建议运维都收藏!

在这个数字化转型的时代&#xff0c;容器化和云原生技术已成为软件开发的重要趋势。【Kubernetes】作为云原生领域的旗舰项目&#xff0c;不仅是一种容器编排工具&#xff0c;更是构建现代、弹性和可扩展应用程序的基础平台。 因此&#xff0c;对于运维人员来说&#xff0c;学…

基于51单片机的音乐彩灯设计

基于51单片机的音乐彩灯设计 &#xff08;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 由STC单片机ADC0809模块LM386功放模块喇叭音频接口发光二极管电源构成 1.通过音频线输入可以播放电脑、手机、MP3里面的音乐。 2.AD对音频…

17.零代码八爪鱼采集器数据采集与数据导出——如何导出不同格式数据和数据推送到数据库

首先&#xff0c;多数情况下免费版本的功能&#xff0c;已经可以满足绝大多数采集需求&#xff0c;想了解八爪鱼采集器版本区别的详情&#xff0c;请访问这篇帖子&#xff1a; 3.无代码爬虫八爪鱼采集器工具介绍——个人版本、团队版本的适用性_八爪鱼采集器 有单机版本吗-CSDN…

苹果电脑病毒怎么处理 苹果电脑病毒查杀用什么软件 苹果电脑病毒软件

苹果电脑并不是完全免疫于病毒的威胁&#xff0c;尤其是在使用了一些不安全的软件或网站后&#xff0c;可能会感染一些恶意程序&#xff0c;导致电脑运行缓慢&#xff0c;数据丢失&#xff0c;甚至被黑客控制。那么&#xff0c;苹果电脑病毒怎么处理呢&#xff1f;苹果电脑病毒…

vue分页

先看效果 再看代码 <!-- 分页 --><div v-if"pageParams.pageCount > 1" class"flex justify-end mt-6"><n-paginationv-model:page"pageParams.page" v-model:page-size"pageParams.pageSize" :page-count"pa…

Hazelcast 分布式缓存 在Seatunnel中的使用

1、背景 最近在调研seatunnel的时候&#xff0c;发现新版的seatunnel提供了一个web服务&#xff0c;可以用于图形化的创建数据同步任务&#xff0c;然后管理任务。这里面有个日志模块&#xff0c;可以查看任务的执行状态。其中有个取读数据条数和同步数据条数。很好奇这个数据…

羊城杯 2020 a_piece_of_java

考点:JDBC反序列化打CC链动态代理类触发readobject 一眼看过去 好像只有一个mysql-connector-java 可以利用jdbc 可能的攻击路径就有1) Mysql服务器任意文件读取 2) JDBC反序列化打依赖链 出现了一个不常见的依赖库 serialkiller 做了反序列化的过滤器 可以尝试查看其源码 htt…

2000-2022年上市公司员工、工资数据

2000-2022年上市公司员工、工资数据 1、时间&#xff1a;2000-2022年 2、来源&#xff1a;上市公司年报 3、指标&#xff1a;年份、股票代码、股票简称、行业名称、行业代码、省份、城市、区县、行政区划代码、城市代码、区县代码、首次上市年份、上市状态、员工人数_人、应…

Windows 与 Java 环境下的 Redis 利用分析

1 前言 在最近的一次攻防演练中&#xff0c;遇到了两个未授权访问的 Redis 实例。起初以为可以直接利用&#xff0c;但后来发现竟然是Windows Java (Tomcat)。因为网上没有看到相关的利用文章&#xff0c;所以在经过摸索&#xff0c;成功解决之后决定简单写一写。 本文介绍了…

【工程2区】毕业神刊 —— 1-2个月录用!非黑!非预警!

【欧亚科睿学术】 电力能源类SCIE ✅ 进展超顺 ✅ 录用率高 ✅ 领域相关均可 【期刊简介】IF&#xff1a;1.0-2.0&#xff0c;JCR2区&#xff0c;中科院4区 【版面类型】正刊&#xff0c;仅少量版面 【终审周期】走期刊部系统&#xff0c;预计3个月左右录用 【检索情况…