最近从GP上翻出了之前玩的一款消磨时间的游戏“数独世界” --le.lenovo.sudoku,登陆了GP账号发现已经取得了一些成就,但之前的记录没了,得从新开始玩。懒得费力的去重复完成之前关卡,于是想着怎么能自动填充数独。

抱着试一试的态度,开始了研究。

一、反编译

这款app做了混淆处理,和一些简单的防反编译的措施。正常的工具会失败,得使用强力的反编译工具才行。

1、去广告

广告挺多的,从splash activity、ResumeGameActivity、SudokuActivity等页面都有广告。查看了一下,是使用的Android原生广告,并且程序打印了广告的一些log出来。顺着log可以找到关键地方,然后禁用掉。在AndroidManifest.xml中,也可以看到广告activity的声明,直接删掉就好了。剩下可能残留一些banner广告,暂时留着吧,也给开发者留点收入。

2、分析页面布局

游戏的主页面是SudokuActivity,查看布局发现,棋盘宫格的部分是自定义SuduPuzzleView,使用draw方法绘制出来。因为对Android不了解,没想到什么办法能够识别这块内容。代码中做了混淆,数独的生成的地方也懒得找(不才,没找到),于是就换了种思路,打算用python来解决。

二、用python解决

总体的方法思路如下:

识别初始化的数独 -> 解数独 -> 将解填入至游戏中

1、解数独

最复杂的部分就是解数独了,好的算法会更快。但是算法什么的目前还搞不定,先找一找解数独的相关资料用现成的。发现一个排除候选猜测法,感觉还是很不错的。试验了一些数独,解得很快,具体的算法可以参看他的page。

Python秒解最难数独

大概是这样:先是采用“排除候选法”,确定能确定的数字,中间还额外增加了隐形排除法用来简化问题。当所有的空位都确定后,仍有一些空位有多个值,这时候就采用作者后半部分的猜测算法。先是进行对候选的列表进行评分,根据评分选择候选列表中数字最少的一个来开始 猜测-回溯。

2、识别数独

有了解数独的方法,剩下的就好办了,只需给他传一个初始化的data数组就行。有内容的填对应的数字,空内容的则填写0。

初始化数组的方法打算用图片处理:先把当前游戏页面截图,然后分别识别数独9x9宫格的对应内容,之后存入data数组

处理图片用的是PIL库,用到的基本操作都很简单:

# 读取image

image = Image.open(ori_img)

# 确定剪裁区域

box = (x_start, y_start, x_end, y_end)

# 剪裁图片

newImage = image.crop(box)

#保存剪裁的图片

newImage.save(save_file)

图片识别使用的是tesseract-ocr引擎和pytesseract库。因为游戏中数字的背景很纯(忽略颜色),所以非常容易识别,出错率很小。使用方法也异常的简单。需要注意的就是参数psm,不同情况需要调整psm参数才行。

# PIL 打开已经剪裁好的图片

image = Image.open(img)

# 转换为L -> 灰色图像 方便识别。

# 关于PIL其他8种模式可以翻阅其他资料,这里采用L模式

image = image.convert('L')

# 使用pytesseract模块中的image_to_string方法,将图片识别的数字转为string。

text = pytesseract.image_to_string(image, config='-psm 9')

# string转int,这里偷懒,没做校验。如果出错的就挂了╥﹏╥...

number = int(text)

# 返回数字供调用方

return number

附:psm参数的说明,可以使用命令tesseract --help-psm查看

$ tesseract --help-psm

Page segmentation modes:

0 Orientation and script detection (OSD) only.

1 Automatic page segmentation with OSD.

2 Automatic page segmentation, but no OSD, or OCR.

3 Fully automatic page segmentation, but no OSD. (Default)

4 Assume a single column of text of variable sizes.

5 Assume a single uniform block of vertically aligned text.

6 Assume a single uniform block of text.

7 Treat the image as a single text line.

8 Treat the image as a single word.

9 Treat the image as a single word in a circle.

10 Treat the image as a single character.

11 Sparse text. Find as much text as possible in no particular order.

12 Sparse text with OSD.

13 Raw line. Treat the image as a single text line,

bypassing hacks that are Tesseract-specific.

这样通过识别9x9宫格的图片后,我们就自然而然的转化为我们需要的data数组。另外,解法中最后提供的类型是numpy的ndarray类型。

3、填充数字

这里更懒,通过最原始的adb点坐标形式。。。将数独的81个数据与对应的81个坐标联系起来,通过for循环依次填进去。因为只在自己的机器上,所以坐标什么的都写死了

