flash游戏源码

flash游戏源码知道Selenium是用来测试或者抓取动态内容的,真的没想过用它做游戏插件。

作者:真诚地

资料来源:https://blog.yasking.org/a/selenium-whereiouse.html.

我以前玩过一个游戏。老鼠在哪里?如果说吸引人的是这款游戏在Linux下出现了BUG,我的印象是我玩了一个多小时。

正好想到这个游戏,就去玩了一会儿。突然想到最近用的selenium驱动好像可以自动完成这个东西,应该是可行的。

想了想,用selenium自动登录很容易,但是确定点击位置比较麻烦。因为是Flash游戏,不会编码,但是可以截图分析图片。最初的想法是保存一张没有圆圈的图片,然后与有圆圈的图片进行对比,找出差异,进行定位。我没有这么做,我也不知道PIL能不能做到。在搜索的过程中,找到了更好的方法,利用OpenCV的功能可以识别圆。

整个过程如下:

QQ登录

Selenium模拟登录非常简单,唯一需要注意的是操作登录框时需要切换iframe,登录完成后返回之前的环境。

driver . switch _ to . frame(driver . find _ element(By。ID,’ loginFrame ‘))

driver . switch _ to . default _ content

开始游戏

进入游戏页面后,等待游戏加载10秒,但使用selenium获取元素位置。

ele = driver.find_element(By。ID,“FlashContainId”)

位置= ele.location

size = ele.size

这个位置就是元素相对于网页的位置,也就是游戏窗口的左上角。Size是元素的长度和宽度。看网页源代码,和他们定义的640×530大小一致。换句话说,硒的位置和大小单位都是px,更方便下一步的计算。

因为开始按钮的位置是固定的,所以可以直接根据位置计算坐标,点击即可。

从selenium . web driver . common . action _ chains导入操作链

动作链=动作链(驱动程序)

action _ chains . move _ to _ element _ with _ offset(ele,250,420)click . perform。

时间.睡眠(3)

截图

Selenium没有按元素截图的功能,只能裁剪出显示的窗口。但是,有了游戏窗口左上角的坐标和游戏窗口的长宽,就可以用PIL把游戏窗口从整个画面中裁剪出来。

name = str(time.time)[:10]

img = tmp_img_dir + name +’。巴布亚新几内亚

driver.se_screenshot(img)driver.se _截图(img)

# PIL打开图片

im = Image.open(img)im = Image.open(img)

#选区

left =位置[‘x’]

top = location[‘y’] – 174

右=位置[‘x’] +大小[‘宽度’]

bottom =位置[‘y’] +大小[‘高度’] – 174

#剪切并保存

im = im.crop((左,上,右,下))

im.se(img)即时消息保存

因为显示尺寸设置为1366×768,所以这个网站会有一个向下滚动的操作,让游戏窗口在游戏加载后位于屏幕中间。因为游戏窗口相对于浏览器窗口上移了,所以抓取的位置会包含游戏窗口的下半部分和一个100多像素的无关区域,值174会根据截图位置进行调整。我没有在更大的屏幕上测试过,所以可能不通用。

获取圆坐标

下面这篇文章很棒,详细讲解了如何使用OpenCV识别图像中圆的坐标。

在他给我演示的基础上,我简单修改了一下,放在函数里进行循环调用。

def getCirclePos(img_path):def getCirclePos(img_path):

#加载图像,将其克隆用于输出,然后将其转换为灰度

image = cv2.imread(img_path)image = cv2.imread(img_path)

输出= image.copy

gray = cv2.cvtColor(image,cv2。COLOR_BGR2GRAY)

#检测图像中的圆圈

圆圈= cv2。HoughCircles(灰色,cv2.cv.CV_HOUGH_GRADIENT,1.2,50)

#确保至少找到一些圆

如果circles不为None:

#将圆的(x,y)坐标和半径转换为整数

circles = np.round(circles[0,])。astype(“int “)

#在圆的(x,y)坐标和半径上循环

对于圆中的(x,y,r ):

print x, y, r, img_path.split(‘/’)[-1]print x,y,r,img_path.split(‘/’)[-1]

返回(x,y)

否则:

返回False

点击

把以上功能一起放在main里,这个辅助工具就可以正常工作了。先登录,然后加载游戏,开始游戏,进入循环(获取截图,分析圆坐标,点击)。点击后需要给两秒钟睡眠,否则下一个圈还没有出现,升级后的提示“恭喜”也会影响圈出现的时间。如果截图里没有圈,那就需要休息了。之所以这样做,不仅是为了避免不截取圆,还因为有时候即使圆出现正确,分析圆坐标的函数也无法得到坐标。这时候就需要手动点击了。毕竟如果让程序忽悠自己,五次机会可能很快就用完了。但遗憾的是,识别率不仅不到100%,而且随着圆越来越小越来越低,所以这个辅助程序不能全自动,只能半自动。在这一点上,虽然不完美,有很多瑕疵,但是功能和流程是完美的。

完整代码:

最后贴一张玩了几分钟的记录。

是的,最好的历史就是当年玩一个多小时的结果。…

标题:pexels,CC0授权。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

发表回复

登录后才能评论