天天爱消除刷分脚本(终于打败大毛了。。)

转自我的独立博客alanslab.cn,不打算续费域名了。懒人实在不该开什么独立博客。。。csdn的都嫌折腾了。。。。。。。上帝赐我一个脑机接口吧,usb兼容就行。。。

csdn不知道怎么放土豆视频,留链接【http://www.tudou.com/programs/view/QmQ49lg1XTs/?resourceId=321946240_06_02_99


注:视频中的效果是一开始做的暴力划屏幕的作弊效果,这里则是尝试分析截图有目的的去划动。截屏实在太慢,效果还不如暴力。我是懒得继续了搞它了,有兴趣玩的可以看下frame buffer的资料,一定程度应该能缓解截屏速度的限制。

文章比较早,代码已丢。但是所需的东西这里都有,抄抄改改,几十行就完事了。

更新:睡一觉起来改写了算法,之前那个写的时候脑袋有点不太清醒。。。思路就是穷举所有可以消除的模式,跟之前一样,不过改写完好像正确率高了很多,看来之前那个是写太乱漏了什么东西。


前几天被人鄙视了。。今早就试试看写个小脚本刷下分数。

视频里的做法非常简单,就用了android sdk tools 里面的monkeyrunner这一个自动测试工具。

google的文档

做法就是用monkeyrunner截图后用gimp找到卡通角色对应的位置规律,然后代码模拟触控,让其不停上上下下左左右右。。。如视频中所见,一整个屏幕的触控操作几乎同时完成,效果非常给力(google养的这只monkey相当强悍)

中间出了一次小插曲。。我的最高分被清空了一次。。不知道是网络问题还是怎样。。。所以之后就考虑怎么分析图像来解决这问题。好在这游戏还算宽松,没拿什么雪花闪电的挡屏幕,在每个角色的同一位置取色对比就可以了,网上没找着什么合适的算法。。就自己动手暴力编了一个(下文附上),虽然效果差很多而且老是误判(一定有bug。。。懒得找了),今天也算是学习之余休息休息放个假。

第一个版本(代码里没用到的那个注释了crazy monkey的函数,不过应该用不了了)效果不错,分分钟打败大毛。 第二个版本(现在这个)误判连连(已重写,效果还不错,偶尔的误判是因为处理的图像不是实时的,可以调整暂停的时间做一点有限的优化),刷分效果不是太好,但是隐蔽。。。有机会找个霸气点的算法看看怎么改进一下应该也不错。但获取屏幕截图的速度是个硬伤,这个思路估计再努力也到不了第一版的效果,今早本来是想写个打飞机的脚本,也是因为这个问题作罢。

运行方式,先装好andorid sdk,然后复制文后的代码到monkey.py。 接上手机,打开开发者模式,打开游戏,同时点开始按钮和执行下面的命令,玩完关闭的话。。抱歉。。Ctrl+c吧(win是Ctrl+d好像,不行就试试Ctrl+z。。。):

zcfan@alan-ubuntu ~/adb $ ~/android-sdks/tools/monkeyrunner /path/to/monkey.py

windows的话可能是类似这样?应该没错吧。。:

C:\SDK\tools\monkeyrunner C:\monkey.py

monkey.py:

from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
import time

def drag(pos, dir):
	tx = pos[0]
	ty = pos[1]
	if dir == "up":
		ty -= 100
	if dir == "down":
		ty += 100
	if dir == "left":
		tx -= 100
	if dir == "right":
		tx += 100
	device.drag(pos, (tx, ty), 0, 1)

device = MonkeyRunner.waitForConnection()

def capToFile():
	screen = device.takeSnapshot()
	screen.writeToFile("shot.png", "png")

def getNodePos(x, y):
	width = 108
	height = 108
	return (60+(x*width),280+(y*height))

# crazy monkey(s)
def monkeyrun():
	for y in xrange(2, 7, 2):
		for x in xrange(0, 8):
			drag(getNodePos(x, y), "up")
	time.sleep(sleeptime)

	for y in xrange(1, 6, 2):
		for x in xrange(0, 8):
			drag(getNodePos(x, y), "up")
	time.sleep(sleeptime)

	for x in xrange(0, 5, 2):
		for y in xrange(0, 8):
			drag(getNodePos(x, y), "right")
	time.sleep(sleeptime)

	for x in xrange(1, 6, 2):
		for y in xrange(0, 8):
			drag(getNodePos(x, y), "right")
	time.sleep(sleeptime)

	for y in xrange(0, 5, 2):
		for x in xrange(0, 8):
			drag(getNodePos(x, y), "down")
	time.sleep(sleeptime)

	for y in xrange(1, 6, 2):
		for x in xrange(0, 8):
			drag(getNodePos(x, y), "down")
	time.sleep(sleeptime)

	for x in xrange(2, 7, 2):
		for y in xrange(0, 8):
			drag(getNodePos(x, y), "left")
	time.sleep(sleeptime)

	for x in xrange(1, 6, 2):
		for y in xrange(0, 8):
			drag(getNodePos(x, y), "left")
	time.sleep(sleeptime)

