Re: [心得] FB復仇者聯盟 自製開飛機程式分享
※ 引述《mashfigaro (得志)》之銘言:
: 這遊戲銀幣初期還好 等到你一票英雄都LV8 LV9的時候 就真的很不夠用了
: (LV8->LV9 50000 LV9->LV10 100000 LV10->11 200000)
: 尤其是像我這種博愛型的 等級才5X 目前手上人物有15個...每個都卡
: 於是乎友人A跟我合力用Sikuli寫了一個很占RAM空間 有點複雜
其實應該不是友人 A
應該是友人 B or I 才對,畢竟會電腦的應該是蝙蝠俠或是鋼鐵人而不是美國隊長 XDDD
: 勉強還堪用的搭飛機程式
: Sikuli的官方網頁: http://sikuli.org/ (首頁可直接下載程式 有繁中版)
sikuli 的語法其實就很像 python 的 script language
是用 java 寫的,所以也支援 Mac
: 簡單地說就是一個 會抓桌面上的圖案 match到就會幫你執行指令 的程式
: 下載 安裝 執行之後
: 請解壓縮後開啟我跟朋友寫好的語法
: 網址: http://www.badongo.com/file/26983820
: (大家可以自己調整 我們的語法僅供參考 下面有詳細說明)
: 然後把裡面的一些參數 跟圖片改成自己電腦的版本
: 下面的說明落落長................................
: 使用的時候 瀏覽器要一直開著 所以要在離開電腦的時候用
: 開始執行 請按下"執行"(類似PLAY 的向右箭頭)
: 要關程式的話請按 ALT+SHIFT+C
: 請注意: 遊戲畫面請調整到 "瀏覽器上下捲軸的頂端 又可以一覽遊戲內容"的大小
: 像我的畫面:http://tinyurl.com/7y8rr5r
: 這個大小才能讓Sikuli好找圖
這部份主要是因為某些情況會需要重整網頁,所以
: 請注意: 第一次使用請先把語法裡面的圖片都重新抓一次 不然一定不能用
: 請注意: 因為要自己改語法 可能偶爾需要一點電腦的知識
: 太深入我也不大會 我也是自己上網查語法慢慢寫出來的
: 請不要問我太深入的問題
普通深入的可以問我 XD
其實因為 sikuli 是圖片比對的程式,所以不管你要用 IE/Firefox/Chrome 都可以
我自己是用 Safari 跑的,不過每個瀏覽器所呈現的畫面都不太一樣
: 接下來是語法的詳細說明
: (紅色字體是我的說明 不要跟著打進去 XD
: 文字說明不懂的部分 對照一下我原本的圖片找找看 )
: # Constants
設定一些常用到要改的數字,放在最前面改比較方便
: WAIT_SEC = 1.5 (需要等待時候的等待時間 單位是秒 電腦慢的人可以設定大一點)
: ABLE_PPL = 15 (可以飛行的英雄數量 記得扣除那些再訓練的 關卡中派遣出去的人)
: ABLE_FLY = 7 (你的飛機數量)
: ABLE_FULL = ABLE_PPL - ABLE_FLY
: ABLE_PAGE = ABLE_PPL/5 + 1 這兩行不用改
ABLE_FULL 是可以允許最多幾個人 exp 滿而不派遣飛機
ABLE_PAGE 是我總共有幾面英雄人物可以選擇
其實 ABLE_PAGE 應該改成 ABLE_PAGE = (ABLE_PPL-1)/5 + 1
不過這個其實影響不大
: 下面會有點複雜 是派出英雄的模式 共有0 1 2三種模式
: 0: 點下send hero之後 畫面偵測到有人可以派 就直接派出 不管經驗值有沒有滿
如果你不 care 經驗值未滿的英雄就用這個,這也是第一開始寫的版本
: 1: 點下send hero之後 由畫面左向右搜尋 優先派出經驗值未滿的英雄
我個人是習慣用這個慢慢找
: 2: 點下send hero之後 由畫面右向左搜尋 優先派出經驗值未滿的英雄
如果你跟 mash大 一樣希望可以讓小朋友優先長大那就先用這個...
他是覺得從後面來比較快
: 其中模式1 跟 2 游標會先移動到畫面下方的 confirm按鈕上
: 以免因為跳出的經驗值圖片檔到select按鈕圖片造成當機
: 經驗值的部分 因為圖片辨識的關係 還是常常派出經驗值滿的人出去
這部份實際上還好,圖片辨識調整比例到 0.8~0.9 就可以了
只是滿的人太多了....我目前除了剛升級完成的 DD 之外其他都是滿的
: 我自己通常是用2
: def select_hero(num):
: reverse = 0
: full_count = 0
: elif num == 1:
: force_fly = False
: while 1:
: hover(exists())
: 這邊請插入還沒點select 下面灰色的confirm按鈕圖片
: 之前沒加這個指令的時候 常在切換畫面後
: 游標因為停在英雄身上 跳出的經驗值視窗遮住了 select 所以當機
: if not exists(): 這邊請插入select按鈕圖片
: return
: selects = findAll() 一樣插入select按鈕圖片
: sorted_selects = sorted(selects, key=lambda m:m.x) 由左往右
: for item in sorted_selects:
: hover(item)
: wait(WAIT_SEC) 因為我電腦慢 所以這邊我設了一個等待時間
: if exists(): 將游標移動到不能派遣的角色
: reverse = 1 然後抓"XXX is busy" 的 "is busy"圖片
: break
這個主要是發現這頁已經有人 busy 之後,就不應該往右翻頁,而是往左翻頁
: elif not exists(): 將游標移動到經驗值已滿的角色上 然後抓
: click(item) 藍色框框的最末端 經驗值快滿的那邊
: 相似度我調到0.9
: click(exists()) 綠色的confirm按鈕圖片
這個 confirm 抓灰色或綠色都可以,都會當作一樣的東西
: wait(WAIT_SEC) 一樣 我電腦慢 所以有等待時間
: if not exists(): 綠色的confirm按鈕圖片
: return
: else:
: full_count += 1
: if full_count > ABLE_FULL:
如果 exp 滿的人超過容忍上限,那就還是派他出去
: click(item)
: click(exists()) 綠色的confirm按鈕圖片
: if not exists(): 綠色的confirm按鈕圖片
: return
: if reverse == 0:
: click(exists())
: 插入選英雄時 畫面最右方的箭頭
: 注意1.箭頭在圖片的中心 不然點不到 (其實可調點擊處就是了)
: 2.包含上方的X 不然很常誤判XD
如果 reverse 是 0,就向右翻頁,反之,向左
: else:
: click(exists())
: 選英雄的第二面時 畫面最左方的箭頭
: 注意1.箭頭在圖片的中心 不然點不到 (其實可調點擊處就是了)
: 2.包含上方的REMOTE字樣一點點 不然很常誤判XD
: wait(WAIT_SEC) 老樣子 我電腦慢 XD
: elif num == 2:
: force_fly = False
: while 1:
: hover(exists()) 灰色的confirm按鈕圖片
: if not exists(): select按鈕圖片
: return
: selects = findAll() select按鈕圖片
: sorted_selects = sorted(selects, key=lambda m:-m.x) 由右往左
主要這是 num == 2 跟 num == 1 的最大差異
: 接下來 是重新整理的部分 主要對應IE9來寫的
: 如果用其他瀏覽器的人可以自己改寫相對應的
: def refresh(e):
: wait(1800) 等30分鐘
: 程式在家裡會跳出"遊戲需要重整"的關鍵圖片之後 等30分鐘後就會自己重整
: 設定30分鐘是因為萬一程式在家裡賺錢 人在公司手癢了可以偷偷玩一下
: 或是算算英雄訓練時間到了 可以換個英雄去訓練 XD
: rightClick(exists())
: click(exists())
: 這邊我是設定滑鼠移到遊戲畫面左上 gift 左邊 的Avengers 圖樣左邊
: 讓程式點滑鼠右鍵 點選空白的地方
: 然後點下"重新整理"
: 不過這裡的圖 非。常。難。抓!!
在 Mac 上很好抓....
Windows 就真的很難
不過其實有一個解法....
因為 Sikuli 可以自己先存好圖片再插入
所以可以先用 print screen 裁好重新整理的字樣。
本來想使用 key.F5 重新整理,不過效果不彰所以我們後來採用這種方法
: 點"螢幕截圖"之後要馬上移動到那個地方點右鍵 才會抓得到"重新整理"四個字
: 我有試過"type(KEY.F5)" 這個指令 這個指令似乎不是百分百執行
: (當然也可能是我電腦遜 XD)
: 要加上type(KEY.F5)指令的話 就直接把上面兩行指令(rightclick click)
: 改成type(KEY.F5)就好了
:
: wait(WAIT_SEC) 一樣 因為我電腦很慢XD
等待是一種美德....(逃)
: click(exists()) IE9重整之後 下面會出現的提示 我嫌他礙眼 所以會點掉
歡迎使用 Chrome 或 Safari
: wait(60)
: 以下是主要程式部分
: # main program
: def main():
: #if 1:
: while 1:
設計的原理很簡單,用無窮迴圈去跑,看見什麼就點一些對應的選項
: switchApp("")
: 切換到XX瀏覽器 "只能用該瀏覽器在你電腦裡的正式名稱"
: 像 Chrome 我跟我朋友就的電腦分別是 Google Chrome 跟Chrome兩種
在 Windows 裡面要寫 Google Chrome
在 Mac 裡面寫 Chrome 就可以了
: 在不同電腦裡 同樣瀏覽器名字可能會不一樣
: 在Vista裡面 要看瀏覽器在你電腦裡的正式名稱
: 請將滑鼠移到工作列上的瀏覽器 靜置一秒就會看到跳出來的字
: 以我來說
: "Marvel XXXXXXXXXX 在 Facebook上 - Windows Internet Explorer"
: ^^^^^^^^^^^^^^^^^^^^^^^^^
: 這邊就是瀏覽器正確名稱
: wait(WAIT_SEC) 等一下
: # click(exists("fB.png"))
: # wait(WAIT_SEC)
: # click(exists("HJ.png"))
: 這三行被我省略了
: 眼尖的強者應該早就發現了 只要在那一行的最前面加上"#'
: Sikuli就會忽略那一行的字
: click(exists())
: 這張圖是前一陣子遊戲一開始都會有一個magic 什麼的遊戲廣告跳出來
: 害我程式一直當機 所以我加上的 重點是要點那個X 跳出廣告
: # if need reload, press F5 to refresh
這行註解(用 # 前置的)是我多寫的.... mash 忘了拿掉
: if exists(): My Gifts字樣圖片
: click(exists()) 遊戲上方play 按鈕圖片
: # if need to close windows
: wait(WAIT_SEC)
: 有時候會跳到禮物頁面 所以我設定如果出現"My Gifts"的圖 就去點 上面的"play"
好像是重整之後如果你還有沒收完的禮物就會去 "My Gifts"
: if exists(): Accepted字樣圖片
: click(exists()) play按鈕圖片
: 怕偶爾會沒出現"My Gifts"的圖 所以我做了一個"Accepted"以防萬一
: # if need to close windows
: wait(WAIT_SEC)
: if exists("NELCOIVIE.png"): Welcome Back字樣的圖片
: click(exists("T.png")) Welcome Back視窗右上角的X
: wait(WAIT_SEC)
: 點了Play之後 都會出現 Welcome Back 的視窗 當然要關掉
: # if need to close windows
: if exists("LLIES.png"): Add Allies的字樣
: click(exists("Y-1.png")) 視窗右上角的X
: wait(WAIT_SEC)
: 遊戲閒置一段時間之後 會出現要你加好友的視窗 當然也要關掉
: # if found plane, send to fly
: if exists(): 飛機圖案
: click(getLastMatch())
: wait(WAIT_SEC)
: click(getLastMatch())
: wait(WAIT_SEC)
: 如果出現飛機圖案 就點他 因為我電腦慢 有時會點不到
: 所以我設定程式點兩下(中間間隔1.5秒)
: 然後飛機圖案要抓兩種 一種是游標移動到上面變成綠色底的 一種是一般的
: 不管那種都要注意 停機坪的部分不能擷取太多 然後不要擷取到飛機等級字樣
: 如果有不同等級的飛機 每種等級都要抓圖
綠色底可以不用抓,
會需要抓是因為 mash 的電腦不知道是太慢還是網路不穩,結果七台飛機同時是綠色底的
我自己是不會出現這種狀況 :Q
: if exists():
: click(getLastMatch())
: wait(WAIT_SEC)
: click(getLastMatch())
: wait(WAIT_SEC)
: 同上 這是一般的飛機
: if exists(): 點飛機之後 出現的send hero按鈕圖片
: click(getLastMatch())
: wait(WAIT_SEC)
: 如果出現send hero按鈕 就點 XD
: if exists(): 20分鐘任務圖片
: click(getLastMatch())
: wait(WAIT_SEC)
: elif exists(): 10分鐘任務圖片
: click(getLastMatch())
: wait(WAIT_SEC)
這部份是因為有時候選圖的時後任務的敘述框會擋住圖,所以設定 20 or 10 分鐘兩種
不過要記得調整一下精確度,大概 0.8~0.85 不錯
: 上面兩張圖是 出的任務種類
: 飛機少 英雄少 電腦快的人用時間短的就好
: 飛機多 英雄多 電腦慢的人用時間長一點的
: 自己計算投資報酬率來決定
: 像我飛機7台 電腦慢 每次sikuli幫我派人出去大概是2.5min一個英雄
: 2.5 X 7 = 17.5min 所以選擇20min
: 我朋友的電腦 每次配人出去不用1分鐘 1 X 7 = 7 min 所以選擇10min
: # if need to select hero
: if exists(): SELECT按鈕圖案
: select_hero(2)
: wait(WAIT_SEC)
: 如果出現了派選英雄的畫面 就進入前面的模式 0/1/2 我是選2
: if exists(): 如果有人經驗滿了 會出現training required的視窗
: click(getLastMatch()) 要截取的是"continue"按鈕圖片
: wait(WAIT_SEC)
: 如果要派出的英雄驗滿了 會出現這個視窗 當然是讓他出去 所以要按continue
: # if need to collect money
: if exists(): 任務完成後 銀幣上面的 done字樣
: click(exists()) 銀幣圖片
: wait(WAIT_SEC)
: if exists(): collect all 按鈕圖片
: click(getLastMatch())
: wait(WAIT_SEC)
: elif exists(): collect 按鈕圖片
: click(getLastMatch())
: wait(WAIT_SEC)
: 如果出現了done 當然要點銀幣收錢
: 記得抓圖不要抓超出輪廓 (包含到周圍的圖案) 不然比對不到
: 而且done跟銀幣抓完之後 還要調整相似度 精密一點 (我是調到0.8)
: 不然sikuli會跑去按飛行空母的引擎(攤手)
我後來是改成抓錢幣,而不抓 done 的字樣
: # observe the refresh requirement 這邊是要程式每隔一段時間觀察是否有需要重整
: Settings.ObserveScanRate = 0.2 觀察頻率
觀察頻率這個值代表 1 秒內做幾次
0.2 代表 1 秒內做 0.2 次所以 5 秒才會看一次
可以改成 0.1 or 你喜歡的,不建議改 1 以上的值
: onAppear("1335034007396.png", refresh) 萬一出現Data Post Error 就重整
: onAppear("GameError.png", refresh) 萬一出現Game Error就重整
: onAppear("1334811629088.png", refresh) 遊戲畫面過期 出現有A字樣的視窗就重整
: onAppear("SHELDAlert.png", refresh) ShieldAlert 遊戲出現問題就重整
: observe(FOREVER, background = True) 永遠在背景觀察
: main()
: 這邊是漸漸被增加的 一開始只有A字字樣視窗的圖片
: 有一陣子一直在維修 所以多了Shield Alert語法
: 有一陣子一直當機 所以多了Data Post Error 跟 Game Error
: ..........依此類推
: 之後遇到請各位同好再自行增加
:
: 我想應該不會有人看到這麼後面 XD
: 電腦我是半調子(畢竟是英文系畢業而已 程式懂的連皮毛都不到 只是愛查資料)
不過你為了這遊戲很厲害把這些都搞懂了 XDDDD 我還是很讚嘆
: 語法很多毛病 如果有更好的語法歡迎互相建議指教
: 指責跟罵人就免了
: 如果有違反什麼東西的話請版主幫我刪掉這篇文章
: 希望板上的各位財源滾滾 各位探員武運昌隆 XD
武運昌隆~
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.24.46.241
推
05/05 17:35, , 1F
05/05 17:35, 1F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):
SuperHeroes 近期熱門文章
PTT動漫區 即時熱門文章