数独android程序,Android-数独世界自动完成标准数独的小脚本
最近从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-数独世界自动完成标准数独的小脚本相关推荐
- eclipse下编写android程序突然不会自动生成R.java文件和包的解决办法
eclipse下编写android程序突然不会自动生成R.java文件和包的解决办法 我的eclipse原来是好好的,什么问题都没有的,结果今天一打开新建一个android程序,发现工程里不会自动生成 ...
- 小程序源码:自动采集头像大全微信小程序
这是一款以头像为主的一款微信小程序源码 该小程序内包含了各种分类,各种样式都有 可以说是目前最全的一款头像小程序源码 五大分类情侣,女生,男生,卡通,风景 每大分类下面都有N个小分类,每个小分类下面有 ...
- 【小程序源码】自动采集头像大全微信小程序源码支持多分类
这是一款以头像为主的一款微信小程序源码 该小程序内包含了各种分类,各种样式都有 可以说是目前最全的一款头像小程序源码 五大分类情侣,女生,男生,卡通,风景 每大分类下面都有N个小分类,每个小分类下面有 ...
- 小程序源码:自动采集头像大全微信小程序源码支持多分类-多玩法安装简单
这是一款以头像为主的一款微信小程序源码 该小程序内包含了各种分类,各种样式都有 可以说是目前最全的一款头像小程序源码 五大分类情侣,女生,男生,卡通,风景 每大分类下面都有N个小分类,每个小分类下面有 ...
- 初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助...
初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助,如果有bug或者更好的优化方案,也请批评与指正,谢谢,代码如下: 1 var fs = require( ...
- c语言数独出题程序,我用C语言写解数独程序(一)
我要用C语言写一个解数独题目的程序,从我刚开始接触数独的时候,我就这样告诉自己.记得那是暑假的一天.在家闲来无事,就翻开了以前买的一本 <数独>.从看前面的例题开始,然后自己解第一个题,之 ...
- java基本微信小程序的快递柜自动取货管理系统 uniapp 小程序
随着计算机信息技术的发展,越来越多的用户使用手机,各种信息化应用出现在智能手机中,特别是微信APP拥有大量的用户群,使用微信小程序可以为人们的生活提供便利.另一方面,我国网购数量日益增加,各大城市快递 ...
- 独数游戏android程序,Android 数独小游戏
先看看效果图 sudoku-o3.gif 数独设计思路 先看布局,我们可以看到数独由9x9的格子组成,每个格子中间有一个数字. Cell (单个格子.android 中我们可以先用TextView代替 ...
- Android程序员眼中世界上最遥远的距离
世界上最遥远的距离,是我在if里你在else里,似乎一直相伴又永远分离: 世界上最痴心的等待,是我当case你是switch,或许永远都选不上自己: 世界上最真情的相依,是你在try我在catch. ...
- 时间计时android程序,Android 时间计时器控件 Chronometer
当你想要显示时间的推移而不是进程的增加的时候,可以使用Chronometer作为一个计时器.当需要记录用户进行某项操作所消耗的时间的时候,或者在游戏中需要限制时间时候,它将非常实用. 这里,Chron ...
最新文章
- 利用Python实现十大经典排序算法(附代码流程)
- 勒索软件出新招,小心你的隐私和財产安全!
- MongoDB 3.0 WT引擎参考配置文件
- 计算多个文档之间的文本相似程度
- volatile指令重排_学会了volatile,你变心了,我看到了
- Vue.js学习系列(八)---使用路由搭建单页应用(一)
- docker gitlab 初始密码查看
- STM8 的汇编学习
- 02-FTP文件共享服务
- 数理统计三(随机分布)
- python的数据拼接和融合
- 程序员的性格真的内向吗?
- 适合Web开发人员的10个CSS代码生成器
- 2017 阿里巴巴矢量图标库 导入所选图标到jsp页面步骤
- 文献阅读——AIDD
- J2EE Java黑客大曝光:开发安全的Java应用程序
- 『david_lv』老朋友喜相逢 《走出软件作坊》也喜相逢-SD2.0大会第一天
- 三端集成稳压器的问题(78L05/78M05/79L05)
- 编译arm-linux驱动时报错:“unrecognized command line option ‘-fstack-protector-strong’”
- 计算机动画类型中只有一维动画和二维动画,二维动画与计算机技术论文(2)
热门文章
- C语言实现通讯录管理系统
- 用kindle看微信公众号文章的一种方法
- 电容屏物体识别_电容屏物体识别技术简介
- Jogging Trails 邮递员问题
- HTML5七夕情人节表白网页(爱情树 Html5实现唯美表白动画代码) HTML+CSS+JavaScript
- python编写程序掷骰子游戏_python学习之掷骰子游戏
- android xposed安装教程,Android 10机型安装Xposed框架教程
- 工具 - 文本比较/对比 - 收集
- Exploring Plain Vision Transformer Backbones for Object Detection 论文阅读笔记
- 银行计算机综合知识,银行秋招综合知识测试包含哪些专业课?