def getpuzzle():
	screen = device.takeSnapshot()
	puzzle = []
	for y in xrange(0,7):
		line = []
		for x in xrange(0,7):
			line.append(screen.getRawPixelInt(getNodePos(x,y)[0], getNodePos(x,y)[1]))
		puzzle.append(line)
	return puzzle

# lazy one
def trainedmonkey():
	x = 0
	y = 0
	do = True
	pr = True
	puzzle = getpuzzle()

	while (x < 7):
		while (y < 7):
			################################
			#  if match patterns, drag up  #
			################################

			# o o 
			#     0
			if ((y > 0 and x > 1 and
					puzzle[y][x] == puzzle[y-1][x-1] and
					puzzle[y][x] == puzzle[y-1][x-2]) or
			# o   o
			#   0
				(y > 0 and x > 0 and x < 6 and
					puzzle[y][x] == puzzle[y-1][x-1] and
					puzzle[y][x] == puzzle[y-1][x+1]) or
			#   o o
			# 0
				(y > 0 and x < 5 and
					puzzle[y][x] == puzzle[y-1][x+1] and
					puzzle[y][x] == puzzle[y-1][x+2]) or
			# o
			# o
			#
			# 0
				(y > 2 and
					puzzle[y][x] == puzzle[y-2][x] and
					puzzle[y][x] == puzzle[y-3][x])):

				if pr: print x, y, "up"
				if do: drag(getNodePos(x, y), "up")
				return

			###################################
			#  if match patterns, drag right  #
			###################################

			#   o
			#   o 
			# 0
			if ((y > 1 and x < 6 and
					puzzle[y][x] == puzzle[y-1][x+1] and
					puzzle[y][x] == puzzle[y-2][x+1]) or
			#   o
			# 0
			#   o
				(y > 0 and y < 6 and x < 6 and
					puzzle[y][x] == puzzle[y-1][x+1] and
					puzzle[y][x] == puzzle[y+1][x+1]) or
			# 0
			#   o
			#   o
				(y < 5 and x < 6 and
					puzzle[y][x] == puzzle[y+1][x+1] and
					puzzle[y][x] == puzzle[y+2][x+1]) or
			# 0   o o
				(x < 4 and
					puzzle[y][x] == puzzle[y][x+2] and
					puzzle[y][x] == puzzle[y][x+3])):

				if pr: print x, y, "right"
				if do: drag(getNodePos(x, y), "right")
				return

			##################################
			#  if match patterns, drag down  #
			##################################

			# 0
			#   o o
			if ((y < 6 and x < 5 and
					puzzle[y][x] == puzzle[y+1][x+1] and
					puzzle[y][x] == puzzle[y+1][x+2]) or
			#   0
			# o   o
				(y < 6 and x > 0 and x < 6 and
					puzzle[y][x] == puzzle[y+1][x+1] and
					puzzle[y][x] == puzzle[y+1][x-1]) or
			#     0
			# o o
				(y < 6 and x > 1 and
					puzzle[y][x] == puzzle[y+1][x-1] and
					puzzle[y][x] == puzzle[y+1][x-2]) or
			# 0
			#
			# o
			# o
				(y < 4 and
					puzzle[y][x] == puzzle[y+2][x] and
					puzzle[y][x] == puzzle[y+3][x])):

				if pr: print x, y, "down"
				if do: drag(getNodePos(x, y), "down")
				return

			##################################
			#  if match patterns, drag left  #
			##################################

			#   0
			# o
			# o
			if ((y < 5 and x > 0 and
					puzzle[y][x] == puzzle[y+1][x-1] and
					puzzle[y][x] == puzzle[y+2][x-1]) or
			# o
			#   0
			# o
				(y > 0 and y < 6 and x > 0 and
					puzzle[y][x] == puzzle[y-1][x-1] and
					puzzle[y][x] == puzzle[y+1][x-1]) or
			# o
			# o
			#   0
				(y > 1 and x > 0 and
					puzzle[y][x] == puzzle[y-1][x-1] and
					puzzle[y][x] == puzzle[y-2][x-1]) or
			# o o   0
				(x > 2 and
					puzzle[y][x] == puzzle[y][x-2] and
					puzzle[y][x] == puzzle[y][x-3])):

				if pr: print x, y, "left"
				if do: drag(getNodePos(x, y), "left")
				return
		
			y = y + 1
		x = x + 1
		y = 0

def testdrag(x,y):
	drag(getNodePos(x, y), "up")
	time.sleep(0.5)
	drag(getNodePos(x, y), "right")
	time.sleep(0.5)
	drag(getNodePos(x, y), "down")
	time.sleep(0.5)
	drag(getNodePos(x, y), "left")
	time.sleep(0.5)

if __name__ == '__main__':
	while True:
		trainedmonkey()
		time.sleep(0.1)

代码最后记得多留一行空行,不然可能会出错,好像是jython的一个bug还是怎样,不太清楚

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值