1. 程式人生 > >天天愛消除刷分指令碼(終於打敗大毛了。。)

天天愛消除刷分指令碼(終於打敗大毛了。。)

轉自我的獨立部落格alanslab.cn,不打算續費域名了。懶人實在不該開什麼獨立部落格。。。csdn的都嫌折騰了。。。。。。。上帝賜我一個腦機介面吧,usb相容就行。。。


注:視訊中的效果是一開始做的暴力劃螢幕的作弊效果,這裡則是嘗試分析截圖有目的的去划動。截圖實在太慢,效果還不如暴力。我是懶得繼續了搞它了,有興趣玩的可以看下frame buffer的資料,一定程度應該能緩解截圖速度的限制。

文章比較早,程式碼已丟。但是所需的東西這裡都有,抄抄改改,幾十行就完事了。

更新:睡一覺起來改寫了演算法,之前那個寫的時候腦袋有點不太清醒。。。思路就是窮舉所有可以消除的模式,跟之前一樣,不過改寫完好像正確率高了很多,看來之前那個是寫太亂漏了什麼東西。

前幾天被人鄙視了。。今早就試試看寫個小指令碼刷下分數。

視訊裡的做法非常簡單,就用了android sdk tools 裡面的monkeyrunner這一個自動測試工具。

做法就是用monkeyrunner截圖後用gimp找到卡通角色對應的位置規律,然後程式碼模擬觸控,讓其不停上上下下左左右右。。。如視訊中所見,一整個螢幕的觸控操作幾乎同時完成,效果非常給力(google養的這隻monkey相當強悍)

中間出了一次小插曲。。我的最高分被清空了一次。。不知道是網路問題還是怎樣。。。所以之後就考慮怎麼分析影象來解決這問題。好在這遊戲還算寬鬆,沒拿什麼雪花閃電的擋螢幕,在每個角色的同一位置取色對比就可以了,網上沒找著什麼合適的演算法。。就自己動手暴力編了一個(下文附上),雖然效果差很多而且老是誤判(一定有bug。。。懶得找了),今天也算是學習之餘休息休息放個假。

第一個版本(程式碼裡沒用到的那個註釋了crazy monkey的函式,不過應該用不了了)效果不錯,分分鐘打敗大毛。 第二個版本(現在這個)誤判連連(已重寫,效果還不錯,偶爾的誤判是因為處理的影象不是實時的,可以調整暫停的時間做一點有限的優化),刷分效果不是太好,但是隱蔽。。。有機會找個霸氣點的演算法看看怎麼改進一下應該也不錯。但獲取螢幕截圖的速度是個硬傷,這個思路估計再努力也到不了第一版的效果,今早本來是想寫個打飛機的指令碼,也是因為這個問題作罷。

執行方式,先裝好andorid sdk,然後複製文後的程式碼到monkey.py。 接上手機,開啟開發者模式,開啟遊戲,同時點開始按鈕和執行下面的命令,玩完關閉的話。。抱歉。。Ctrl+c吧(win是Ctrl+d好像,不行就試試Ctrl+z。。。):

[email protected] ~/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還是怎樣,不太清楚

相關推薦

天天消除指令碼終於打敗

轉自我的獨立部落格alanslab.cn,不打算續費域名了。懶人實在不該開什麼獨立部落格。。。csdn的都嫌折騰了。。。。。。。上帝賜我一個腦機介面吧,usb相容就行。。。 注:視訊中的效果是一開始做的暴力劃螢幕的作弊效果,這裡則是嘗試分析截圖有目的的去划動。截圖實

open/read/write 終於寫的長一點

http://wiki.ubuntu.org.cn/index.php?title=%E9%A6%96%E9%A1%B5&variant=zh-cn 很有用的幫助查詢網站,中文化的,很方便,站在前人的肩膀上,容易很多,嘿嘿。 程式設計第一步就是裝編譯器。。linux一

程式設計師玩遊戲之三--天天消除非暴力指令碼

      評論:        此款遊戲成功在其好友排名上。好友的分數超過了你無疑會增加你的鬥志。       中級策略:七手八腳多人一起點。這相當於多個CPU處理一個大任務了,哈哈。       終極策略:自動化。機器總是比人快的多。你兩個人一秒充其量點4下,而機器的數

[NOIP2016 DAY1 T2]天天跑步-[差+線段樹合並][解題報告]

rip top 偏移 digi http n-1 sdi git += [NOIP2016 DAY1 T2]天天愛跑步 題面: B【NOIP2016 DAY1】天天愛跑步 時間限制 : - MS 空間限制 : 565536 KB 評測說明 : 2s D

洛谷P1600 天天跑步(差 LCA 桶)

