一个简单的拼图游戏

在这里插入图片描述

/* 
    1. 开始游戏时把图片打乱
    2. 按下方向键,让图交换位置
    3. 判断是否完成游戏(类名的顺序num1-num9,把空白去除)
*/
// 获取开始游戏按钮
var btnStart = document.querySelector('#btnStart');
// 获取重新游戏按钮
var btnReset = document.querySelector("#btnReset");
// 获取所有的图片
var items = document.querySelectorAll('.item');
var tempItems = document.querySelectorAll('.item');
// 图片所在的容器
var box = document.querySelector('.box');
// 开始游戏
btnStart.onclick = function () {
    this.disabled = 'disabled';
    sortImg();
};
// 重新游戏
btnReset.onclick = function () {
    location.reload();
}
// 空白的索引
var index = 0;
// 让图片打乱顺序
function sortImg() {
    // 把类数组items转换成真正的数组。
    var arr = Array.from(items);
    // 把数组arr中的元素进行排序。
    arr.sort(function () {
        return Math.random() > 0.5 ? -1 : 1;
    })
    // 先清空box容器,把排序后的元素添加到box容器中。
    box.innerHTML = ``;
    for (let i = 0; i < arr.length; i++) {
        box.appendChild(arr[i]);
    }

    items[8].style.backgroundImage = 'none';
    index = arr.findIndex(function (item) {
        return item.classList.contains(`num9`);
    });
}

document.onkeyup = function (e) {
    // console.log(e.keyCode);
    if (e.keyCode === 37 || e.keyCode === 65) { // 左方向键或者a键
        moveLeft();
    } else if (e.keyCode === 38 || e.keyCode === 87) {// 上方向键或者w键
        moveTop();
    }
    else if (e.keyCode === 39 || e.keyCode === 68) {// 右方向键或者d键
        moveRight();
    }
    else if (e.keyCode === 40 || e.keyCode === 83) {// 下方向键或者s键
        moveBottom();
    }
}

function moveLeft() {
    if (!(index === 2 || index === 5 || index === 8)) {
        // 取空白元素
        var target = document.querySelectorAll('.item')[index];
        // 取空白元素右方的元素
        var ele = document.querySelectorAll('.item')[index + 1];
        // 交换空白元素和它右方元素的样式
        exchange(target, ele);

        // 让索引发生变化,目的下次准确的取目标元素。
        index = index + 1;

        // 判断是否成功
        success();
    }
}
function moveTop() {
    if (!(index === 6 || index === 7 || index === 8)) {
        // 取空白元素
        var target = document.querySelectorAll('.item')[index];
        // 取空白元素下方的元素
        var ele = document.querySelectorAll('.item')[index + 3];
        // 交换空白元素和它下方元素的样式
        exchange(target, ele);

        // 让索引发生变化,目的下次准确的取目标元素。
        index = index + 3;

        // 判断是否成功
        success();
    }
}
function moveRight() {
    if (!(index === 0 || index === 3 || index === 6)) {
        // 取空白元素
        var target = document.querySelectorAll('.item')[index];
        // 取空白元素左方的元素
        var ele = document.querySelectorAll('.item')[index - 1];
        // 交换空白元素和它左方元素的样式
        exchange(target, ele);

        // 让索引发生变化,目的下次准确的取目标元素。
        index = index - 1;
        // 判断是否成功
        success();
    }
}
function moveBottom() {
    if (!(index === 0 || index === 1 || index === 2)) {
        // 取空白元素
        var target = document.querySelectorAll('.item')[index];
        // 取空白元素上方的元素
        var ele = document.querySelectorAll('.item')[index - 3];
        // 交换空白元素和它上方元素的样式
        exchange(target, ele);

        // 让索引发生变化,目的下次准确的取目标元素。
        index = index - 3;

        // 判断是否成功
        success();
    }
}

// 交换两个元素的样式。
function exchange(target, ele) {
    var temp = ele.className;
    ele.className = target.className;
    target.className = temp;

    ele.style.backgroundImage = "none";
    target.style = "";
}

