作者mashfigaro (得志)
看板SuperHeroes
標題[心得] FB復仇者聯盟 自製開飛機程式分享
時間Sat May 5 04:56:30 2012
這遊戲銀幣初期還好 等到你一票英雄都LV8 LV9的時候 就真的很不夠用了
(LV8->LV9 50000 LV9->LV10 100000 LV10->11 200000)
尤其是像我這種博愛型的 等級才5X 目前手上人物有15個...每個都卡
於是乎友人A跟我合力用Sikuli寫了一個很占RAM空間 有點複雜
勉強還堪用的搭飛機程式
Sikuli的官方網頁:
http://sikuli.org/ (首頁可直接下載程式 有繁中版)
簡單地說就是一個 會抓桌面上的圖案 match到就會幫你執行指令 的程式
下載 安裝 執行之後
請解壓縮後開啟我跟朋友寫好的語法
網址:
http://www.badongo.com/file/26983820
(大家可以自己調整 我們的語法僅供參考 下面有詳細說明)
然後把裡面的一些參數 跟圖片改成自己電腦的版本
下面的說明落落長................................
使用的時候 瀏覽器要一直開著 所以要在離開電腦的時候用
開始執行 請按下"執行"(類似PLAY 的向右箭頭)
要關程式的話請按 ALT+SHIFT+C
請注意: 遊戲畫面請調整到 "瀏覽器上下捲軸的頂端 又可以一覽遊戲內容"的大小
像我的畫面:
http://tinyurl.com/7y8rr5r
這個大小才能讓Sikuli好找圖
請注意: 第一次使用請先把語法裡面的圖片都重新抓一次 不然一定不能用
請注意: 因為要自己改語法 可能偶爾需要一點電腦的知識
太深入我也不大會 我也是自己上網查語法慢慢寫出來的
請不要問我太深入的問題
請注意: 我的電腦作業系統是Vista 瀏覽器用IE9
所以如果是用Win7 或是其他作業系統的人
發現有的地方不大一樣 請不要大驚小怪
也不要問我 畢竟作業系統不一樣 我沒辦法幫你
請自行找(或是問其他強者)能有一樣結果的方法
努力讓自己的程式變得更好 更會賺錢吧
sikuli程式中:
抓圖的方式: 1.先把遊戲開好之後
2.切換到Sikuli的畫面
3.用鍵盤將游標移動到需要抓圖的指令括號內
4.用滑鼠按下左上的"螢幕截圖"
5.稍等一秒鐘 螢幕會變暗
6.操縱滑鼠 按下滑鼠左鍵不動 拉出想抓的範圍
7.放開滑鼠左鍵 就抓好了
如果想要複製某圖到另一個指令括號內
1.請用鍵盤將游標移到該圖右側
2.請按SHIFT+左鍵
3.請按大家都很熟悉的CTRL+C 複製
4.然後游標移到想貼上的地方 CTRL+V 貼上
需要調整比對圖片的精準程度時:
1.點擊已經抓好的圖片 會跳出圖片樣式設定的視窗
2.選到圖片比對預覽的標籤 左右調整相似度 越往右邊越精準
(太精準反而會match不到)
3.按確認
需要調整圖片中滑鼠點擊的地方:
1.點擊已經抓好的圖片 會跳出圖片樣式設定的視窗
2.選目標位置偏移的標籤 按圖片調整要點擊的中心(紅點)
3.按確認
接下來是語法的詳細說明
(紅色字體是我的說明 不要跟著打進去 XD
文字說明不懂的部分 對照一下我原本的圖片找找看 )
# Constants
WAIT_SEC = 1.5
(需要等待時候的等待時間 單位是秒 電腦慢的人可以設定大一點)
ABLE_PPL = 15
(可以飛行的英雄數量 記得扣除那些再訓練的 關卡中派遣出去的人)
ABLE_FLY = 7
(你的飛機數量)
ABLE_FULL = ABLE_PPL - ABLE_FLY
ABLE_PAGE = ABLE_PPL/5 + 1
這兩行不用改
下面會有點複雜 是派出英雄的模式 共有0 1 2三種模式
0: 點下send hero之後 畫面偵測到有人可以派 就直接派出 不管經驗值有沒有滿
1: 點下send hero之後 由畫面左向右搜尋 優先派出經驗值未滿的英雄
2: 點下send hero之後 由畫面右向左搜尋 優先派出經驗值未滿的英雄
其中模式1 跟 2 游標會先移動到畫面下方的 confirm按鈕上
以免因為跳出的經驗值圖片檔到select按鈕圖片造成當機
經驗值的部分 因為圖片辨識的關係 還是常常派出經驗值滿的人出去
我自己通常是用2
def select_hero(num):
reverse = 0
full_count = 0
if num == 0:
click(exists())
這邊請插入選擇派出英雄時 下面的"SELECT"按鈕圖片
click(exists())
這邊請插入點了 select之後 下面的綠色"confirm"按鈕圖片
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
elif not exists():
將游標移動到經驗值已滿的角色上 然後抓
click(item)
藍色框框的最末端 經驗值快滿的那邊
相似度我調到0.9
click(exists())
綠色的confirm按鈕圖片
wait(WAIT_SEC)
一樣 我電腦慢 所以有等待時間
if not exists():
綠色的confirm按鈕圖片
return
else:
full_count += 1
if full_count > ABLE_FULL:
click(item)
click(exists())
綠色的confirm按鈕圖片
if not exists():
綠色的confirm按鈕圖片
return
if reverse == 0:
click(exists())
插入選英雄時 畫面最右方的箭頭
注意1.箭頭在圖片的中心 不然點不到 (其實可調點擊處就是了)
2.包含上方的X 不然很常誤判XD
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)
由右往左
for item in sorted_selects:
hover(item)
wait(WAIT_SEC)
我電腦慢 XD
if exists():
"某英雄 is busy" 的 "is busy"圖片
reverse = 1
# break
elif not exists()):
一樣 經驗值的圖片 複製前面的就好
click(item)
click(exists())
綠色的confirm按鈕圖片
wait(WAIT_SEC)
同前面 XD
if not exists():
綠色的confirm按鈕圖片
return
else:
full_count += 1
if full_count > ABLE_FULL:
click(item)
click(exists())
綠色的confirm按鈕圖片 if not exists("1334343679730.png"):
return
if reverse == 0:
click(exists())
選擇英雄的"右箭頭" 複製前面的就好
else:
click(exists())
選擇英雄的"左箭頭" 複製前面的就好
wait(WAIT_SEC)
接下來 是重新整理的部分 主要對應IE9來寫的
如果用其他瀏覽器的人可以自己改寫相對應的
def refresh(e):
wait(1800)
等30分鐘
程式在家裡會跳出"遊戲需要重整"的關鍵圖片之後 等30分鐘後就會自己重整
設定30分鐘是因為萬一程式在家裡賺錢 人在公司手癢了可以偷偷玩一下
或是算算英雄訓練時間到了 可以換個英雄去訓練 XD
rightClick(exists())
click(exists())
這邊我是設定滑鼠移到遊戲畫面左上 gift 左邊 的Avengers 圖樣左邊
讓程式點滑鼠右鍵 點選空白的地方
然後點下"重新整理"
不過這裡的圖 非。常。難。抓!!
點"螢幕截圖"之後要馬上移動到那個地方點右鍵 才會抓得到"重新整理"四個字
我有試過"type(KEY.F5)
" 這個指令 這個指令似乎不是百分百執行
(當然也可能是我電腦遜 XD)
要加上type(KEY.F5)指令的話 就直接把上面兩行指令(rightclick click)
改成type(KEY.F5)
就好了
wait(WAIT_SEC)
一樣 因為我電腦很慢XD
click(exists())
IE9重整之後 下面會出現的提示 我嫌他礙眼 所以會點掉
wait(60)
以下是主要程式部分
# main program
def main():
#if 1:
while 1:
switchApp("")
切換到XX瀏覽器 "只能用該瀏覽器在你電腦裡的正式名稱"
像 Chrome 我跟我朋友就的電腦分別是 Google Chrome 跟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
if exists():
My Gifts字樣圖片
click(exists())
遊戲上方play 按鈕圖片
# if need to close windows
wait(WAIT_SEC)
有時候會跳到禮物頁面 所以我設定如果出現"My Gifts"的圖 就去點 上面的"play"
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秒)
然後飛機圖案要抓兩種 一種是游標移動到上面變成綠色底的 一種是一般的
不管那種都要注意 停機坪的部分不能擷取太多 然後不要擷取到飛機等級字樣
如果有不同等級的飛機 每種等級都要抓圖
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)
上面兩張圖是 出的任務種類
飛機少 英雄少 電腦快的人用時間短的就好
飛機多 英雄多 電腦慢的人用時間長一點的
自己計算投資報酬率來決定
像我飛機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會跑去按飛行空母的引擎(攤手)
# observe the refresh requirement
這邊是要程式每隔一段時間觀察是否有需要重整
Settings.ObserveScanRate = 0.2
觀察頻率
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
電腦我是半調子(畢竟是英文系畢業而已 程式懂的連皮毛都不到 只是愛查資料)
語法很多毛病 如果有更好的語法歡迎互相建議指教
指責跟罵人就免了
如果有違反什麼東西的話請版主幫我刪掉這篇文章
希望板上的各位財源滾滾 各位探員武運昌隆 XD
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.34.184.89
※ 編輯: mashfigaro 來自: 114.34.184.89 (05/05 04:57)
※ 編輯: mashfigaro 來自: 27.242.68.19 (05/05 08:23)
推 blacknil:先推,再來看使用辦法XD 05/05 09:18
推 rabbit2004x:用心推 05/05 10:15
[部份違規推文已被系統自動刪除]
推 catsondbs:好棒 推一個 05/05 11:23
推 jbkim:推用心 05/05 13:00
推 pozx:婀~但我現在有的英雄都9等~~衣服寶石全研發了~武器道具也有 05/05 15:09
→ pozx:研發一部份~飛機6等~但我現在銀幣1百多萬~純手點~ 05/05 15:10
推 pozx:應該正常玩到後期會很足夠~不過分享即是美德~純推不下 05/05 15:14
推 azumi96:我飛機兩等 都沒好友QQQQQQQQQQQQQQQQQQQQQQQQQQ 05/05 16:33