背景
在发现被老板CPU之后,大家想做的基本上都是摸鱼,像我这种没什么手法的人不可能摸鱼打MOBA游戏,所以只能选择数独这种对时间要求不怎么急促的小游戏。然而,有时候搞半天才发现从一开始就错了,这让我很苦恼,看来有必要对这一摸鱼行动进行再次摸鱼。
平台
偶然发现的在线数独页游[在线数独 (sudoku-cn.com)]
方案
浏览器安装油猴插件,并新建一个油猴脚本,其内容如下:
// ==UserScript==
// @name 右键自动解答数独
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author You
// @match https://sudoku-cn.com/
// @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant none
// ==/UserScript==
(function() {
'use strict';
let board = [];
let over = false;
let hang=[];
let lie=[];
let mid=[];
function getQuestion() {
hang=[];
lie=[];
mid=[];
for(let i=0;i<9;i++){
hang.push([false,false,false,false,false,false,false,false,false]);
lie.push([false,false,false,false,false,false,false,false,false]);
mid.push([false,false,false,false,false,false,false,false,false]);
}
board=[];
let str="";
for (let i = 0; i < 9; i++) {
board.push([]);
for (let j = 0; j < 9; j++) {
let div = document.querySelector("#vc_" + j + "_" + i);
if (div.innerHTML.trim().length != 0&&div.className=="r1") {
board[i].push(div.innerHTML.trim());
str+=div.innerHTML.trim();
hang[i][board[i][j].charCodeAt(0)-49]=true;
lie[j][board[i][j].charCodeAt(0)-49]=true;
mid[Math.floor(i/3)*3+Math.floor(j/3)][board[i][j].charCodeAt(0)-49]=true;
} else {
str+="_";
board[i].push("_");
}
}
}
/* console.log("源:",str); */
}
function dfs(i,j) {
if (over)
{
return;
}
if (i >= 9 || j >= 9)
{
over = true;
return;
}
if (board[i][j] != '_')
{
if (j == 9 - 1)
{
dfs(i + 1, 0);
}
else
{
dfs(i, j + 1);
}
return;
}
for(let number = 1; number <= 9; number++)
{
if (hang[i][number - 1] || lie[j][ number - 1] || mid[Math.floor(i / 3) * 3 +Math.floor( j / 3)][ number - 1])
{
continue;
}
else
{
board[i][j] =String.fromCharCode(number + 48);
hang[i][number - 1] = true;
lie[j][ number - 1] = true;
mid[Math.floor(i / 3) * 3 + Math.floor(j / 3)][ number - 1] = true;
if (j == 9 - 1)
{
dfs(i + 1, 0);
}
else
{
dfs(i, j + 1);
}
if (over)
{
return;
}
else
{
board[i][j] = '_';
hang[i][ number - 1] = false;
lie[j][ number - 1] = false;
mid[Math.floor(i / 3) * 3 +Math.floor( j / 3)][ number - 1] = false;
}
}
}
}
function setAnswer() {
let index = 0;
for (let i = 0; i < 9; i++) {
for (let j = 0; j < 9; j++) {
let div = document.querySelector("#vc_" + j + "_" + i);
div.innerHTML = board[i][j];
}
}
}
document.oncontextmenu = (e) => {
e.preventDefault();
over = false;
getQuestion();
dfs(0,0);
setAnswer();
}
})();
如代码所示,我把鼠标右键默认事件取消了,取而代之的是右键单击时自动求解该题目,并填写答案进去。
测试
直接高级+难度的题目
点击鼠标右键直接求解
全是绿色的,那就没问题了。
至此,完成了摸鱼也摸鱼的目标。