数独android程序,Android-数独世界自动完成标准数独的小脚本相关推荐

  1. eclipse下编写android程序突然不会自动生成R.java文件和包的解决办法

    eclipse下编写android程序突然不会自动生成R.java文件和包的解决办法 我的eclipse原来是好好的,什么问题都没有的,结果今天一打开新建一个android程序,发现工程里不会自动生成 ...

  2. 小程序源码:自动采集头像大全微信小程序

    这是一款以头像为主的一款微信小程序源码 该小程序内包含了各种分类,各种样式都有 可以说是目前最全的一款头像小程序源码 五大分类情侣,女生,男生,卡通,风景 每大分类下面都有N个小分类,每个小分类下面有 ...

  3. 【小程序源码】自动采集头像大全微信小程序源码支持多分类

    这是一款以头像为主的一款微信小程序源码 该小程序内包含了各种分类,各种样式都有 可以说是目前最全的一款头像小程序源码 五大分类情侣,女生,男生,卡通,风景 每大分类下面都有N个小分类,每个小分类下面有 ...

  4. 小程序源码:自动采集头像大全微信小程序源码支持多分类-多玩法安装简单

    这是一款以头像为主的一款微信小程序源码 该小程序内包含了各种分类,各种样式都有 可以说是目前最全的一款头像小程序源码 五大分类情侣,女生,男生,卡通,风景 每大分类下面都有N个小分类,每个小分类下面有 ...

  5. 初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助...

    初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助,如果有bug或者更好的优化方案,也请批评与指正,谢谢,代码如下: 1 var fs = require( ...

  6. c语言数独出题程序,我用C语言写解数独程序(一)

    我要用C语言写一个解数独题目的程序,从我刚开始接触数独的时候,我就这样告诉自己.记得那是暑假的一天.在家闲来无事,就翻开了以前买的一本 <数独>.从看前面的例题开始,然后自己解第一个题,之 ...

  7. java基本微信小程序的快递柜自动取货管理系统 uniapp 小程序

    随着计算机信息技术的发展,越来越多的用户使用手机,各种信息化应用出现在智能手机中,特别是微信APP拥有大量的用户群,使用微信小程序可以为人们的生活提供便利.另一方面,我国网购数量日益增加,各大城市快递 ...

  8. 独数游戏android程序,Android 数独小游戏

    先看看效果图 sudoku-o3.gif 数独设计思路 先看布局,我们可以看到数独由9x9的格子组成,每个格子中间有一个数字. Cell (单个格子.android 中我们可以先用TextView代替 ...

  9. Android程序员眼中世界上最遥远的距离

    世界上最遥远的距离,是我在if里你在else里,似乎一直相伴又永远分离: 世界上最痴心的等待,是我当case你是switch,或许永远都选不上自己: 世界上最真情的相依,是你在try我在catch. ...

  10. 时间计时android程序,Android 时间计时器控件 Chronometer

    当你想要显示时间的推移而不是进程的增加的时候,可以使用Chronometer作为一个计时器.当需要记录用户进行某项操作所消耗的时间的时候,或者在游戏中需要限制时间时候,它将非常实用. 这里,Chron ...

最新文章

  1. 利用Python实现十大经典排序算法(附代码流程)
  2. 勒索软件出新招,小心你的隐私和財产安全!
  3. MongoDB 3.0 WT引擎参考配置文件
  4. 计算多个文档之间的文本相似程度
  5. volatile指令重排_学会了volatile,你变心了,我看到了
  6. Vue.js学习系列(八)---使用路由搭建单页应用(一)
  7. docker gitlab 初始密码查看
  8. STM8 的汇编学习
  9. 02-FTP文件共享服务
  10. 数理统计三(随机分布)
  11. python的数据拼接和融合
  12. 程序员的性格真的内向吗?
  13. 适合Web开发人员的10个CSS代码生成器
  14. 2017 阿里巴巴矢量图标库 导入所选图标到jsp页面步骤
  15. 文献阅读——AIDD
  16. J2EE Java黑客大曝光:开发安全的Java应用程序
  17. 『david_lv』老朋友喜相逢 《走出软件作坊》也喜相逢-SD2.0大会第一天
  18. 三端集成稳压器的问题(78L05/78M05/79L05)
  19. 编译arm-linux驱动时报错:“unrecognized command line option ‘-fstack-protector-strong’”
  20. 计算机动画类型中只有一维动画和二维动画,二维动画与计算机技术论文(2)

热门文章

  1. C语言实现通讯录管理系统
  2. 用kindle看微信公众号文章的一种方法
  3. 电容屏物体识别_电容屏物体识别技术简介
  4. Jogging Trails 邮递员问题
  5. HTML5七夕情人节表白网页(爱情树 Html5实现唯美表白动画代码) HTML+CSS+JavaScript
  6. python编写程序掷骰子游戏_python学习之掷骰子游戏
  7. android xposed安装教程,Android 10机型安装Xposed框架教程
  8. 工具 - 文本比较/对比 - 收集
  9. Exploring Plain Vision Transformer Backbones for Object Detection 论文阅读笔记
  10. 银行计算机综合知识,银行秋招综合知识测试包含哪些专业课?