侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

如何利用js实现一个简单的拼图游戏

前端  /  管理员 发布于 7年前   199

原理分析:

1、鼠标的点击和松开事件

2、显示原图作为参考

3、方块的移动替换

4、是否完成拼图的判断

5、完成之后会弹窗提示

效果图如下:

ef30d771867661fc28f58f0afc45126.png

实例代码如下:

<!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 纵4 size: "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]); //图片生成div var 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++) { //赋值随机打散后的id st.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>

推荐教程:js教程

以上就是如何利用js实现一个简单的拼图游戏的详细内容,更多请关注其它相关文章!


  • 上一条:
    js中字符串转数组的方法
    下一条:
    如何转换css元素的显示模式
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 使用 Alpine.js 排序插件对元素进行排序(0个评论)
    • 在js中使用jszip + file-saver实现批量下载OSS文件功能示例(0个评论)
    • 在vue中实现父页面按钮显示子组件中的el-dialog效果(0个评论)
    • 使用mock-server实现模拟接口对接流程步骤(0个评论)
    • vue项目打包程序实现把项目打包成一个exe可执行程序(0个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-03
    • 2018-04
    • 2018-05
    • 2018-06
    • 2018-09
    • 2018-11
    • 2018-12
    • 2019-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-04
    • 2021-05
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客