美文网首页我的Python自学之路程序员
教你巧玩 [冲顶大会] 答题类游戏

教你巧玩 [冲顶大会] 答题类游戏

作者: Skye_kh | 来源:发表于2018-01-09 10:00 被阅读11764次

    这两天冲顶大会之类的直播答题 APP 突然火了起来,不得不佩服互联网公司的想象力,那么程序员怎么用不同的方式玩转答题游戏呢。之前微信的跳一跳小游戏刷爆朋友圈,已经有很多朋友写出了自动化的脚本辅助,一看到答题游戏就马上想到可以用类似的方式来写一个简单的脚本。代码思路简单,可以用在各类答题游戏中。因为时间、搜索结果等原因,使用文字识别搜索,能提供的辅助作用有限。

    screenshot.PNG

    具体代码和环境及使用请戳https://github.com/Skyexu/TopSup
    随手 Star ^ ^

    灵感来自:

    微信跳一跳辅助

    程序员如何玩转《冲顶大会》?

    具体做法

    1. 使用 ADB 获取手机截屏
    adb shell screencap -p /sdcard/screenshot.png
    adb pull /sdcard/screenshot.png .
    
    1. OCR 识别题目与选项文字
      分别通过代码截取题目区域与选项区域,再进行文字识别


      cut.png

    文字识别两个方法:

    • 谷歌 Tesseract ,安装软件即可,不同电脑配置运行效率不同

    • 百度 OCR ,需要注册百度 API,每天调用次数有限

    1. 搜索判断

    结果判断方式

    1. 直接打开浏览器搜索问题


      result.png
    2. 题目+每个选项都通过搜索引擎进行搜索,从网页代码中提取搜索结果的数目

    3. 只用题目进行搜索,统计结果页面代码中包含选项的词频

    以下为两个示例结果,可以看出下面两道题,两个方法有不同的结果,可以根据问题类型进行不同的决策。

    result2.png result3.png

    参考了 I Hacked HQ Trivia But Here’s How They Can Stop Me

    主要代码

    验证思路的主要代码是实现截图,识别,调用浏览器搜索。其实很简单,具体可以参考我的 github 库中简单版本代码

    def pull_screenshot():
        os.system('adb shell screencap -p /sdcard/screenshot.png')
        os.system('adb pull /sdcard/screenshot.png .')
    
    pull_screenshot()
    img = Image.open("./screenshot.png")
    
    # 切割题目位置,左上角坐标和右下角坐标,自行测试分辨率
    question = img.crop((50, 350, 1000, 560)) # 坚果 pro1
    choices = img.crop((75, 535, 990, 1150))
    #region = img.crop((75, 315, 1167, 789)) # iPhone 7P
    
    # tesseract 路径
    pytesseract.pytesseract.tesseract_cmd = 'C:\\Program Files (x86)\\Tesseract-OCR\\tesseract'
    # 语言包目录
    tessdata_dir_config = '--tessdata-dir "C:\\Program Files (x86)\\Tesseract-OCR\\tessdata"'
    
    # lang 指定中文简体
    text = pytesseract.image_to_string(question, lang='chi_sim', config=tessdata_dir_config)
    text = text.replace("\n", "")[2:]
    
    print(text)
    webbrowser.open('https://baidu.com/s?wd='+text)
    

    总结

    写完简单版本想一想,怕是还没有 Hi ,Siri来的方便,不过好在识别准确,查询快,后来又加了几个方法辅助决策。文字识别加搜索,在这类游戏中效果很有限,这类问答题想要实现完全对,可能得存储题库了,不过这就太费时间了。有了 ADB 截图,怕是各种小辅助都可以玩了, 大家可以发挥想象力。python 写小脚本真的很方便。接下来可以尝试文字识别后 nlp 处理一下关系,然后搜索不同选择结果,增加准确率等等。不玩了不玩了,得写 paper 去了。

    相关文章

      网友评论

      • 刘大亨:所有答题软件的好助手脑力大亨
      • cea487013622:Skye_kh你好,麻烦有空的时候给看下,运行时总是报错,我是mac+android
        $ python GetQuestionAndroid.py
        采用方式 3 获取截图
        Traceback (most recent call last):
        File "GetQuestionAndroid.py", line 35, in <module>
        question, choices = ocr.ocr_img(img, config)
        File "/Users/millions/Desktop/TopSup-master/common/ocr.py", line 90, in ocr_img
        question = pytesseract.image_to_string(question_im, lang='chi_sim', config=tessdata_dir_config)
        File "build/bdist.macosx-10.10-intel/egg/pytesseract/pytesseract.py", line 183, in image_to_string
        File "build/bdist.macosx-10.10-intel/egg/pytesseract/pytesseract.py", line 130, in run_and_get_output
        File "build/bdist.macosx-10.10-intel/egg/pytesseract/pytesseract.py", line 102, in run_tesseract
        File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 710, in __init__
        errread, errwrite)
        File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1335, in _execute_child
        raise child_exception
        OSError: [Errno 2] No such file or directory
      • 8e5def872244:ocr.ocr_img()这个位置不同手机型号 获取问题和答案的坐标不一样,请问您是如何准确的填坐标的,有什么好的方法吗?
        Skye_kh:@唐唐flying 你可以用电脑画图软件打开截图查看像素坐标
      • 米奇尼诺:小白问一下,Tesserac中文识别很多都识别不出来,主程序怎样换成百度的。百度demo只有搜索功能。
        Skye_kh:@米奇尼诺 你好,我晚上更新一下吧,请关注。这个项目其实只是实现了一个思路,用来答题的话,并没有多大帮助。
      • Vepin:采用方式 2 获取截图
        Traceback (most recent call last):
        File "GetQuestionTessAndroid.py", line 20, in <module>
        question, choices = ocr.ocr_img(img)
        File "F:\Python_workspace\wechat\TopSup-master\common\ocr.py", line 88, in ocr_img
        if (choices[0].endswith('?')):
        IndexError: list index out of range

        我修改了ocr.py中的题目位置参数之后就报了这个错误,知道什么原因吗?
        兆信1019:可以请教一个问题吗
        Skye_kh:@Vepin 应该还是位置没调好
      • 兆信1019:Question: 新装修的房子通常哪种化学物质含量会比较高?
        Traceback (most recent call last):
        File "methods.py", line 89, in <module>
        run_algorithm(1, question, choices)
        File "methods.py", line 82, in run_algorithm
        open_webbrowser_count(question, choices)
        File "methods.py", line 35, in open_webbrowser_count
        output(choices, counts)
        File "methods.py", line 53, in output
        counts = list(map(int, counts))
        ValueError: invalid literal for int() with base 10: 'html><html><head><title></title></head><body><script type="text/javascript">var tn= \'98131360_hao_pg\'p=\'s\'from=\'1020499o\'w=[\'w\'\'wd\'\'word\']statis="http://be.st.wayayaya.com/baidu_sousuo.ht
        楼主这个错误遇见过吗
      • 伐木工蔬菜:H:\桌面\TopSup-master>1.py
        Traceback (most recent call last):
        File "H:\桌面\TopSup-master\1.py", line 9, in <module>
        from common import screenshot, ocr, methods
        File "H:\桌面\TopSup-master\common\ocr.py", line 8, in <module>
        import pytesseract
        ModuleNotFoundError: No module named 'pytesseract'
        看看什么原因
      • 046d72018508:赞一下, 今天在 网络课程里 看到他们讲你这个项目
      • 9b47943c6003:楼主,adb devices能直接在安卓模拟器用吗,安卓模拟器是不是要修改题目切割范围
        Skye_kh:你好,可以在模拟器用,需要修改范围
      • SEETWOOD:有这个想法,奈何技术不到位,学习学习
      • b8e35389e002:少年,弄个docker吧,皮森弄起来太费劲了
        Skye_kh:docker 没玩过,早就想看看了:confounded:
      • 五七增停:Traceback (most recent call last):
        File "GetQuestionTessAndroid.py", line 20, in <module>
        question, choices = ocr.ocr_img(img)
        File "C:\Program Files (x86)\ClockworkMod\Universal Adb Driver\common\ocr.py", line 64, in ocr_img
        question = pytesseract.image_to_string(question_im, lang='chi_sim', config=tessdata_dir_config)
        File "C:\Users\hj226\AppData\Local\Programs\Python\Python36\lib\site-packages\pytesseract\pytesseract.py", line 125, in image_to_string
        raise TesseractError(status, errors)
        pytesseract.pytesseract.TesseractError: (1, 'Error opening data file C:\\Program Files (x86)\\Tesseract-OCR\\tessdata/chi_sim.traineddata')

        我的是这种问题,命令行直接ADB没反应,就把楼主的文件搬到了ADB文件夹下面了,能够得到手机截图,命令行报上面错误
        五七增停:@Skye_kh 我直接用的楼主的源码,我在网上找的原因是不能读取训练数据
        Skye_kh:@五七增停 /chi_sim.traineddata 去掉
        五七增停:我用的google版识别和win10
      • 井底蛙蛙呱呱呱:请教一下 这是每出一题都需要手动截图吗? 然后通过adb推送到电脑端吗?
        Skye_kh:是的,也可以用电脑模拟器快一点。这也就娱乐一下:blush:
      • 小鱼嘻嘻:能不能把Mac教程写的详细一些,其他系统这个能不能介绍详细一些,谢谢。
        代小代isDelenDelen:@小鱼嘻嘻 借楼主宝地,广告一下,最近实现了 iphone 6 plus 11.0版本的截图 然后python ocr pytesseract截图和识别出文字,加搜索,回头贴一下代码
        小鱼嘻嘻:主要我是Mac电脑加iPhone手机:sweat:
        Skye_kh:如果用的是安卓,应该不麻烦,更新了一下,你看看
      • ce2e2ce05682:厉害厉害
        Skye_kh:@听雨歌楼上_eaec 错误详情贴一下
        4c65b73b18f2:使用荣耀V8,python3.6编译出现乱码问题,怎么解决?
        Skye_kh:@博格berg 😁

      本文标题:教你巧玩 [冲顶大会] 答题类游戏

      本文链接:https://www.haomeiwen.com/subject/yghwnxtx.html