python解《十滴水》辅助工具算法源码

时间:2013-07-13 | 分类:个人日志,学习园地 | 浏览:11717 | 评论:16 | 发表评论

接上一篇:python解《十滴水》算法

先看个视频,建议超清全屏看。

这里用到了AutoPy,AutoPy是一个简单跨平台的Python GUI工具包,可以控制鼠标,键盘,匹配颜色和屏幕上的位图。使用纯ANSI C编写而成,可运行在Mac OS X、Windows和X11上。
GitHub地址:https://github.com/msanders/autopy
API帮助文档:http://www.autopy.org/documentation/api-reference/index.html
虽然介绍说是跨平台,但是从Mac OS X 10.6之后开始,Mac系统就禁用了不少API,作者也停止了维护,所以Mac版本用不了了,只能用Windows测试。

制作过程如下(其它编程语言的做法也是一样的):
一、游戏位置定位。
因为要通过屏幕取色的方法来获取水滴数,所以首先要知道游戏在屏幕上的位置。
用屏幕取色工具可以发现,游戏边框的颜色(#CFDFEB)和其它颜色不同,所以可以通过查找游戏边框的颜色的方法来定位:

因为屏幕的坐标原点在屏幕左上角,所以可以把浏览器移到屏幕左上角,竖直方向在屏幕垂直居中,搜索游戏边框的代码如下:

    #通过游戏边框的颜色获取游戏边框的位置
    def get_border_position(self):
        #截取整个屏幕
        self.screen = bitmap.capture_screen()
        #注意:浏览器移到屏幕左上角,游戏垂直居中
        self.border_x = 0
        self.border_y = 0
        self.border_color = 0xCFDFEB
        for x in range(self.screen.width):
            color_value = self.screen.get_color(x, self.screen.height/2)
            if color_value == self.border_color:
                self.border_x = x
                break
        for y in range(self.screen.height):
            if self.screen.get_color(500, y) == self.border_color:
                self.border_y = y
                break

二、找出装水滴的格子边缘与游戏边框的距离。
这个距离是固定的,用图片编辑工具可以很方便地测量出格子边缘与游戏边框水平相差35像素,竖直相差20像素。
顺便测量出每个格子的大小是60*60像素。

三、判断某个点是不是绿色。
因为水滴是半透明的,会和背景颜色混在一起,所以不能判断一个点的颜色是不是等于某种绿色。
用屏幕取色工具观察颜色的规律,很快就能得出一个结论:“如果一个点的颜色的r值小于0x70,并且g值大于0XA0,就表示该点是绿色。”这只是一个大概的范围,比如r小于0x80也是可以的。

四、获取每个格子的水滴数。
因为水滴是绿色的,可以很容易区分开水滴和背景的颜色,再找出4种水滴不重叠的地方:

把4种水滴的相对位置的图拼在一起,然后在每种水滴不重叠的地方随便找1个坐标点,分别用来标识4种水滴。
程序首先判断(35,55)处是不是绿色,是的话就说明该格子有4滴水,不是就判断(30,5)是不是绿色,是的话就说明该格子有3滴水……如果4个点都不是绿色,那么该格子就有0滴水:

    #获取某个格子上的水滴数
    def get_drops(self, i, j):
        #pos_list数组存放4、3、2、1滴水的位置相对坐标
        pos_list = [(35, 55), (30, 5), (48, 25), (30, 25)]
        #计算第j行第i列的格子原点(格子左上角的屏幕坐标)
        grid_x = self.offset_x + self.grid_length * i
        grid_y = self.offset_y + self.grid_length * j
        for index, (x, y) in enumerate(pos_list):
            #获取格子原点加上相对坐标后的点的颜色值
            color_value = self.screen.get_color(grid_x + x, grid_y + y)
            r, g, b = color.hex_to_rgb(color_value)
            #如果该点是水滴的颜色就返回水滴数
            if r < 0x70 and g > 0xA0:
                return 4 - index
        return 0

五、移动鼠标点击格子。
要把格子的坐标转化为屏幕坐标,再移动鼠标指针到该位置单击左键:

    #鼠标点击某个格子
    def click(self, point):
        grid_x = self.offset_x + self.grid_length * (point[1] + 0.5)
        grid_y = self.offset_y + self.grid_length * (point[0] + 0.5)
        mouse.move(int(grid_x), int(grid_y))
        mouse.click()

代码下载:https://github.com/poboke/Ten-drops-cheater

.

标签: , , , ,
本文链接: python解《十滴水》辅助工具算法源码
版权所有: 破博客, 转载请注明本文出处。

16个评论

  1. Vespa
    2014/01/06 00:56:23

    我也很喜欢用编程的方法来做一些益智小游戏的解~
    AutoPy这个包不错,有空研究一下~

    • admin
      2014/01/08 09:37:09

      研究人工智能是正确的方向

  2. 菜鸟路过
    2013/08/29 16:28:55

    :oops: :oops: 老大你好 路过你的博客 女朋友喜欢玩十滴水 希望你提供一个菜鸟可以用的辅助好不好 联系我的邮箱

    • admin
      2013/08/29 23:15:23

      没时间弄,你去装个python2.7就行了

  3. C盘电影
    2013/08/20 16:23:47

    :evil: 这招狠!我也去试试

  4. 阿小信
    2013/07/30 16:15:42

    可以试试Sikuli 更简单,直接截图就能找到位置

    • admin
      2013/07/30 17:11:00

      这么厉害,有空试试

  5. Calms
    2013/07/30 11:27:56

    非常赞的技术牛人。很高兴今天碰到了这样一个博客。。

    • admin
      2013/07/30 16:59:12

      你的博客也挺不错的

  6. 平凡的日子
    2013/07/23 19:44:09

    你这个博客是用哪种语言写的呢。这博客很好。

  7. Noelle
    2013/07/14 19:43:47

    开始一眼瞧过去看到视频,以为你找到了微软的远程漏洞了,正在exp提权呢。。。。。

    • admin
      2013/07/14 19:54:48

      :sad: 我怎么可能会那么高深的技术

  8. Noelle
    2013/07/14 19:37:59

    不错不错 :evil: :evil:

发表评论

您的昵称: *

您的邮箱: * (显示gravatar头像)

联系方式: