随着移动技术的飞速发展,“小程序”越来越受欢迎。“数独”就是这样一款广受欢迎的益智游戏,不仅可以让人振奋精神、陶冶情操,还可以促进大脑的使用、开发智力。但有时你可能会遇到“麻烦事”,就是有些题花了很长时间也解不出来,真的很烦人。
想到几年前风靡一时的“跳跳”游戏,笔者便萌生了一个想法:能不能用它来玩“数独”呢?经过探索和实践,这款万能游戏果然没有让人失望,它不仅可以解题,还实现了全自动执行,从读题、计算到填答案,一气呵成,无需人工干预。
数独游戏分析
“数独”一词来源于日语,是“数独”的音译,意为“每个数字只能出现一次”。“数独”起源于中国古代的九宫格,18世纪,瑞士盲数学家欧拉在九宫格的基础上发明了拉丁方格,这便是当今数独的雏形。游戏要求玩家根据9×9棋盘上已知的数字,推断出所有剩余空格的数字,使得1至9的每个数字在每一行、每一列、每一宫中都只出现一次。微信游戏数独部分界面如图1所示。
图1
在解答这个数独游戏时,玩家需要准确计算,算出第一个空格应该填入的数字,然后通过点击九宫格中对应的空格,再点击九宫格下方对应的数字,就填入了一个数字,填满了所有的空格。
解决方案设想
由于该游戏是运行在手机等移动设备上的移动应用游戏,为了完全自动化地解决该数独游戏,设计采用以下步骤。
步骤1:截取游戏画面。通过一定的技术手段,截取移动终端上的游戏画面,并保存到电脑上。
第二步:识别并保存“数独谜题”。设计程序分析游戏画面,识别九宫格中已知数字,并将数字保存到二维列表变量中,其中空白部分的数字以“。”分隔,字符替换相当于保存“数独谜题”。
步骤3:解决问题。设计一个算法来获取此数独问题的答案并将其保存在二维列表变量中。
步骤4:填写答案。利用一定的技术手段控制手机点击,即通过电脑根据答案点击移动终端相应区域,完成答题。方案实现流程如图2所示。
图 2
程序代码编写
确定解决方案后,就可以开始编写程序代码,使用.7作为编程语言。
模块 1:使用 ADB 工具保存数独屏幕
ADB( )是用来实现电脑与模拟器或者真实移动设备交互的开发调试工具,ADB工具功能强大,本次应用主要涉及3个应用:利用它来实现电脑截取手机屏幕并保存为图片文件;图片文件下载到电脑;电脑控制手机点击。其中截取手机屏幕并下载图片到电脑的核心代码如图3所示。
图片 3
模块二:利用OCR文字识别技术构建“数独谜题”
从手机抓图后需要获取“数独谜题”,需要用到OCR文字识别技术,实现该功能的方法有很多,本应用采用百度大脑AI开放平台的“通用文字识别”模块,需要注册成为百度开发者,下载安装基于语言的OCR开发工具包“OCR SDK”才能调用OCR文字识别功能。
将图片切割成小方块,并分别保存。在进行OCR识别之前,需要对图片进行切割,即把9×9磁盘上的每一个小方块切割出来,并保存为独立的图片文件,一共81个图片文件。这个任务可以使用语言的PIL模块完成。创建自定义函数()将图片切割成小方块,并返回小方块的图片文件名。核心代码如图4所示。
图 4
OCR文字识别。获取小方块的图片文件后,调用OCR文字识别模块进行识别。创建自定义函数()进行识别并返回结果。核心代码如图5所示。
图 5
构造“数独谜题”。获取到各个小方格的字符后,就可以构造“数独谜题”了。创建自定义函数()构造二维数组存储“数独谜题”并返回,核心代码如图6所示。
图 6
模块 3:使用回溯算法解决数独问题
“数独谜题”构造完成后,需要采用合适的算法进行解答。数独中的数字千变万化,解答方法也灵活多样,主要有消去法、余数法、隐式唯一数法、数对法和回溯法。回溯法的基本思想是从第一个空白处开始尝试填入数字,从1开始,如果1不满足横纵九宫格不重复的要求,则填入2,以此类推,直到空白处填入暂时符合规则的数字,中断此格,移至下一格重复此过程。如果到达某一格发现有无数个选项,说明前一格填错了,则返回上一格重新开始。在断点处继续尝试9,直到回到填错的格子。有兴趣的读者可以深入研究。关键句如图7所示。
图 7
模块四:使用ADB工具填写答案
要在手机端自动完成答题工作,整体思路是利用ADB工具模拟手机点击,建立自定义函数(x,y),实现手机上指定坐标的模拟点击事件,核心代码如图8所示。
图 8
有了数独解决方案之后,就可以使用ADB工具完成自动回填操作了,按照小游戏的操作流程,程序先点击需要回填的小方块,然后点击下方的数字区域,核心代码如图9所示。
图 9
程序测试优化
以上四个核心模块设计完成后,主程序也按照逻辑顺序建立并连接起来了,接下来就可以进入测试和修改阶段了。首先用数据线把手机连接到电脑上,然后安装相应的 ADB 驱动,之后就可以在电脑上运行主程序了。如果一切顺利的话,程序运行后你就可以开心地看到一个看不见的“手指”轻快地敲击着手机屏幕,电脑神奇地在短短几秒甚至几十秒内就解决了。
《普通高中信息技术课程标准(2017年版)》除了设置选修必修模块5“人工智能”外,还专门在必修模块1中引入了人工智能模块的学习,以达到“通过人工智能典型案例的分析,了解智能信息处理的巨大进步和应用潜力,认识到人工智能在信息社会中的重要作用”。如何在中小学开展人工智能教育,将是我们面临的新课题。本案例结合人工智能OCR文字识别技术的应用,融合了图像裁剪编辑、移动设备控制、算法与编程等知识技能的学习,能激发探索兴趣,是一个很好的学习案例。