数字华容道4*4的JS代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>数字华容道4*4</title>
    <style>
        #game {
            height: 408px;
            width: 408px;
            display: flex;
            align-items: center;
            flex-wrap: wrap;
            margin: 100px auto;
        }
        .game_item {
            height: 100px;
            width: 100px;
            border-radius: 4px;
            border: 1px dashed gainsboro;
            text-align: center;
            line-height: 100px;
            cursor: pointer;
            user-select: none;
        }
    </style>
</head>
<body>
    <div id="game">

    </div>
</body>

<script>
    //初始布局
    var numberList = [[1, 2, 3, 4],
                    [5, 6, 7, 8],
                    [9, 10, 11, 12],
                    [13, 14, 15, 0]];
    //0所处的位置
    var zeroRow = 3;
    var zeroCol = 3;
    chaos();
    //打乱的函数
    function chaos() {
        //随机循环次数取[50, 100) 50~99随机
        //次数越小,越容易还原——不绝对
        var rCount = Math.floor(Math.random() * 50 + 50);
        for(let i = 0; i <= rCount; i++) {
            //随机出0将要去的位置
            let rRow = Math.floor(Math.random() * 4);
            let rCol = Math.floor(Math.random() * 4);
            zeroRun(rRow, rCol);
        }
    }
    function zeroRun (row, col) {
        //移动位置不变的话,直接return 结束,节省性能
        if (numberList[row][col] === 0) {
            return;
        }
        //0移动到指定位置(横坐标)
        numberList[zeroRow].splice(zeroCol, 1);
        numberList[zeroRow].splice(col, 0, 0);
        let rowNum = row - zeroRow;
        //小于0的时候,向上移动;大于0的时候,向下移动
        //0移动到指定位置(纵坐标)
        if (rowNum < 0) {
            for (let i = zeroRow; i > row; i--) {
                [numberList[i][col], numberList[i - 1][col]] = [numberList[i - 1][col], numberList[i][col]];
            }
        } else {
            for (let i = zeroRow; i < row; i++) {
                [numberList[i][col], numberList[i + 1][col]] = [numberList[i + 1][col], numberList[i][col]];
            }
        }
        //记录0新的坐标
        zeroRow = row;
        zeroCol = col;
        //如果原来有小方块的话,清除小方块
        if (document.getElementsByClassName("game_item").length > 0) {
            for (let i = 0; i < 16; i++) {
                document.getElementById("game").removeChild(document.getElementsByClassName("game_item")[0]);
            }
        }
        //重新渲染小方块,并添加属性row和col,记录小方块的横纵坐标
        for (let i = 0; i < 4; i++) {
            for (let j = 0; j < 4; j++) {
                let gameItem = document.createElement("div");
                gameItem.className = "game_item";
                //如果为0的话,不显示数字
                numberList[i][j] === 0 ? gameItem.innerText = "" : gameItem.innerText = numberList[i][j];
                gameItem.setAttribute("row", i);
                gameItem.setAttribute("col", j);
                document.getElementById("game").appendChild(gameItem);
            }
        }
        //判断是否胜利,加计时器是因为有时候dom节点还没有生成完,所以需要延迟
        setTimeout(() => {
            if (win()) {
                alert("win");
            }
        }, 0);
    }
    //监听用户单击事件
    document.getElementById("game").addEventListener("click", function (e) {
        if (e.target.className === "game_item") {
            let row = parseInt(e.target.getAttribute("row"));
            let col = parseInt(e.target.getAttribute("col"));
            if (row === zeroRow || col === zeroCol) {
                zeroRun(row, col);
            }
    }
    })
    //监听用户键盘事件
    document.onkeydown=function(e){
        switch(e.code) {
            case "ArrowUp":
                if (zeroRow === 3) {
                    return;
                }
                zeroRun(zeroRow + 1, zeroCol);
                break;
            case "ArrowDown":
                if (zeroRow === 0) {
                    return;
                }
                zeroRun(zeroRow - 1, zeroCol);
                break;
            case "ArrowLeft":
                if (zeroCol === 3) {
                    return;
                }
                zeroRun(zeroRow, zeroCol + 1);
                break;
            case "ArrowRight":
                if (zeroCol === 0) {
                    return;
                }
                zeroRun(zeroRow, zeroCol - 1);
                break;
            default: 
                break;
        }
    }
    //判断胜利
    function win() {
        let arr = numberList.flat();
        for (let i = 0; i < 15; i++) {
            if (arr[i] !== i + 1) {
                return false;
            }
        }
        return true;
    }
</script>
</html>

详细分析请看:JavaScript实现4*4数字华容道分析-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值