仅需一维数组,JS实现2048,无限长宽

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #cube {
            padding: 10px;
        }

        #info {
            width: 300px;
            border-radius: 5px;
            line-height: 80px;
            height: 80px;
            user-select: none;
            font-size: 40px;
            background-color: #0c5955;
            text-align: center;
            vertical-align: middle;
            color: white;
        }

        #cube > span {
            width: 80px;
            height: 80px;
            margin-left: 5px;
            margin-top: 5px;
            border-radius: 5px;
            display: inline-block;
            text-align: center;
            vertical-align: middle;
            line-height: 80px;
            background-color: #52c2bc;
            color: white;
            font-size: 30px;
            user-select: none;
            font-weight: bolder;
        }

        #cube > span.num2 {
            background-color: #2a938e;
        }

        #cube > span.num4 {
            background-color: #13487c;
        }

        #cube > span.num8 {
            background-color: #084441;
        }

        #cube > span.num16 {
            background-color: #0a312f;
        }

        #cube > span.num32 {
            background-color: #09b688;
        }

        #cube > span.num64 {
            background-color: #0b2c4d;
        }

        #cube > span.num128 {
            background-color: #2644ad;
        }

        #cube > span.num256 {
            background-color: #151f44;
        }

        #cube > span.num512 {
            background-color: #1969a9;
        }

        #cube > span.num1024 {
            background-color: #1ebb97;
        }

        #cube > span.num2048 {
            background-color: #00ffc3;
        }
    </style>
    <script>
        let numArray = [], line;
        let score, gameOver;
        let infoSpan, numInput;

        function init(a) {
            score = 0;
            line = a;
            numArray.length = Math.pow(line, 2);
            gameOver = false;
            reset();

        }

        function newMap() {
            let k = parseInt(numInput.value);
            if (!isNaN(k)) {
                if (k < 2) {
                    alert("玩什么呢?");
                } else {
                    init(k);

                }
            } else {
                alert("错误!")
            }
        }

        function reset() {
            for (let i = 0; i < numArray.length; i++) {
                numArray[i] = undefined;
            }
            gameOver = false;
            scoreRest();
            putNum();
            show();
        }

        function scoreCount(a) {
            score += a;
            infoSpan.innerHTML = score;
        }

        function scoreRest() {
            score = 0;
            infoSpan.innerHTML = 0;
        }

        window.onload = function () {

            numInput = document.getElementById("lineInput");
            infoSpan = document.getElementById("info").querySelector("span");
            init(4);
        }
        window.onkeydown = function (e) {
            console.log(gameOver)
            if (gameOver) {
                alert("失败了!请重来!");
                return;
            }
            switch (e.keyCode) {
                case 37:
                    toLeftKey();
                    putNum();
                    show();
                    break;
                case 38:

                    toUPKey();
                    putNum();
                    show();

                    break;
                case 39:
                    toRightKey();
                    putNum();
                    show();
                    break;
                case 40:
                    toBottomKey();
                    putNum();
                    show();
                    break;
            }
        }

        function show() {
            showFormat();
        }

        function getColorCube(k) {
            return `num${k}`;
        }

        function showFormat() {
            let c = "", d;

            for (let i = 0; i < line; i++) {
                for (let j = 0; j < line; j++) {
                    d = numArray[i * line + j];
                    if (d === undefined) {
                        c = c + "<span></span>" + "";
                    } else {
                        c = c + `<span class="${getColorCube(d)}">${d}</span>`
                    }


                }
                c += "<br/>";


            }

            document.getElementById("cube").innerHTML = c;


        }

        function putNum() {

            let k = [];
            for (let i = 0; i < numArray.length; i++) {
                if (numArray[i] === undefined) {
                    k.push(i);
                }
            }


            let t = rand(k);
            if (t) {
                if (t.length > 1) {
                    numArray[t[0]] = 2;
                    numArray[t[1]] = 2;
                } else {
                    numArray[t[0]] = 2;
                }
                if (k.length <= 2) {
                    if (!checkCantMove()) {
                        gameOver = true;
                        //为什么是显示后才显示效果,是因为按键后的运算大有延迟,这个先执行。
                        alert("你失败了!");

                    }
                }
            } else {
                console.log("I can't put anything!");
            }
        }

        function checkCantMove() {
            for (let i = 0; i < numArray.length; i++) {
                if (numArray[i] === undefined) {
                    return true;
                }
                if (i % line - 1 > -1) {
                    if (numArray[i] === numArray[i - 1]) {
                        return true;
                    }
                }
                if (i % line + 1 < line - 1) {
                    if (numArray[i] === numArray[i + 1]) {
                        return true;
                    }
                }
                if (i % line - line > -1) {
                    if (numArray[i] === numArray[i - line]) {
                        return true;
                    }
                }
                if (i % line + line < numArray.length) {
                    if (numArray[i] === numArray[i + line]) {
                        return true;
                    }
                }
            }
            return false;
        }

        function toUPKey() {
            let c = -1;
            for (let i = 0; i < line; i++) {
                for (let j = 1; j < line; j++) {
                    if (numArray[i + j * line] !== undefined) {
                        for (let k = 0; k < j; k++) {
                            if (numArray[i + (j - k - 1) * line] === undefined) {
                                c = i + (j - k - 1) * line;
                            } else {
                                if (numArray[i + (j - k - 1) * line] === numArray[i + j * line]) {
                                    numArray[i + (j - k - 1) * line] += numArray[i + j * line];
                                    numArray[i + j * line] = undefined;
                                    scoreCount(numArray[i + (j - k - 1) * line]);
                                    c = -1;
                                    break;
                                } else {
                                    break;
                                }
                            }
                        }
                        if (c !== -1) {
                            numArray[c] = numArray[i + j * line];
                            numArray[i + j * line] = undefined;
                            c = -1;
                        }
                    }
                }
            }
        }

        function toBottomKey() {
            let c = -1;
            for (let i = 0; i < line; i++) {
                for (let j = line - 2; j > -1; j--) {
                    if (numArray[i + j * line] !== undefined) {
                        for (let k = 1; k < line - j; k++) {
                            if (numArray[i + (j + k) * line] === undefined) {
                                c = i + (j + k) * line;
                            } else {
                                if (numArray[i + (j + k) * line] === numArray[i + j * line]) {
                                    numArray[i + (j + k) * line] += numArray[i + j * line];
                                    numArray[i + j * line] = undefined;
                                    scoreCount(numArray[i + (j + k) * line]);
                                    c = -1;
                                    break;
                                } else {
                                    break;
                                }
                            }
                        }
                        if (c !== -1) {
                            numArray[c] = numArray[i + j * line];
                            numArray[i + j * line] = undefined;
                            c = -1;
                        }
                    }
                }
            }
        }

        function toLeftKey() {
            let c = -1;
            for (let i = 0; i < line; i++) {
                for (let j = 1; j < line; j++) {
                    if (numArray[i * line + j] !== undefined) {
                        for (let k = 0; k < j; k++) {
                            if (numArray[i * line + j - k - 1] === undefined) {
                                c = i * line + j - k - 1;
                            } else {
                                if (numArray[i * line + j - k - 1] === numArray[i * line + j]) {
                                    numArray[i * line + j - k - 1] += numArray[i * line + j];
                                    numArray[i * line + j] = undefined;
                                    scoreCount(numArray[i * line + j - k - 1]);
                                    c = -1;
                                    break;
                                } else {
                                    break;
                                }
                            }
                        }
                        if (c !== -1) {
                            numArray[c] = numArray[i * line + j];
                            numArray[i * line + j] = undefined;
                            c = -1;
                        }
                    }
                }
            }
        }

        function toRightKey() {
            let c = -1;
            for (let i = 0; i < line; i++) {
                for (let j = line - 2; j > -1; j--) {
                    if (numArray[i * line + j] !== undefined) {
                        for (let k = 1; k < line - j; k++) {
                            if (numArray[i * line + j + k] === undefined) {
                                c = i * line + j + k;
                            } else {
                                if (numArray[i * line + j + k] === numArray[i * line + j]) {
                                    numArray[i * line + j + k] += numArray[i * line + j];
                                    numArray[i * line + j] = undefined;
                                    c = -1;
                                    scoreCount(numArray[i * line + j + k]);
                                    break;
                                } else {
                                    break;
                                }
                            }
                        }
                        if (c !== -1) {
                            numArray[c] = numArray[i * line + j];
                            numArray[i * line + j] = undefined;
                            c = -1;
                        }
                    }
                }
            }
        }

        function rand(arr) {
            if (arr.length < 1) {

                return false;
            }
            if (arr.length < 2) {
                let arr2 = [...arr];
                let c = myRandom(0, arr2.length - 1);
                let a = arr2[c];
                return [a];
            } else {
                let arr2 = [...arr];
                let c = myRandom(0, arr2.length - 1);
                let a = arr2[c];
                arr2.splice(c, 1);
                c = myRandom(0, arr2.length - 1);
                let b = arr2[c];

                return [a, b];
            }

        }

        function myRandom(min, max) {
            return min + Math.floor((max - min + 1) * Math.random());

        }
    </script>
</head>
<body>
<div id="info">
    <span>0</span>
</div>
<div id="cube">

</div>
<button onclick="reset()">再来一局</button>
<button onclick="newMap()">新地图</button>
<label>
    <input id="lineInput" type="number" placeholder="请输入行数"/>
</label>


</body>
</html>

下载地址:

https://gitee.com/KatyLight/games/blob/master/2048-finnal.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值