摸鱼也摸鱼之在线数独自动求解

背景

在发现被老板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();
    }
})();

如代码所示,我把鼠标右键默认事件取消了,取而代之的是右键单击时自动求解该题目,并填写答案进去。

测试

直接高级+难度的题目

点击鼠标右键直接求解

 

全是绿色的,那就没问题了。

扫描二维码关注公众号,回复: 17151302 查看本文章

至此,完成了摸鱼也摸鱼的目标。

猜你喜欢

转载自blog.csdn.net/qq_36694133/article/details/133030910
今日推荐