中年|技术探索|全自动玩转小程序“数独”


中年|技术探索|全自动玩转小程序“数独”
本文插图

随着移动技术的快速发展 , “小程序”越来越受人们的喜爱 。 “数独”就是这样一款广受人们喜爱的益智类小游戏 , 它既可以愉悦心情、陶冶情操 , 又可以促进用脑、开发智力 。 但有时也会碰到“烦心事” , 那就是有些题目花费了很长时间也解不了 , 着实让人有点儿闹心 。
想起前几年很火的Python挑战“跳一跳”小游戏 , 笔者萌生了一个念头:能不能用Python来玩转“数独”呢?通过摸索与实践 , 万能的Python没有让人失望 , 它不但可以破解 , 还实现了全自动的执行 , 从读题、运算到填写答案 , 一气呵成 , 其间都无需人工干预 。
数独游戏分析
“数独”一词源于日语,是“SUDOKU”的音译,意为“每个数字只能出现一次” 。 “数独”起源于中国古代的九宫格 。 到了18世纪,瑞士盲人数学家欧拉在九宫格的基础上发明了“拉丁方块”,即今天的“数独”的雏形 。 游戏要求玩家根据9×9盘面上的已知数字, 推理出所有剩余空格的数字,使1~9每个数字在每一行、每一列和每一宫中都只出现一次 。 微信小游戏数独的部分界面如图1所示 。
中年|技术探索|全自动玩转小程序“数独”
本文插图

图1

在解答这个数独游戏时 , 玩家需要精确计算 , 推算出第一个空格应该填写的数字 , 然后通过点击九宫格中相应的空格 , 再点击九宫格下方相应的数字 , 即完成了一个数字的填写 , 直到将所有的空格全部填满为止 。
解决方案设想
由于此游戏属于一款移动应用游戏 , 运行于移动设备如手机上 , 为了全自动地求解这款数独游戏 , 设计采用以下几个步骤 。
第一步:截取游戏画面 。 通过一定的技术手段截取移动端的游戏画面 , 并保存到计算机端 。
第二步:识别并保存“数独题目” 。 设计程序 , 分析游戏画面 , 识别九宫格中的已知数字 , 并将数字保存至一个二维列表变量中 , 其中 , 空格部分的数字以“.”字符代替 , 相当于保存了“数独题目” 。
第三步:求解题目 。 设计算法 , 得出此数独题目的答案 , 保存到一个二维列表变量中 。
第四步:回填答案 。 以一定的技术手段实现控制手机端的点击 , 即通过计算机按照答案点击移动端的相应区域 , 完成题目的解答 。 其解决方案实施流程如图2所示 。
中年|技术探索|全自动玩转小程序“数独”
本文插图

图2
程序代码编写
在确定了解决方案以后 , 就可以着手程序代码编写工作了 , 编程语言采用Python3.7 。

模块一:采用ADB工具实现数独画面保存
ADB即Android Debug Bridge(安卓调试桥) , 属于Android开发调试工具 , 用于实现通过实现计算机端与模拟器或者真实移动设备之间的交互 。 ADB工具功能强大 , 本应用主要涉及了3种应用:使用其实现通过计算机截取手机的画面并保存为图片文件;将画面图片文件下载至计算机端;用计算机控制手机端的点击 。 其中用于截取手机端的画面及将图片下载到计算机的核心代码如图3所示 。
图3
模块二:采用OCR文字识别技术实现“数独题目”构建
从手机截取图片以后 , 需要获取“数独题目” , 这里必须用到OCR文字识别技术 。 能实现此功能的方法也有很多 , 本应用选取了百度大脑AI开放平台的“通用文字识别”模块 。 只需注册成为百度开发者 , 下载安装基于Python语言的OCR开发包“OCR Python SDK” , 即可调用OCR文字识别功能 。
将图片切割成小方块 , 并分别保存 。 在进行OCR识别之前 , 还需要对图片进行切割处理 , 也即将9×9盘面上的每一个小方块切割以后保存成一个独立的图片文件 , 共计81个图片文件 。 此项任务 , 可以使用Python语言的PIL模块完成 。 建立自定义函数get_image_xy() , 用于图片切割成小方块 , 并返回小方块的图片文件名 。 核心代码如图4所示 。


推荐阅读