抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

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

先看个演示视频,建议超清全屏看。
https://v.youku.com/v_show/id_XNTgyMzU2NTA4.html

自动点击使用了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)和其它颜色不同,所以可以通过查找游戏边框的颜色的方法来定位:
This is a picture without description

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#通过游戏边框的颜色获取游戏边框的位置
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种水滴不重叠的地方:
This is a picture without description

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#获取某个格子上的水滴数
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

五、移动鼠标点击格子

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

1
2
3
4
5
6
#鼠标点击某个格子
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

评论