拼图游戏

使用JS制作了一款拼图游戏供大家参考。

原理分析:
1.鼠标的点击和松开事件
2.显示原图作为参考
3.方块的移动替换
4.是否完成拼图的判断
5.完成之后会弹窗提示

效果演示

在这里插入图片描述

代码展示

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>拼图游戏</title></head><style>body,html {padding: 0px;margin: 0px;background: #eee;}#fangkuai {width: 460px;height: 460px;margin: 20px auto;background: #F9F9F9;padding: 1px 1px;position: relative;}#maskBox {opacity: 0.5;display: block;}#tu img {width: 120px;height: 120px;}#tu {width: 130px;height: 130px;margin-left: 150px;}</style><body><div style="width:460px;margin:20px auto;text-align:center;line-height:30px;">游戏玩法:点击选中一个方块,在点击放在对应的方块里。</div><div id="tu"><font>参考原图</font><img src="true.png" /></div><div id="fangkuai"></div></body><script>window.onload = function() {//生成函数gameInfo.init();}</script><script>(function($g) {//游戏配置setting = {gameConfig: {url: "true.png",id: "fangkuai",//生成规格横4 纵4size: "4*4",//每个元素的间隔margin: 1,//拖动时候块透明度opacity: 0.8},setElement: {type: "div",id: "",float: "",display: "",margin: "",background: "",width: "",height: "",left: "",top: "",position: "",opacity: 0.4,animate: 0.8}};//元素生成参数var sg = setting.gameConfig;var st = setting.setElement;var gameInfo = function() {};gameInfo.prototype = {init: function() {this.creatObj();this.eventHand();},sortObj: {rightlist: [], //正确的排序romdlist: [] //打乱后的排序},creatObj: function() {sg.boxObj = document.getElementById(sg.id) || "";//尺寸自动获取var size = sg.size.split('*') || [0, 0];//计算单个div的高宽var w = Math.floor(sg.boxObj.offsetWidth / size[0]);var h = Math.floor(sg.boxObj.offsetHeight / size[1]);//图片生成divvar size = sg.size.split('*') || [0, 0];var wt = size[0],hg = size[1];var sortList = [];for (var a = 0; a < wt * hg; a++) {sortList.push(a);}sortList.sort(randomsort);this.sortObj.rightlist = sortList;var _i = 0,sid = 0;for (; _i < wt; _i++) {var _s = 0;for (; _s < hg; _s++) {//赋值随机打散后的idst.id = sortList[sid++];st.display = "block";st.float = "left";st.margin = sg.margin + "px";st.background = "url('" + sg.url + "') " + (-w * _s) + "px " + (-h * _i) + "px";st.width = w - sg.margin * (wt / 2) + "px";st.height = h - sg.margin * (hg / 2) + "px";this.sortObj.romdlist.push(this.addElement());}}this.boxSort();},boxSort: function() {var _arrySort = this.sortObj.romdlist;var _tmp = [],_n = 0;eachBox(_arrySort, function(d) {_tmp.push(parseInt(_arrySort[d].id));});_tmp.sort(function(a, b) {return a > b ? 1 : -1;});for (; _n < _tmp.length; _n++) {var _s = 0;for (; _s < _arrySort.length; _s++) {if (_arrySort[_s].id == _tmp[_n]) {sg.boxObj.appendChild(_arrySort[_s]);}}}return _tmp;},addElement: function() {var obj = document.createElement(st.type);obj.id = st.id;obj.style.display = st.display;obj.style.float = st.float;obj.style.margin = st.margin;obj.style.background = st.background;obj.style.width = st.width;obj.style.position = st.position;obj.style.top = st.top;obj.style.left = st.left;obj.style.height = st.height;return obj;},mouseEvent: {mousedown: function(ev) {ev = ev || ev.event;ev.preventDefault();st.type = "span";st.id = "maskBox";st.width = this.offsetWidth + "px";st.height = this.offsetHeight + "px";st.position = "absolute";st.background = "";st.left = this.offsetLeft + "px";st.top = this.offsetTop + "px";},mouseup: function(ev) {ev = ev || ev.event;ev.preventDefault();var obj = document.getElementById(this.id);if (obj) {sg.boxObj.removeChild(obj);}},mousemove: function(ev) {ev = ev || ev.event;this.style.left = getX_Y.call(this, "x", ev) + "px";this.style.top = getX_Y.call(this, "y", ev) + "px";}},gameCheck: function() {var s = 0,bols = true;var _arry = this.sortObj.rightlist;var _arryRom = this.sortObj.romdlist;console.log(_arry);console.log(_arryRom);for (; s < _arry.length; s++) {if (_arry[s] != _arryRom[s].id) {bols = false;break;}}return bols;},eventHand: function() {var obj = sg.boxObj.getElementsByTagName("div");var i = 0,olen = obj.length;var that = this;var m = that.mouseEvent;var box_index = 0;for (; i < olen;) {(function(n) {//按下鼠标obj[n].addEventListener("mousedown", function(e) {var _this = this;m.mousedown.call(_this, e);st.background = _this.style.background;_this.style.background = "#FFF";var _newObj = that.addElement();sg.boxObj.appendChild(_newObj);_newObj.style.opacity = sg.opacity;//移动位置_newObj.onmousemove = function(e) {m.mousemove.call(_newObj, e);var _i = 0;for (; _i < olen; _i++) {var _w = parseInt(obj[_i].style.width) / 1.5;var _h = parseInt(obj[_i].style.height) / 1.5;var _left = obj[_i].offsetLeft;var _top = obj[_i].offsetTop;var _boxX = parseInt(this.style.left);var _boxY = parseInt(this.style.top);eachBox(obj, function(d) {obj[d].style.opacity = 1.0;});if (_left + _w > _boxX || _left > _boxX + _w) {if (_top + _h > _boxY || _top > _boxY + _h) {box_index = _i;obj[_i].style.opacity = st.opacity;break;}}}};//鼠标松开_newObj.addEventListener("mouseup", function(e) {_newObj.onmousemove = function(e) {};//获取当前停留元素的坐标var tagObj = {id1: obj[box_index].id,id2: _this.id,bg1: obj[box_index].style.background,bg2: this.style.background};//交换位置_this.id = tagObj.id1;_this.style.background = tagObj.bg1;obj[box_index].id = tagObj.id2;obj[box_index].style.background = tagObj.bg2;that.sortObj.romdlist = obj;//还原样式eachBox(obj, function(d) {obj[d].style.opacity = 1.0;});m.mouseup.call(_newObj, e);//判断是否完成拼图if (that.gameCheck()) {alert("好棒呀!!!");}}, false);}, false);})(i++);}}}//随机数function randomsort(a, b) {return Math.random() > .5 ? -1 : 1;}function eachBox(obj, fn) {var _s = 0;for (; _s < obj.length; _s++) {fn(_s);}}function getX_Y(s, ev) {var _b = (ev.clientX - this.parentNode.offsetLeft) - (this.offsetWidth / 2);if (s === "y") {_b = (ev.clientY - this.parentNode.offsetTop) - (this.offsetHeight / 2);}return _b;}$g.gameInfo = new gameInfo();})(window)</script>
</html>

参考上述代码赶快去试试吧。

了解更多关注我哟!!!

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

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

相关文章

【youcans 的 OpenCV 例程200篇】122. 形态算法之边界提取

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程 200 篇】122. 形态算法之边界提取 3. 形态学算法 形态学处理的主要应用是提取图像中用来表示和描述形状…

人机协作机器人发展趋势_发那科童梁:机器人化不是时髦!有效的人机协作投资回报率更高...

编者按&#xff1a;此文是根据上海发那科机器人有限公司技术部部长童梁于2019年5月在浙江宁波余姚举行的第六届中国机器人峰会上的《物联网浪潮下的智能制造》报告录音整理摘编部分而成&#xff0c;题目为编者所加。随着“中国制造2025”的不断推进&#xff0c;越来越多制造业企…

做一个关于我和她微信聊天记录的爱心词云图

前言&#xff1a; 因为最近接触到了词云图&#xff0c;所以就想做一个关于和女朋友聊天的词云图,但是现在很少使用QQ了&#xff0c;所以就不得不使用微信导出聊天记录。于是我坐在电脑面前查阅资料查了一天&#xff0c;但是在走到快导出微信聊天记录的时候&#xff0c;还是被…

【youcans 的 OpenCV 例程200篇】123. 形态算法之孔洞填充

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程 200 篇】123. 形态算法之孔洞填充 3. 形态学算法 形态学处理的主要应用是提取图像中用来表示和描述形状…

弹框提示

jquery弹框提示框的实现。 原理分析 1.点击按钮出现弹框 2.设置弹框标题和内容 3.设置取消和确定两个按钮 4.点击确定继续执行 5.点击取消返回此页面 效果演示 原始样式 点击之后 点击确认按钮 代码演示 在开始我们的程序之前注意&#xff1a; 引入Jquery.js架包 <…

el-tooltip位置不灵活_美团研究院:超五成生活服务业商户有灵活用工需求

更多精彩&#xff0c;请点击上方蓝字关注我们&#xff01;美团研究院于 9 月 15 日发布《生活服务业新就业形态和灵活就业的发展特征和发展趋势》报告&#xff0c;报告指出我国目前灵活用工岗位类型众多&#xff0c;是从业者的重要收入来源&#xff0c;从业者通过灵活就业拓宽了…

【youcans 的 OpenCV 例程200篇】124. 孔洞填充的泛洪算法

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程 200 篇】124. 孔洞填充的泛洪算法 3. 形态学算法 形态学处理的主要应用是提取图像中用来表示和描述形状…

域名可以转让注册人吗_网店可以转让吗?

随着经济市场的快速发展&#xff0c;市场决定需求&#xff0c;所以有很多人紧跟时代&#xff0c;选择了天猫店铺。有一些人想可以不可以购买网店&#xff0c;网店可以转让吗&#xff0c;可以直接经营吗&#xff1f;还有一些人在一同经营之后&#xff0c;或许是业绩不佳或许是有…

java - 菱形输出

程序首先会让你输入一个奇数&#xff0c;即将要生成菱形的总行数&#xff0c;当你输入奇数后按Enter按键就会在控制台看到此菱形了。 效果演示&#xff1a; 代码展示 package com.zsh;import java.util.Scanner;public class lingxing {public static Scanner input new Sc…

MySQL的DDL(数据定义语言)

笔记本 SQL语言一共分为4大类&#xff1a; DQL&#xff08;数据查询语言&#xff09;、 DDL&#xff08;数据定义语言&#xff09;、 DML&#xff08;数据操纵语言&#xff09;、 DCL &#xff08;数据控制语言&#xff09; 本文就介绍的是其中的DDL&#xff08;Data D…

【youcans 的 OpenCV 例程200篇】125. 形态算法之提取连通分量

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程 200 篇】125. 形态算法之提取连通分量 3. 形态学算法 形态学处理的主要应用是提取图像中用来表示和描述…

2评分标准多少分_高新企业认定评分标准,需要多少分才能拿到高新认证证书...

在高新技术企业认定工作中&#xff0c;企业要想成功拿到高新认证证书&#xff0c;那么就必须要符合高新企业认定评分标准&#xff0c;只有达到异地拿到评分数之后&#xff0c;企业才有可能拿到高新认证证书。根据相关文件的规定&#xff0c;我们在申请高新企业认定过程中&#…

java - 猴子吃桃

著名的猴子吃桃问题&#xff0c;计算摘桃子的个数。 猴子吃桃问题&#xff1a;猴子第一天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不瘾&#xff0c;又多吃了一个 第二天早上又将剩下 的桃子吃掉一半&#xff0c;又多吃了一个。以后每天早上都吃了前一天剩下 的一…

【youcans 的 OpenCV 例程200篇】126. 形态算法之凸壳(Convex hull)

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程 200 篇】126. 形态算法之凸壳 3. 形态学算法 形态学处理的主要应用是提取图像中用来表示和描述形状的元…

java - 人员分配组合

在进行体育赛事比赛的时候往往会因为对比赛队员的组合排序而烦恼&#xff0c; 下面程序能够帮助进行队列组合的分配。 有两个乒乓球队进行比赛&#xff0c;各出三人。甲队为 a,b,c 三人&#xff0c;乙队为 x,y,z 三人。已抽签决定比赛名单。 有人向队员打听比赛的名单。a 说他…

【youcans 的 OpenCV 例程200篇】127. 形态算法之细化

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程 200 篇】127. 形态算法之细化 3. 形态学算法 形态学处理的主要应用是提取图像中用来表示和描述形状的元…

【youcans 的 OpenCV 例程200篇】128. 形态算法之骨架 (skimage)

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程200篇】128. 形态算法之骨架 (skimage) 3. 形态学算法 形态学处理的主要应用是提取图像中用来表示和描述…

java -从小到大排序

用java程序对几个数字进行排序并按照从小到大输出。 结果演示 代码展示 package com.zsh;import java.util.Arrays; import java.util.Scanner;public class paixu {public static Scanner input new Scanner(System.in);public static void main(String[] args) {long sta…

车联网大数据框架_大数据基础:ORM框架入门简介

作为大数据开发技术者&#xff0c;需要掌握扎实的Java基础&#xff0c;这是不争的事实&#xff0c;所以对于Java开发当中需要掌握的重要框架技术&#xff0c;也需要有相应程度的掌握&#xff0c;比如说ORM框架。今天的大数据基础分享&#xff0c;我们就来具体讲一讲ORM框架入门…

【youcans 的 OpenCV 例程200篇】129. 形态算法之骨架 (重建开运算)

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程200篇】129. 形态算法之骨架 (重建开运算) 3. 形态学算法 形态学处理的主要应用是提取图像中用来表示和…