Greasy Fork is available in English.

Luogu2048

在看洛谷题解的时候摸鱼!

您查看的为 2020-10-20 提交的版本。查看 最新版本

// ==UserScript==
// @name         Luogu2048
// @namespace    http://tampermonkey.net/
// @version      1.0.1
// @description  在看洛谷题解的时候摸鱼!
// @author       __OwO__
// @match        https://www.luogu.com.cn/problem/*
// @grant        none
// @require      https://cdn.staticfile.org/jquery/3.5.1/jquery.min.js
// @require      https://cdn.staticfile.org/sweetalert/2.1.2/sweetalert.min.js
// ==/UserScript==

function getGraph(x, len) {
    function getGraphUnit(x, up = 1, left = 1) {
        var _2048 = {
            0: '      ',
            2: '   <font style="background-color:var(--lfe-color--orange-1)">2</font>  ',
            4: '   <font style="background-color:var(--lfe-color--orange-2)">4</font>  ',
            8: '   <font style="background-color:var(--lfe-color--orange-3)">8</font>  ',
            16: '  <font style="background-color:var(--lfe-color--cyan-1)">16</font>  ',
            32: '  <font style="background-color:var(--lfe-color--cyan-2)">32</font>  ',
            64: '  <font style="background-color:var(--lfe-color--cyan-3)">64</font>  ',
            128: '  <font style="background-color:var(--lfe-color--cyan-4)">128</font> ',
            256: '  <font style="background-color:var(--lfe-color--pink-2)">256</font> ',
            512: '  <font style="background-color:var(--lfe-color--pink-3)">512</font> ',
            1024: ' <font style="background-color:var(--lfe-color--pink-4)">1024</font> ',
            2048: ' <font style="background-color:--lfe-color--purple-2">2048</font> ',
            4096: ' <font style="background-color:--lfe-color--purple-3">4096</font> ',
            8192: ' <font style="background-color:--lfe-color--purple-3">8192</font> '
        };
        if (up && left)
            return ['########', '#      #', '#' + _2048[x] + '#', '#      #', '########'];
        else if (up)
            return ['#######', '      #', _2048[x] + '#', '      #', '#######'];
        else if (left)
            return ['#      #', '#' + _2048[x] + '#', '#      #', '########'];
        else
            return ['      #', _2048[x] + '#', '      #', '#######'];
    }
    var graph = [];
    for (var i = 0; i <= len * 4; ++i)graph[i] = '';
    for (var i = 0; i < len; ++i)
        for (var j = 0; j < len; ++j) {
            var unit = getGraphUnit(x[i][j], !i, !j);
            for (var k = 0; k < (4 + !i); ++k) {
                graph[4 * i + k + (i != 0)] += unit[k];
            }
        }
    var graphString = '';
    for (var i = 0; i <= len * 4; ++i)graphString += graph[i] + '\n';
    return graphString;
}
function initMap(len) {
    var map = []
    for (var i = 0; i < len; ++i) { map[i] = []; for (var j = 0; j < len; ++j)map[i][j] = 0; }
    return map;
}
function randNum(x, len) {
    var setX = [], setY = [], l = 0;
    for (var i = 0; i < len; ++i)for (var j = 0; j < len; ++j)if (!x[i][j]) setX[l] = i, setY[l] = j, l++;
    var rnd = Math.floor(Math.random() * l);
    if (l > 0)
        x[setX[rnd]][setY[rnd]] = 2;
}
function isValid(x, len) {
    var valid = false;
    for (var i = 0; i < len; ++i)for (var j = 0; j < len; ++j)valid |= (!x[i][j]);
    if (valid) return true;
    for (var i = 0; i < len; ++i)for (var j = 1; j < len; ++j)valid |= (x[i][j] == x[i][j - 1]);
    for (var i = 0; i < len; ++i)for (var j = 1; j < len; ++j)valid |= (x[j][i] == x[j - 1][i]);
    return valid;
}
function check(x, len) {
    if (!isValid(x, len)) {
        var p = document.createElement('div'); p.innerHTML = `<h1>游戏结束</h1></br><p>得分${score}</p>`;
        swal({ "content": p }).then(() => {
            initialize();
            refresh(map, len);
        });
    }
}
function moveXup(x, len) {
    for (var i = 0; i < len; ++i)for (var j = 0; j < len; ++j) {
        var k = j;
        while (k >= 1 && !x[k - 1][i]) x[k - 1][i] = x[k][i], x[k][i] = 0, --k;
        if (k >= 1 && x[k - 1][i] == x[k][i]) score += x[k - 1][i] *= 2, x[k][i] = 0, --k;
    }
    randNum(x, len);
    randNum(x, len);
    refresh(map, len);
    check(x, len);
}
function moveXdown(x, len) {
    for (var i = 0; i < len; ++i)for (var j = len - 1; j >= 0; --j) {
        var k = j;
        while (k <= len - 2 && !x[k + 1][i]) x[k + 1][i] = x[k][i], x[k][i] = 0, ++k;
        if (k <= len - 2 && x[k + 1][i] == x[k][i]) score += x[k + 1][i] *= 2, x[k][i] = 0, ++k;
    }
    randNum(x, len);
    randNum(x, len);
    refresh(map, len);
    check(x, len);
}
function moveYlft(x, len) {
    for (var i = 0; i < len; ++i)for (var j = 0; j < len; ++j) {
        var k = j;
        while (k >= 1 && !x[i][k - 1]) x[i][k - 1] = x[i][k], x[i][k] = 0, --k;
        if (k >= 1 && x[i][k - 1] == x[i][k]) score += x[i][k - 1] *= 2, x[i][k] = 0, --k;
    }
    randNum(x, len);
    randNum(x, len);
    refresh(map, len);
    check(x, len);
}
function moveYrht(x, len) {
    for (var i = 0; i < len; ++i)for (var j = len - 1; j >= 0; --j) {
        var k = j;
        while (k <= len - 2 && !x[i][k + 1]) x[i][k + 1] = x[i][k], x[i][k] = 0, ++k;
        if (k <= len - 2 && x[i][k + 1] == x[i][k]) score += x[i][k + 1] *= 2, x[i][k] = 0, ++k;
    }
    randNum(x, len);
    randNum(x, len);
    refresh(map, len);
    check(x, len);
}
function refresh(x, len) {
    if (onshow) {
        $('.language-cpp:first').html(getGraph(x, len));
    } else {
        $('.language-cpp:first').html(firstVal);
    }
}
function initialize() {
    window.len = 4, window.map = initMap(len);
    randNum(map, len), randNum(map, len);
    window.onshow = 0, window.score = 0;
}
window.onload = function () {
    setTimeout(function () {
        window.started = 0;
        window.firstVal = $('.language-cpp:first').html();
    }, 1000)
}
$(window).keydown(function (e) {
    switch (e.keyCode) {
        case 87://up
            if (onshow)
                moveXup(map, len);
            break;
        case 83://down
            if (onshow)
                moveXdown(map, len);
            break;
        case 65://lft
            if (onshow)
                moveYlft(map, len);
            break;
        case 68://rht
            if (onshow)
                moveYrht(map, len);
            break;
        case 84:
            if (!started) {
                started = 1;
                initialize();
            }
            onshow ^= 1;
            refresh(map, len);
            break;
    }
});