看板 SuperHeroes 關於我們 聯絡資訊
這遊戲銀幣初期還好 等到你一票英雄都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