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

這個(gè)游戲的核心很簡(jiǎn)單,就是要你不停的在線接客人,賺小魚干,買道具,然后就可以繼續(xù)賺更多的小魚干,再買更高級(jí)的道具。越到后面,東西貴的離譜。從我一個(gè)碼農(nóng)的角度來說,道具價(jià)值多少小魚干,完全是碼農(nóng)在后臺(tái)改一個(gè)數(shù)字的事。之所以階梯價(jià)把目標(biāo)定的越來越高,就是為了pua玩家,這大概是現(xiàn)在所有游戲的套路吧。一直在玩,就會(huì)沉浸進(jìn)去,局外人感覺很無聊,你自己要是有幾天不玩也就會(huì)覺得沒啥意思了。
為了搞清楚這個(gè)游戲怎么玩的,我也成功入坑,成為不折不扣的小魚干打工奴。看上面的圖,可以看到有一個(gè)手機(jī)宣傳的按鈕。這個(gè)按鈕你只要一直點(diǎn)著,不管是單擊還是長(zhǎng)按,恭喜你,幸福的源泉開始了。會(huì)有源源不斷的客人來你餐廳吃飯消費(fèi),給你小魚干,說白點(diǎn),就是刷錢。這么蠢的動(dòng)作,居然需要耗費(fèi)一個(gè)人來不停操作,太奢侈了。碼農(nóng)二話不說,不能忍,我得寫個(gè)外掛解放沉迷賺小魚干的媳婦。
廢話不多說,直奔今天的主題。游戲在微信小程序里面,運(yùn)行在手機(jī)端。python+adb控制方案再合適不過了。從網(wǎng)上下載好adb,配好環(huán)境變量,在cmd窗口輸入adb version 查看版本號(hào),建議安裝最新版的adb,舊版本的會(huì)有一些問題。如果能夠正確的看到版本號(hào),就是安裝好了。
連接手機(jī)。手機(jī)打開開發(fā)者選項(xiàng),開啟usb調(diào)試。命令行輸入adb devices,如果可以看到設(shè)備節(jié)點(diǎn),就是連接成功了。接下來就可以輸入adb命令來控制手機(jī)了。
先小試牛刀,點(diǎn)擊事件:
adb shell input tap 960 2100可以看到屏幕上坐標(biāo)是(960,2100)的區(qū)域點(diǎn)擊了一下。(開發(fā)者模式選項(xiàng)卡中,開啟顯示點(diǎn)擊事件和指針坐標(biāo)顯示)長(zhǎng)按事件:adb?shell?input?swipe??960?2100?960?2100?10000在屏幕上(960,2100)的位置長(zhǎng)按10s
接下來的任務(wù)就是優(yōu)化了,根據(jù)屏幕分辨率識(shí)別不同的手機(jī),按比例點(diǎn)擊相應(yīng)的坐標(biāo),再在腳本里實(shí)現(xiàn)完整的自動(dòng)控制。
實(shí)現(xiàn)長(zhǎng)按手機(jī)宣傳還不夠,仙女還有更高的要求。要能夠自動(dòng)收花。怎么個(gè)收花法?就是下面視頻這樣。
收花的位置是固定的,可以使用坐標(biāo)來解決。播種的位置和收花的位置接近,固定坐標(biāo)也可以解決。確認(rèn)播種的操作用坐標(biāo)也行,但如果花還沒成熟,點(diǎn)擊那個(gè)坐標(biāo)就會(huì)進(jìn)入許愿池看廣告,很可能就點(diǎn)出游戲了,所以這里圖像識(shí)別安排上了。詳細(xì)代碼如下:
import osimport sysfrom time import sleepimport reimport cv2 as cvimport numpy as npfrom datetime import datetimedef get_screen_size():????#'獲取手機(jī)屏幕大小'size_str = os.popen('adb shell wm size').read()if not size_str:print('請(qǐng)安裝 ADB 及驅(qū)動(dòng)并配置環(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的系數(shù)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__":#第一步,讀取分辨率,識(shí)別手機(jī)screen_size = get_screen_size()phone = ''print(screen_size)if '2400' in screen_size:print('這是狗順的手機(jī)')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('這是小仙女的手機(jī)')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('開始時(shí)間為{}'.format(capture_time))while True:current_time = datetime.now()duration1 = current_time-capture_timeduration2 = current_time-screen_timeduration3 = current_time-flower_time#先點(diǎn)一下空白的地方,去掉對(duì)話框頁面os.system(blank)sleep(0.1)# 持續(xù)點(diǎn)擊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('點(diǎn)亮屏幕')screen_time = datetime.now()#優(yōu)先進(jìn)行圖像識(shí)別,如果有播種文字點(diǎn)擊播種文字,沒有播種文字點(diǎn)擊播種圖片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秒截圖一次并保存在電腦上。每個(gè)30s點(diǎn)亮一次屏幕防止鎖屏,每次長(zhǎng)按手機(jī)宣傳按鈕10s,點(diǎn)擊宣傳之前先點(diǎn)擊一下空白的地方,防止有對(duì)話框冒出來。每隔10分鐘去收一次花,再播種一次。(花的成熟周期要大于10分鐘)。為了防止誤點(diǎn)擊,播種采用了圖像識(shí)別里的圖像匹配方法,識(shí)別到播種文字再點(diǎn)擊。
一頓操作之后,成功實(shí)現(xiàn)了自動(dòng)收花和自動(dòng)點(diǎn)手機(jī)宣傳功能。嗯,學(xué)會(huì)寫代碼,可以有利于家庭和諧,社會(huì)穩(wěn)定。
當(dāng)然,需要改進(jìn)優(yōu)化和添加的功能還有很多。比如不要總是點(diǎn)擊一個(gè)位置,每次間隔的時(shí)間不要是固定的,做一些其他的點(diǎn)擊滑動(dòng)操作,跑個(gè)一個(gè)小時(shí)消停會(huì)兒等等。游戲是有一定的檢測(cè)外掛功能的,還有有一些機(jī)制設(shè)定,比如時(shí)不時(shí)冒出對(duì)話框啦等操作。

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