題意 題目連結 Sol 一步一步的來考慮 \(25 \%\):直接\(O(nm)\)的暴力 鏈的情況:維護兩個差分陣列,分別表示從左向右和從右向左的貢獻, \(S_i = 1\):統計每個點的子樹內有多少起點即可 \(T_i = 1\):同樣還是差分的思想,由於每個點 能對其產生的點的深度是相同

python指令碼正方教務系統

#!/usr/bin/env python # coding=utf-8 __metaclass__=type import urllib2  import urllib import time import sys import re reload(sys) sys.setdefaultencoding

shell指令碼使用之awk按列求平均值含最,最小值

使用Linux命令的awk工具 delay_avg.sh指令碼內容如下所示: #!/bin/sh RESPONSEFILE=$1 if [ $# -ne 1 ] then         echo "usage: ./delay_avg.sh na

廣義圓方樹+樹鏈剖+setCodeforces Round #278 (Div. 1): E. Tourists

  前置:雙聯通分量、圓方樹、樹鏈剖分 什是是廣義圓方樹 圓方樹是針對於仙人掌建樹,而廣義圓方樹是針對無向圖建樹,對於一個無向圖 無向圖中的所有點 → 廣義圓方樹中的所有圓點  無向圖中的一個雙聯通分量 → 廣義圓方樹中的其中一個方點,這個方點向當

Java分散式中文片語件 - word轉自 https //github com/ysc/word

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

CDH安裝指令碼可用但不完善不適小白——來自我的QQ空間

#! /bin/bash 10.2.45.81    cdh1 10.2.45.82    cdh2 10.2.45.83    cdh3 echo -e "\033[32m =======close iptables ====== \03

shell命令執行hive指令碼hive互動,hive的shell程式設計

Hive執行方式 Hive的hql命令執行方式有三種: 1、CLI 方式直接執行 2、作為字串通過shell呼叫hive –e執行(-S開啟靜默,去掉”OK”,”Time taken”) 3、作

leetcode題記錄買賣股票的最佳時機系列問題

開始逐步拾起C++,故以後的刷題,全用python和C++兩種語言實現。 一、買賣股票的最佳時機 I 給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。 如果你最多隻允許完成一筆交易(即買入和賣出一支股票),設計一個演算法來計算你所能獲取的最大利潤。 注

php呼叫shell指令碼web端和客戶端同時實現

想這個問題有一段時間了,一開始想實現的功能是在web端點選一個按鈕,然後liunx主機採集影象,在瀏覽器上顯示。於是自然而然的想到了php呼叫shell指令碼。查了很多資料。實現了。 下面開始講解。本

工作流實現合流多人、多部門分工處理的介紹

分合流:顧名思義,想長江一樣,有主流河流和分支河流,有起點,有終點。 適用範圍:多人、多角色、多崗位、多部門等相互獨立審批工作、處理工作,同時又可在某個步驟中檢視工作的彙總、或者過程、或者處理結果等

django外掛-dj-pagination簡單設定實現甚至不用在view上寫paginate

1. 概述 django真的有好多簡單方便好用的輪子!!! 這次介紹的這個是用於分頁的,django中本身提供了實現分頁的物件,但是每次都要寫一堆業務程式碼,也是神煩。 在django-awesome專案中發現了這個輪子: 文件也很簡單,三四頁的

軟件工程第二次作業心態差點用崩的vs2017

工具 OS http cli ips -i cpp 問題 alt 一、開發工具的選擇 本來電腦上有eclipse,可是自己想用c++作為開發語言(想著自己也是學過c++的),就抱著試一試的心態下了visual studio 2017開發軟件。以下便是開發工具的下載安裝過程。

洛谷 P1824 進擊的奶牛 【二分答案】求最的最小值

函數 邊界 TP 大於 輸入格式 要求 初始 位置 style 題目鏈接:https://www.luogu.org/problemnew/show/P1824 題目描述 Farmer John建造了一個有N(2<=N<=100,000)個隔間的牛棚,這些隔間分

bzoj 3837 隨機過題法解一下

name mit rac problems ack content alt pre 大於等於 3837: [Pa2013]Filary Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 395 Solved: 74[Subm

Ants UVA - 1411竟然讓我換個板子

bool print uva sqrt ostream algorithm pre 一次 lac 題意:   給出n個白點和n個黑點的坐標,要求用n條不相交的線段把它們連接起來,其中每條線段恰好連接一個白點和一個黑點,每個點恰好連接到一條線段 解析:   帶入負的歐幾裏得距

AndroidStudio Unknown attribute在xml中沒有程式碼提示

問題 如上圖所示,編寫xml的時候提示:Unknown attribute in xml and Namespace not found 真的氣死人,升級到AndroidStudio3.2.1,sdk28以後問題成堆出現。 解決方案 下面是百度最多的兩個解決方案,然