玩游戲你還在自己動手玩?
前陣子,媳婦迷上了動物餐廳這款小游戲。卡哇伊萌萌的畫風,簡單無腦的操作,看廣告就可以變強的設定,能整理出excel滿滿一sheet的攻略,無限制打發(fā)無聊的時間,讓雙手再也停不下來。這些近乎完美的優(yōu)點,完美地契合著甲方爸爸的需求。先讓大家看看畫風是怎樣的。(此處真不是安利這款小游戲,當然要是愿意給我打廣告費我也不介意)

這個游戲的核心很簡單,就是要你不停的在線接客人,賺小魚干,買道具,然后就可以繼續(xù)賺更多的小魚干,再買更高級的道具。越到后面,東西貴的離譜。從我一個碼農的角度來說,道具價值多少小魚干,完全是碼農在后臺改一個數字的事。之所以階梯價把目標定的越來越高,就是為了pua玩家,這大概是現在所有游戲的套路吧。一直在玩,就會沉浸進去,局外人感覺很無聊,你自己要是有幾天不玩也就會覺得沒啥意思了。
為了搞清楚這個游戲怎么玩的,我也成功入坑,成為不折不扣的小魚干打工奴。看上面的圖,可以看到有一個手機宣傳的按鈕。這個按鈕你只要一直點著,不管是單擊還是長按,恭喜你,幸福的源泉開始了。會有源源不斷的客人來你餐廳吃飯消費,給你小魚干,說白點,就是刷錢。這么蠢的動作,居然需要耗費一個人來不停操作,太奢侈了。碼農二話不說,不能忍,我得寫個外掛解放沉迷賺小魚干的媳婦。
廢話不多說,直奔今天的主題。游戲在微信小程序里面,運行在手機端。python+adb控制方案再合適不過了。從網上下載好adb,配好環(huán)境變量,在cmd窗口輸入adb version 查看版本號,建議安裝最新版的adb,舊版本的會有一些問題。如果能夠正確的看到版本號,就是安裝好了。
連接手機。手機打開開發(fā)者選項,開啟usb調試。命令行輸入adb devices,如果可以看到設備節(jié)點,就是連接成功了。接下來就可以輸入adb命令來控制手機了。
先小試牛刀,點擊事件:
adb shell input tap 960 2100可以看到屏幕上坐標是(960,2100)的區(qū)域點擊了一下。(開發(fā)者模式選項卡中,開啟顯示點擊事件和指針坐標顯示)長按事件:adb?shell?input?swipe??960?2100?960?2100?10000在屏幕上(960,2100)的位置長按10s
接下來的任務就是優(yōu)化了,根據屏幕分辨率識別不同的手機,按比例點擊相應的坐標,再在腳本里實現完整的自動控制。
實現長按手機宣傳還不夠,仙女還有更高的要求。要能夠自動收花。怎么個收花法?就是下面視頻這樣。
收花的位置是固定的,可以使用坐標來解決。播種的位置和收花的位置接近,固定坐標也可以解決。確認播種的操作用坐標也行,但如果花還沒成熟,點擊那個坐標就會進入許愿池看廣告,很可能就點出游戲了,所以這里圖像識別安排上了。詳細代碼如下:
import osimport sysfrom time import sleepimport reimport cv2 as cvimport numpy as npfrom datetime import datetimedef get_screen_size():????#'獲取手機屏幕大小'size_str = os.popen('adb shell wm size').read()if not size_str:print('請安裝 ADB 及驅動并配置環(huán)境變量')sys.exit()m = re.search(r'(\d+)x(\d+)', size_str)if m:return "{height}x{width}".format(height=m.group(2), width=m.group(1))return "1920x1080"def get_location_bz():img_rgb = cv.imread('test.jpg')img_gray = cv.cvtColor(img_rgb, cv.COLOR_BGR2GRAY)template = cv.imread('template/bozhong.jpg',0)w, h = template.shape[::-1]res = cv.matchTemplate(img_gray,template,cv.TM_CCOEFF_NORMED) #-?到1的系數threshold = 0.85x = 0y = 0loc = np.where(res >= threshold)for pt in zip(*loc[::-1]):x, y = pt[0] + w / 2, pt[1] + h / 2return x,ydef flower_auto(signal,name):os.system(signal)print('收了一朵{}'.format(name))sleep(2)os.system('adb exec-out screencap -p > test.jpg')sleep(1)x, y = get_location_bz()print(x, y)if x:os.system('adb shell input tap {0} {1}'.format(x, y))print('成功播種')sleep(0.5)if __name__ == "__main__":#第一步,讀取分辨率,識別手機screen_size = get_screen_size()phone = ''print(screen_size)if '2400' in screen_size:print('這是狗順的手機')phone = 'gs'fish = 'adb shell input swipe 960 2200 960 2200 10000'blank = 'adb shell input tap 500 500'flower1 = 'adb shell input tap 273 1015'flower2 = 'adb shell input tap 829 1075'flower3 = 'adb shell input tap 292 1375'flower4 = 'adb shell input tap 800 1370'else:print('這是小仙女的手機')phone = 'xxn'fish = 'adb shell input swipe 960 2100 960 2100 10000'blank = 'adb shell input tap 500 500'flower1 = 'adb shell input tap 273 950'flower2 = 'adb shell input tap 800 950'flower3 = 'adb shell input tap 292 1283'flower4 = 'adb shell input tap 800 1278'capture_time = datetime.now()screen_time = datetime.now()flower_time = datetime.now()print('開始時間為{}'.format(capture_time))while True:current_time = datetime.now()duration1 = current_time-capture_timeduration2 = current_time-screen_timeduration3 = current_time-flower_time#先點一下空白的地方,去掉對話框頁面os.system(blank)sleep(0.1)# 持續(xù)點擊10sos.system(fish)# 截屏保存到桌面并保存,10s更新一次圖片if duration1.seconds >= 10:os.system('adb exec-out screencap -p > test.jpg')print('截圖成功')capture_time = datetime.now()# 30s發(fā)送一次亮屏指令if duration2.seconds >= 30:os.system('adb shell input keyevent 224')print('點亮屏幕')screen_time = datetime.now()#優(yōu)先進行圖像識別,如果有播種文字點擊播種文字,沒有播種文字點擊播種圖片if duration3.seconds >= 360:# 第一遍摘花flower_auto(flower1,'小雛菊')flower_auto(flower2,'向日葵')flower_auto(flower3,'小紅梅')flower_auto(flower4,'紫羅蘭')# 第二遍播種flower_auto(flower1, '小雛菊')flower_auto(flower2, '向日葵')flower_auto(flower3, '小紅梅')????????????flower_auto(flower4,?'紫羅蘭')flower_time = datetime.now()
程序思路:每隔10秒截圖一次并保存在電腦上。每個30s點亮一次屏幕防止鎖屏,每次長按手機宣傳按鈕10s,點擊宣傳之前先點擊一下空白的地方,防止有對話框冒出來。每隔10分鐘去收一次花,再播種一次。(花的成熟周期要大于10分鐘)。為了防止誤點擊,播種采用了圖像識別里的圖像匹配方法,識別到播種文字再點擊。
一頓操作之后,成功實現了自動收花和自動點手機宣傳功能。嗯,學會寫代碼,可以有利于家庭和諧,社會穩(wěn)定。
當然,需要改進優(yōu)化和添加的功能還有很多。比如不要總是點擊一個位置,每次間隔的時間不要是固定的,做一些其他的點擊滑動操作,跑個一個小時消停會兒等等。游戲是有一定的檢測外掛功能的,還有有一些機制設定,比如時不時冒出對話框啦等操作。

玩游戲啦,放松一下還是可以的,不可太急功近利,追求太多身外之物的小魚干。寫個小外掛也只是為了試試代碼好不好使。在我完成第一版本功能之后,出于對自己有要求,不能玩游戲玩不停考慮,仙女已經刪掉了這個游戲,(可能是意識到這個游戲的無聊了)轉戰(zhàn)刷淘寶。莫非,豈不是甲方爸爸的下個需求是搞個淘寶自動搶購商品的程序?不覺瑟瑟發(fā)抖。還好仙女不懂代碼,不然我操作代碼的時候,可能會在旁邊說,“呦,寫bug呢”!
下期再會。
