JS实现拼图游戏


Posted in Javascript onJanuary 29, 2021

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

原理分析:

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

效果演示

JS实现拼图游戏

代码展示

<!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游戏的精彩文章,请查看专题:《JavaScript经典游戏 玩不停》

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用js实现的一个Flash滚动轮换显示图片代码生成器
Mar 14 Javascript
Javascript selection的兼容性写法介绍
Dec 20 Javascript
jQuery调取jSon数据并展示的方法
Jan 29 Javascript
IE10中flexigrid无法显示数据的解决方法
Jul 26 Javascript
AngularJS数据源的多种获取方式汇总
Feb 02 Javascript
AngularJS控制器之间的通信方式详解
Nov 03 Javascript
jquery对table做排序操作的实例演示
Aug 10 jQuery
利用ECharts.js画K线图的方法示例
Jan 10 Javascript
Vue如何获取数据列表展示
Dec 11 Javascript
jquery传参及获取方式(两种方式)
Feb 13 jQuery
OpenLayers3实现鼠标移动显示坐标
Sep 25 Javascript
微信小程序tab左右滑动切换功能的实现代码
Feb 08 Javascript
Vue的transition-group与Virtual Dom Diff算法的使用
Dec 09 #Javascript
Vue实现渲染数据后控制滚动条位置(推荐)
Dec 09 #Javascript
element-ui如何防止重复提交的方法步骤
Dec 09 #Javascript
js刷新页面location.reload()用法详解
Dec 09 #Javascript
vue 实现websocket发送消息并实时接收消息
Dec 09 #Javascript
Vue extend的基本用法(实例详解)
Dec 09 #Javascript
vue基于v-charts封装双向条形图的实现代码
Dec 09 #Javascript
You might like
php一次性删除前台checkbox多选内容的方法
2013/09/22 PHP
php动态生成缩略图并输出显示的方法
2015/04/20 PHP
利用javascript查看html源文件
2006/11/08 Javascript
jQuery Tools Dateinput使用介绍
2012/07/14 Javascript
同一个网页中实现多个JavaScript特效的方法
2015/02/02 Javascript
JavaScript中的闭包介绍
2015/03/15 Javascript
jquery彩色投票进度条简单实例演示
2020/07/23 Javascript
jQuery实现表格隔行及滑动,点击时变色的方法【测试可用】
2016/08/20 Javascript
ionic开发中点击input时键盘自动弹出
2016/12/23 Javascript
Angular 2父子组件数据传递之@Input和@Output详解(下)
2017/07/05 Javascript
基于Require.js使用方法(总结)
2017/10/26 Javascript
JS数组方法slice()用法实例分析
2020/01/18 Javascript
JavaScript canvas绘制折线图
2020/02/18 Javascript
Ant Design的Table组件去除
2020/10/24 Javascript
angular8.5集成TinyMce5的使用和详细配置(推荐)
2020/11/16 Javascript
非递归的输出1-N的全排列实例(推荐)
2017/04/11 Python
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
2019/05/13 Python
Python队列RabbitMQ 使用方法实例记录
2019/08/05 Python
使用Python为中秋节绘制一块美味的月饼
2019/09/11 Python
在Python中实现函数重载的示例代码
2019/12/12 Python
Django项目使用ckeditor详解(不使用admin)
2019/12/17 Python
python关于调用函数外的变量实例
2019/12/26 Python
Python爬虫解析网页的4种方式实例及原理解析
2019/12/30 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
2020/02/17 Python
selenium判断元素是否存在的两种方法小结
2020/12/07 Python
详解Open Folder as PyCharm Project怎么添加的方法
2020/12/29 Python
美国购买韩国护肤和美容产品网站:Althea Korea
2020/11/16 全球购物
上班离岗检讨书
2014/01/27 职场文书
财务会计自荐信范文
2014/02/21 职场文书
工程采购员岗位职责
2014/03/09 职场文书
旺仔牛奶广告词
2014/03/20 职场文书
新农村建设汇报材料
2014/08/15 职场文书
2014年民政局关于保密工作整改措施
2014/09/19 职场文书
2015年机关后勤工作总结
2015/05/26 职场文书
Redis遍历所有key的两个命令(KEYS 和 SCAN)
2021/04/12 Redis
教你解决往mysql数据库中存入汉字报错的方法
2021/05/06 MySQL