// ==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;
}
});