如何用JS实现拼图游戏,具体过程是什么
Admin 2022-08-09 群英技术资讯 326 次浏览
本文实例为大家分享了js实现简单拼图游戏的具体代码,供大家参考,具体内容如下
HTML仅有一个id为game的div,并且没有编写css样式,只需要在img文件夹中放置一个图片文件就行,此处我放置的是LOL皇子的图片,图片名为'lol.png'
<div id="game"> </div>
以下为实现后的效果图
多的不说,直接上js代码
/** * 游戏配置 */ var gameConfig = { width: 500, height: 500, rows: 3, //行数 cols: 3, //列数 isOver: false, //游戏是否结束 imgurl: "img/lol.png", //图片路径,注意:相对的是页面路径 dom: document.getElementById("game") //游戏的dom对象 }; //每一个小块的宽高 gameConfig.pieceWidth = gameConfig.width / gameConfig.cols; gameConfig.pieceHeight = gameConfig.height / gameConfig.rows; //小块的数量 gameConfig.pieceNumber = gameConfig.rows * gameConfig.cols; var blocks = []; //包含小方块信息的数组 function isEqual(n1, n2) { return parseInt(n1) === parseInt(n2); } /** * 小方块的构造函数 * @param {*} left * @param {*} top * @param {*} isVisible 是否可见 */ function Block(left, top, isVisible) { this.left = left; //当前的横坐标 this.top = top; //当前的纵坐标 this.correctLeft = this.left; //正确的横坐标 this.correctTop = this.top; //正确的纵坐标 this.isVisible = isVisible; //是否可见 this.dom = document.createElement("div"); this.dom.style.width = gameConfig.pieceWidth + "px"; this.dom.style.height = gameConfig.pieceHeight + "px"; this.dom.style.background = `url("${gameConfig.imgurl}") -${this.correctLeft}px -${this.correctTop}px`; this.dom.style.position = "absolute"; this.dom.style.border = "1px solid #fff"; this.dom.style.boxSizing = "border-box"; this.dom.style.cursor = "pointer"; // this.dom.style.transition = ".5s"; //css属性变化的时候,在0.5秒中内完成 if (!isVisible) { this.dom.style.display = "none"; } gameConfig.dom.appendChild(this.dom); this.show = function () { //根据当前的left、top,重新设置div的位置 this.dom.style.left = this.left + "px"; this.dom.style.top = this.top + "px"; } //判断当前方块是否在正确的位置上 this.isCorrect = function () { return isEqual(this.left, this.correctLeft) && isEqual(this.top, this.correctTop); } this.show(); } /** * 初始化游戏 */ function init() { //1. 初始化游戏的容器 initGameDom(); //2. 初始化小方块 //2.1 准备好一个数组,数组的每一项是一个对象,记录了每一个小方块的信息 initBlocksArray(); //2.2 数组洗牌 shuffle(); //3. 注册点击事件 regEvent(); /** * 处理点击事件 */ function regEvent() { //找到看不见的方块 var inVisibleBlock = blocks.find(function (b) { return !b.isVisible; }); blocks.forEach(function (b) { b.dom.onclick = function () { if (gameConfig.isOver) { return; } //判断是可以交换 if (b.top === inVisibleBlock.top && isEqual(Math.abs(b.left - inVisibleBlock.left), gameConfig.pieceWidth) || b.left === inVisibleBlock.left && isEqual(Math.abs(b.top - inVisibleBlock.top), gameConfig.pieceHeight)) { //交换当前方块和看不见的方块的坐标位置 exchange(b, inVisibleBlock); //游戏结束判定 isWin(); } //交换当前方块和看不见的方块的坐标位置 // exchange(b, inVisibleBlock); // //游戏结束判定 // isWin(); } }) } /** * 游戏结束判定 */ function isWin() { var wrongs = blocks.filter(function (item) { return !item.isCorrect(); }); if (wrongs.length === 0) { gameConfig.isOver = true; //游戏结束,去掉所有边框 blocks.forEach(function (b) { b.dom.style.border = "none"; b.dom.style.display = "block"; }); } } /** * 随机数,能取到最大值 * @param {*} min * @param {*} max */ function getRandom(min, max) { return Math.floor(Math.random() * (max + 1 - min) + min); } /** * 交换两个方块的left和top * @param {*} b1 * @param {*} b2 */ function exchange(b1, b2) { var temp = b1.left; b1.left = b2.left; b2.left = temp; temp = b1.top; b1.top = b2.top; b2.top = temp; b1.show(); b2.show(); } /** * 给blocks数组洗牌 */ function shuffle() { for (var i = 0; i < blocks.length - 1; i++) { //随机产生一个下标 var index = getRandom(0, blocks.length - 2); //将数组的当前项与随机项交换left和top值 exchange(blocks[i], blocks[index]); } } /** * 初始化一个小方块的数组 */ function initBlocksArray() { for (var i = 0; i < gameConfig.rows; i++) { for (var j = 0; j < gameConfig.cols; j++) { //i 行号,j 列号 var isVisible = true; if (i === gameConfig.rows - 1 && j === gameConfig.cols - 1) { isVisible = false; } var b = new Block(j * gameConfig.pieceWidth, i * gameConfig.pieceHeight, isVisible); blocks.push(b); } } } /** * 初始化游戏容器 */ function initGameDom() { gameConfig.dom.style.width = gameConfig.width + "px"; gameConfig.dom.style.height = gameConfig.height + "px"; gameConfig.dom.style.border = "2px solid #ccc"; gameConfig.dom.style.position = "relative"; } } init();
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章给大家分享一个jQuery相关示例,需求是判断点击了哪个li,这里使用到的方法index()方法,文中示例代码有一定的参考价值,感兴趣的朋友可以了解看看,下面我们一起来学习一下jQuery中判断点击哪个li的方法。
目录vue打包去掉所有的console.log输出安装插件添加配置vue npm run build 打包去掉console和警告其实就两行代码就可以了vue打包去掉所有的console.log输出安装插件npm install babel-plugin-transform-remove-console --save-
这篇文章主要为大家详细介绍了用vue实现注册页,短信验证码登录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本篇文章给大家带来了关于JavaScript的相关知识,其中主要整理了函数的定义与基本使用的相关问题,包括了用函数语句定义、函数的调用、未定义的实参等等内容,下面一起来看一下,希望对大家有帮助。
Web js实现复制文本到粘贴板 本文实例为大家分享了Web js实现复制文本到粘贴板的具体代码,供大家参考,具体内容如下 一.简述 记--简单用js实现将元素的文本内容复制到粘贴板. 二.效果 三.代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>js复制内容到粘贴板</title> <script type="t ...
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008