// 判断是否拼图成功
function success() {
    var result = false;
    // 判断类名的顺序是不是num1 - num9,如果是成功了,否则不成功。别忘记成功后把空白style移除

    var newItems = document.querySelectorAll('.item');
    var arr1 = Array.from(newItems);
    var arr2 = Array.from(tempItems);
    // 比较arr1和arr2中的元素值是否相等。
    // 由于数组是引用类型,不能使用恒等比较
    // if(arr1 === arr2){}
    result = equal(arr1, arr2);

    if (result) {
        items[8].style = '';
        alert('恭喜你成功了!');
    }
}

function equal(ar1, ar2) {
    for (let i = 0; i < ar1.length; i++) {
        if (ar1[i].className !== ar2[i].className) {
            return false;
        }
    }
    return true;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
抱歉,由于我是一名AI语言模型,无法提供交互性的HTML拼图游戏。但我可以提供HTML代码的模板,供你参考: <!DOCTYPE html> <html> <head> <title>拼图游戏</title> <style> /* 拼图块的样式 */ .puzzle { position: absolute; border: 2px solid black; cursor: pointer; } /* 拼图块的位置 */ .puzzle1 { top: 0; left: 0; height: 100px; width: 100px; background-image: url("puzzle1.jpg"); background-size: cover; } .puzzle2 { top: 0; left: 100px; height: 100px; width: 100px; background-image: url("puzzle2.jpg"); background-size: cover; } .puzzle3 { top: 0; left: 200px; height: 100px; width: 100px; background-image: url("puzzle3.jpg"); background-size: cover; } .puzzle4 { top: 100px; left: 0; height: 100px; width: 100px; background-image: url("puzzle4.jpg"); background-size: cover; } .puzzle5 { top: 100px; left: 100px; height: 100px; width: 100px; background-image: url("puzzle5.jpg"); background-size: cover; } .puzzle6 { top: 100px; left: 200px; height: 100px; width: 100px; background-image: url("puzzle6.jpg"); background-size: cover; } .puzzle7 { top: 200px; left: 0; height: 100px; width: 100px; background-image: url("puzzle7.jpg"); background-size: cover; } .puzzle8 { top: 200px; left: 100px; height: 100px; width: 100px; background-image: url("puzzle8.jpg"); background-size: cover; } /* 空白拼图块的样式 */ .empty { background-color: white; } </style> </head> <body> <!-- 拼图块 --> <div class="puzzle puzzle1"></div> <div class="puzzle puzzle2"></div> <div class="puzzle puzzle3"></div> <div class="puzzle puzzle4"></div> <div class="puzzle puzzle5"></div> <div class="puzzle puzzle6"></div> <div class="puzzle puzzle7"></div> <div class="puzzle puzzle8"></div> <div class="puzzle empty"></div> <script> // 获取所有拼图块 var puzzles = document.querySelectorAll(".puzzle"); // 随机打乱拼图块的位置 for (var i = puzzles.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = puzzles[i].className; puzzles[i].className = puzzles[j].className; puzzles[j].className = temp; } // 给拼图块添加点击事件 puzzles.forEach(function(puzzle) { puzzle.addEventListener("click", function() { // 获取空白拼图块 var emptyPuzzle = document.querySelector(".empty"); // 判断是否能移动 if ((puzzle.offsetTop == emptyPuzzle.offsetTop && Math.abs(puzzle.offsetLeft - emptyPuzzle.offsetLeft) == 100) || (puzzle.offsetLeft == emptyPuzzle.offsetLeft && Math.abs(puzzle.offsetTop - emptyPuzzle.offsetTop) == 100)) { // 交换位置 var temp = puzzle.className; puzzle.className = emptyPuzzle.className; emptyPuzzle.className = temp; } // 判断是否完成拼图 var isCompleted = true; puzzles.forEach(function(puzzle) { if (puzzle.className != "puzzle puzzle" + puzzle.dataset.index) { isCompleted = false; } }); if (isCompleted) { alert("恭喜你,拼图完成!"); } }); }); </script> </body> </html> 你可以根据自己的需要,修改和美化这个模板来创建自己的拼图游戏
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值