您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Auto Solve Puzzles!
// ==UserScript== // @name Auto Minesweeper Solver // @namespace http://tampermonkey.net/ // @version 3.2.5 // @description Auto Solve Puzzles! // @author Rosaya // @include *.puzzle-minesweeper.com* // @icon https://www.google.com/s2/favicons?sz=64&domain=puzzle-minesweeper.com // @grant none // ==/UserScript== (function() { 'use strict'; var content = document.getElementById('game').innerHTML; var tmp = document.getElementsByClassName('cell selectable cell-off')[0]; if(tmp) { var len = content.length; var n = 0, cur = 0, cnt = 0, ql = 0, qr = -1, delay = 0; const arr = [], mn = [0], mx = [0], vis = [0], ii = [0], e = [[0]], el = [0], q = []; for(let i = 0; i + 6 < len; i ++){ if(content[i] == 't' && content[i + 1] == 'e' && content[i + 2] == ';' && content[i + 3] == '"' && content[i + 4] == '>'){ arr[n] = content[i + 5]; n ++; } } n = Math.floor(Math.sqrt(n)); const board = Array.from(Array(n + 2), () => new Array(n + 2)); for(let i = 0; i <= n + 1; i++){ board[0][i] = board[i][0] = board[i][n + 1] = board[n + 1][i] = 0; } for(let i = 1; i <= n; i ++){ for(let j = 1; j <= n; j ++){ let id = (i - 1) * n + j - 1; if(arr[id] == '<'){ board[i][j] = ++ cur; } else{ board[i][j] = - Number(arr[id]); } } } var num = 0, U = 0; var adj = []; var bid = []; const mp = new Map(); function create(pid){ let cc = 0; adj = []; for(let i = 0; i < num; i++){ if(pid >> i & 1){ adj[cc ++] = bid[i]; } } adj.sort(function(a, b){ return a - b; }); if(mp.has(adj.toString()) == false){ mp.set(adj.toString(), ++ cnt); mn[cnt] = 0; mx[cnt] = cc; vis[cnt] = 0; e[cnt] = []; el[cnt] = 0; return cnt; } return mp.get(adj.toString()); } function make(x, y){ num = 0; for(let i = -1; i <= 1; i ++){ for(let j = -1; j <= 1; j ++){ if(board[x + i][y + j] > 0){ bid[num ++] = board[x + i][y + j]; } } } U = (1 << num) - 1; for(let i = 1; i <= U; i ++){ ii[i] = create(i); for(let j = (i - 1) & i; j > 0; j = (j - 1) & i){ let k = i - j; if(ii[j] > ii[k]){ continue; } e[ii[i]][el[ii[i]] ++] = [ii[j], ii[k], ii[i]]; e[ii[j]][el[ii[j]] ++] = [ii[j], ii[k], ii[i]]; e[ii[k]][el[ii[k]] ++] = [ii[j], ii[k], ii[i]]; } } if(U > 0 && vis[ii[U]] == false){ mn[ii[U]] = - board[x][y]; mx[ii[U]] = - board[x][y]; q[++ qr] = ii[U]; vis[ii[U]] = true; } } for(let i = 1; i <= n; i ++){ for(let j = 1; j <= n; j ++){ if(board[i][j] <= 0){ make(i,j); } } } while(ql <= qr){ let u = q[ql ++]; vis[u] = false; for(let i = 0; i < el[u]; i ++){ let j = e[u][i]; if(u == j[0] || u == j[1]){ let v = j[0] + j[1] - u; let w = j[2]; if(mn[w] < mn[u] + mn[v]){ mn[w] = mn[u] + mn[v]; if(vis[w] == false){ q[++ qr] = w; vis[w] = true; } } if(mx[w] > mx[u] + mx[v]){ mx[w] = mx[u] + mx[v]; if(vis[w] == false){ q[++ qr] = w; vis[w] = true; } } if(mn[v] < mn[w] - mx[u]){ mn[v] = mn[w] - mx[u]; if(vis[v] == false){ q[++ qr] = v; vis[v] = true; } } if(mx[v] > mx[w] - mn[u]){ mx[v] = mx[w] - mn[u]; if(vis[v] == false){ q[++ qr] = v; vis[v] = true; } } } else{ let v = j[0]; let w = j[1]; if(mn[v] < mn[u] - mx[w]){ mn[v] = mn[u] - mx[w]; if(vis[v] == false){ q[++ qr] = v; vis[v] = true; } } if(mx[v] > mx[u] - mn[w]){ mx[v] = mx[u] - mn[w]; if(vis[v] == false){ q[++ qr] = v; vis[v] = true; } } if(mn[w] < mn[u] - mx[v]){ mn[w] = mn[u] - mx[v]; if(vis[w] == false){ q[++ qr] = w; vis[w] = true; } } if(mx[w] > mx[u] - mn[v]){ mx[w] = mx[u] - mn[v]; if(vis[w] == false){ q[++ qr] = w; vis[w] = true; } } } } } tmp.focus(); function pressKey(Temp, keyChar, keyCode){ delay += 10; setTimeout(() => { var event = document.createEvent('Event') event.initEvent('keydown', true, false) event = Object.assign(event, { ctrlKey: false, metaKey: false, altKey: false, which: Temp, keyCode: Temp, key: keyChar, code: keyCode }) tmp.dispatchEvent(event) }, delay); delay += 10; setTimeout(() => { var event = document.createEvent('Event') event.initEvent('keyup', true, false) event = Object.assign(event, { ctrlKey: false, metaKey: false, altKey: false, which: Temp, keyCode: Temp, key: keyChar, code: keyCode }) tmp.dispatchEvent(event) }, delay); } pressKey(39, 'ArrowRight', 'ArrowRight'); for(let i = 1; i <= n; i ++){ if(i & 1){ for(let j = 1; j <= n; j ++){ if(board[i][j] > 0){ adj = [board[i][j]]; if(mn[mp.get(adj.toString())] == 1){ pressKey(32, ' ', 'Space'); pressKey(16, 'Shift', ''); } else{ pressKey(16, 'Shift', ''); pressKey(32, ' ', 'Space'); } } if(j < n){ pressKey(39, 'ArrowRight', 'ArrowRight'); } } } else{ for(let j = n; j > 0; j --){ if(board[i][j] > 0){ adj = [board[i][j]]; if(mn[mp.get(adj.toString())] == 1){ pressKey(32, ' ', 'Space'); pressKey(16, 'Shift', ''); } else{ pressKey(16, 'Shift', ''); pressKey(32, ' ', 'Space'); } } if(j > 1){ pressKey(37, 'ArrowLeft', 'ArrowLeft'); } } } if(i < n){ pressKey(40, 'ArrowDown', 'ArrowDown'); } } pressKey(13, 'Enter', 'Enter'); } else { var btn = document.getElementById('btnNew'); if(btn){ btn.accessKey = 'n'; // btn.click(); } } })();