还不给开学。。。太无聊了
需要用到的库
首先打开4399,挑选一个数独游戏,点击全屏,用picpick软件获取数独左上角和右下角的屏幕坐标,记录下来,然后按下F12获取该窗口的title = “九宫格数独小游戏,在线玩,4399小游戏”
具体思路是
利用win32gui库根据窗口名字将数独游戏的窗口显示在屏幕最前面,由于我是用谷歌浏览器打开的,所以title = u”九宫格数独小游戏,在线玩,4399小游戏 – Google Chrome”
将鼠标移到左上角防止干扰
根据数独游戏的位置信息裁剪数独图片
然后将数独图片切割成9 * 9个小块图片,对每个图片进行识别,将图片转为一个二维的数独数组。不过这里的数字识别我没有用深度学习的方法(懒得训练,而且其数字很规则),尝试用开源tesseract来对图片识别,奈何tesseract识别率太低,就用了比较投机取巧的方法:首先切割成9 * 9个小图片,再把小图片周围的蓝边去掉,利用opencv对小图片进行边缘检测,边缘检测算子是canny,最后统计边缘检测结果图片中白色像素的数量,发现数字“1”的白色像素有49个,数字“2”的白色像素有72个……,将数据放入字典cannydict中,cannydict = {49:1, 72:2, 75:3, 59:4, 73:5, 82:6, 61:7, 87:8, 81:9, 0:0}, 所以往后只需要判断边缘检测图片的白色像素为多少就可以确定该图片写的数字是啥了。(这里的数据只对该数独游戏有效,其他游戏还是自己测试吧)
将图片转为二维数独数组之后,还需要保存一个一样的二维数组做备份,毕竟后面解答的时候你需要知道在哪些位置填数字
然后便是解数独,采用回溯法:找出第一个空白格,根据行、列、所在九宫格判断该空白格可填入的数字(是一个list1),在list1中顺序挑一个数字、再找出下一个空白格的可填入数字(list2)…不断递归,如果下一个空白格可填入数字为0说明该数独解答有误,回溯回去,并把数字改为0,在上一层递归中重新挑选数字…如此往复,直到没有下一个空白格,解答完毕,输出答案。 这里解数独的代码参考B站以为up主, 视频 :BV1gE411h7jh
解完数独,根据之前保留的备份二维数组,就可以在4399游戏界面中的指定位置输入答案了,
完整代码如下:
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!