我把長文再貼一次。。。 國慶快樂。 這個(gè)輔助大約是從去年9月份開始,我前后花了兩個(gè)多月做出了第一個(gè)版本,然后接下來的幾個(gè)月里又陸陸續(xù)續(xù)的加了幾個(gè)大的功能,變成了一個(gè)功能基本齊全的輔助。 目前的功能包括: 自動(dòng)采集,自動(dòng)造兵,自動(dòng)進(jìn)攻,自動(dòng)要兵,自動(dòng)捐兵,自動(dòng)升級(jí)城墻。自動(dòng)進(jìn)攻又包括屌絲,弓法蠻,偷黑和八本龍流沖杯幾種,閃黑下王開技能都有。捐兵是可以智能識(shí)別請(qǐng)求的,按需捐兵,而且是全兵種按需求捐。就捐兵這點(diǎn),應(yīng)該比大多數(shù)的輔助都要強(qiáng)。打錢打黑的效率也是杠杠的,有圖為證。我自己四個(gè)號(hào),八本到十一本,只剩十一本科技和防御沒滿(但是王墻都滿了)。 ![]() ![]() 更多功能請(qǐng)看 https://coczhushou./ 為什么要開源呢?我并沒有太多時(shí)間可以花在輔助上,今年一月以后,就沒加過新功能,除了修bug和更新一些圖片識(shí)別代碼??紤]之后,想著還有其他coc輔助開發(fā)愛好者,他們可能會(huì)對(duì)這個(gè)輔助有興趣,我就開源給大家分享吧。如果別人能從源碼中獲得點(diǎn)幫助,感覺也算做了一件好事。 我接觸按鍵精靈時(shí)間并不長,也就是從去年8 9月份開始用,所以代碼中很有可能會(huì)有些地方實(shí)現(xiàn)得不好,請(qǐng)大家指點(diǎn)。而且今年以來我就不關(guān)注按鍵精靈有什么更新,也有可能代碼里有些我自己實(shí)現(xiàn)的東西按鍵精靈已經(jīng)提供了。但是,我對(duì)自己的壘碼技巧還是有自信的,有些地方還是可以拿出來和大家分享(xianbai)的。 代碼還沒有來得整理,可能有點(diǎn)亂,如果有人感興趣讀代碼,我可以整理一下,寫點(diǎn)注釋。如果沒有,我就不費(fèi)那個(gè)力了。 先上代碼: 代碼在此 干貨 先說說幾個(gè)經(jīng)驗(yàn),如果大家有更好的解決辦法,歡迎討論
第一反應(yīng)是做字庫,每個(gè)兵種做幾個(gè)關(guān)鍵字,比如”藍(lán)胖“,”法“什么的。但是,但是,按鍵精靈的字庫很爛,真的很爛,不是一般的爛,識(shí)別起來問題很多。錯(cuò)誤率非常高。我做0-9這十個(gè)字的字庫時(shí)都要哭了,別說二十幾個(gè)兵種了。那咋辦?怎么辦呢? 答案是用多點(diǎn)找色。這個(gè)識(shí)別請(qǐng)求比字庫靠譜多了。怎么找?我研究了一下幾個(gè)主流安卓模擬,發(fā)現(xiàn)coc的字體在這些模擬器里都是一樣的。所以,我可以發(fā)個(gè)聊天信息,把兵種都說出來;兵種名字間用個(gè)豆腐塊符號(hào)分割,比如“▍蠻 ▍弓 ▍法 ▍巨 ▍”;然后截圖;然后找豆腐塊,兩個(gè)豆腐塊之間就是一個(gè)兵種名字的圖片;對(duì)每個(gè)兵種名字的圖片,掃描每行,在每行上找到字的邊緣,在邊緣兩邊各取一個(gè)像素,然后把這些像素合起來做這個(gè)字的多點(diǎn)找色匹配值。當(dāng)然,這些都是用腳本完成的,并不費(fèi)力。有興趣可以看看源碼里CreateWordPatterns這個(gè)函數(shù)。 還有一些細(xì)節(jié),比如同一兵種不同叫法,“胖“和”巨“,是要識(shí)別成同一種兵的。再比如,輔助得區(qū)分'龍'和“小龍”,“藍(lán)胖”和“胖”,“巨石投手'和“石”,需要對(duì)找到的字符做一下匹配優(yōu)先級(jí),比如小龍的優(yōu)先級(jí)比龍高。最后需要識(shí)別“隨”和“不”字?!半S”字好理解,很多請(qǐng)求是“隨便”,”隨意“,對(duì)這種請(qǐng)求,輔助也需要識(shí)別一下,然后按照設(shè)定捐默認(rèn)的兵種;識(shí)別“不”字是因?yàn)橛行┱?qǐng)求是“不要胖子”這樣的,智能的輔助是不會(huì)捐胖子找茬的。 有些地方還沒有做得太細(xì),比如十本十一本發(fā)“狗球”,明顯是要一狗一球,但是現(xiàn)在還不會(huì)識(shí)別已經(jīng)捐了多少,如果沒有狗就會(huì)全部捐球。。但是輔助還是有一點(diǎn)智能的,它會(huì)優(yōu)先捐體積大的,如果有狗,會(huì)優(yōu)先捐狗;同樣道理“弓法”優(yōu)先捐法。另一種情況是請(qǐng)求里帶有數(shù)量的,比如“五法二胖”,目前也沒辦法精確滿足。 但是從實(shí)際的狀況看,效果已經(jīng)非常好了。在一個(gè)活躍部落,二十四小時(shí)可以捐3000的人口。部落戰(zhàn)時(shí)也不用擔(dān)心不在線沒法及時(shí)給兵。 捐兵實(shí)現(xiàn)里還有其他的一些細(xì)節(jié),比如捐完自動(dòng)補(bǔ)兵,向上翻頁找請(qǐng)求之類的,沒什么好講的。
這個(gè)我是花了不少功夫的。 首先要判斷采集器的等級(jí),如果放到最大,采集器的等級(jí)很好判斷,但是這樣的話很難確定采集器的坐標(biāo),這個(gè)坐標(biāo)會(huì)關(guān)系到下兵的位置。最好是把畫面縮放到最小,再判斷采集器的位置。 縮放到最小麻煩的地方在于coc畫面有一些平滑處理,在上下邊緣還有顏色漸變(變暗)。平滑處理會(huì)使物品在移動(dòng)非整數(shù)像素后,物品上同一個(gè)地方的像素顏色發(fā)生變化。如果知道一點(diǎn)圖片縮放知識(shí),知道顯示的圖片是插值的,就會(huì)理解。這樣一來,如果對(duì)一個(gè)采集器做好了多點(diǎn)找色的匹配模板,很可能換個(gè)位置就找不到了。這也是為啥多點(diǎn)找色要找周圍色彩相近的地方取點(diǎn)做匹配,而且匹配顏色的每個(gè)分量要給一個(gè)范圍的原因。問題是,coc的采集器,尤其是10級(jí)11級(jí)12級(jí)金礦采集器,在縮到最小后,他們之間的差別都在色彩變化非常劇烈的地方,就是那堆金燦燦的的地方。匹配模板不好找阿。 為了解決這個(gè)問題,我花了不少時(shí)間,最后寫了一個(gè)python程序,比較同樣等級(jí)采集器的十幾張不同截圖,然后自動(dòng)生成一個(gè)使所有圖片都能匹配的多點(diǎn)找色匹配值。這樣,對(duì)不同等級(jí)的采集器總算能區(qū)分得很準(zhǔn)了。等級(jí)低的金水采集器(低于7級(jí))由于資源不多,我就不管了。但是黑水是寶貴的,1級(jí)采集器都會(huì)識(shí)別。 第二個(gè)難點(diǎn)是判斷采集器里到底有百分之幾的資源。我們知道金水采集器的上限從12級(jí)往下依次是200000, 150000, 100000, 75000, 50000,...采集器里資源大概有多少百分比是可以通過外觀判斷的。網(wǎng)上有教怎么判斷外觀,但是沒有給出具體數(shù)值范圍。我通過大量實(shí)驗(yàn)(對(duì),我就是這么勤勞)總結(jié)出了大致范圍。黑水采集器有四種狀態(tài),每種狀態(tài)的資源百分百比大概是:0-10% 10%-25% 25%-50% 50%-100%。金水采集器有五種狀態(tài),資源百分比大概是:0-4% 5%-35% 36%-65% 65%-95% 96%-100%。 金水采集器被搶的話大約會(huì)損失50%的資源(這個(gè)似乎和大本等級(jí)差值沒什么關(guān)系)。黑水被搶是75%,比如,6級(jí)黑水采集器容量是1800,所以經(jīng)常看到死魚的采集器里能搶到1800*75%=1350黑。 判斷百分比其實(shí)比判斷資源采集器等級(jí)還難。因?yàn)榈貓D縮小后,顯示資源百分比的地方是很小很小的一塊,肉眼都不一定能看出區(qū)別來。金礦采集器尤其困難,半滿和大半滿看上去一樣,識(shí)別率實(shí)在太低,我只好曲線救國,用圣水采集器的百分比,反推金水采集器的百分比----他們經(jīng)常是差不多的。但是黑水和圣水百分比是精確判斷的。 為什么要判斷得這么準(zhǔn)?因?yàn)檫@個(gè)輔助需要智能下兵,并非像某些輔助四面一框下兵,傻子都知道不是人在下兵。這個(gè)輔助,如果不是太糾結(jié)下兵頻率,是看不出來是輔助在下兵的。所有的兵都下在資源采集器或者大本邊上,目的明確。需要準(zhǔn)確識(shí)別的另外一個(gè)原因是,閃黑的時(shí)候,至少知道能閃到多少黑吧?對(duì)著空黑水礦閃,怎么看怎么傻。 如何判斷死魚 找墳?zāi)?超過15個(gè)墳?zāi)咕图僭O(shè)它是死魚。 如何判斷打還是不打 這個(gè)可以設(shè)置的,比如只打死魚不打活魚;比如采集器資源超過多少才打,采集器還必須是在外面,藏在里面的不算;再比如要不要打外置大本。
之前說到定位建筑需要縮放到最小。這個(gè)是因?yàn)槲覄傞_始開發(fā)的時(shí)候,地圖縮放到最小,左右兩邊是正好沒法移動(dòng)的,只有上下可以移動(dòng),這樣建筑坐標(biāo)就好確定,只需要將地圖移到最上端,找到建筑坐標(biāo);再將地圖移到最下端,找到另一些建筑坐標(biāo),加個(gè)豎直方向的偏移量就可以了。但是,但是,某個(gè)版本以后變了,縮放到最小后,地圖左右兩邊還有少許空間,而留的這少許空間還不是一個(gè)固定值;據(jù)我觀察,是一個(gè)登錄時(shí)確定的隨機(jī)值。也就是縮放比例的最小值和以前不一樣了,是一個(gè)不確定的值了。 我嚴(yán)重懷疑這個(gè)變化是supercell故意給輔助找麻煩的。不然為啥縮放比例最小值每次登陸還不一樣? 當(dāng)時(shí)想了一個(gè)辦法解決了這個(gè)問題,在地圖縮放到最小時(shí),左右移動(dòng)地圖直到兩邊,算出左右移動(dòng)的距離,然后折算出當(dāng)前的縮放率,用這個(gè)縮放率來校正截圖,并且用來校正找到的建筑物的坐標(biāo)。代碼里有調(diào)用SetScreenScale,就是干這個(gè)的。有一個(gè)問題,怎么算移動(dòng)距離呢?辦法就是當(dāng)?shù)貓D在最左時(shí),在畫面上選一行,在這行上選幾個(gè)點(diǎn),讀取它們的像素,當(dāng)作多點(diǎn)找色的匹配值;然后右移地圖,移動(dòng)后再找那幾個(gè)點(diǎn),算出移動(dòng)了多少距離。只靠一行可能不準(zhǔn),那就多找?guī)仔?,問題是由于識(shí)別錯(cuò)誤,每行給出的移動(dòng)距離可能不盡相同。那就對(duì)移動(dòng)距離投個(gè)票,選票數(shù)最多的移動(dòng)距離。 建筑物用多點(diǎn)找色來找,和確定采集器等級(jí)的方法差不多。目前判斷的建筑物有:采集器,大本和防空炮臺(tái)。防空炮臺(tái)是給八本龍流沖杯用的。 進(jìn)攻的時(shí)候,建筑物邊緣一格內(nèi)是不能下兵的,會(huì)有紅色的陰影在草地上。通過判斷草地的顏色,就可以知道哪里是建筑物的邊緣。 把上述的都識(shí)別了以后,輔助可以把整個(gè)地圖畫出來,標(biāo)注出找到的建筑和整個(gè)陣的輪廓。 一些細(xì)節(jié): 地圖是45度的 這個(gè)增加了游戲的真實(shí)感,但是也加大了輔助的處理難度,最后建筑物坐標(biāo)都得轉(zhuǎn)換成45度的坐標(biāo)系。 “點(diǎn)擊或按住屏幕可以派出部隊(duì)” 不知道大家進(jìn)攻的時(shí)候有沒有留意到這句話。這句話在屏幕下方靠近底部的位置。有的時(shí)候,它非常惡心的擋住了那個(gè)位置上的大本或者其他建筑。所以輔助如果沒有找到大本,會(huì)稍微移動(dòng)一下屏幕,再判斷一次大本的位置和等級(jí)。 下雪特效 冬天建筑屋會(huì)覆蓋上一層雪,這真是蛋疼,我不得不修改多點(diǎn)找色的匹配值。 如何判斷哪些草坪可以下兵 用多點(diǎn)找色會(huì)比較麻煩,很可能不準(zhǔn),因?yàn)椴莸念伾菑?fù)雜變化的。而且還必須區(qū)分開被紅線覆蓋的草坪。我的辦法是,在地圖每個(gè)小塊的正中選一個(gè)小片,統(tǒng)計(jì)里面有多少個(gè)像素是在指定的顏色范圍里的(綠色),如果大于40%,就算草皮。這樣做的效果非常好,準(zhǔn)確度很高。
統(tǒng)計(jì)用戶數(shù) 發(fā)布以后,按鍵精靈并沒有告訴我有多少人用我的輔助。但是我有我的辦法。有個(gè)命令叫URL.Get可以發(fā)送一個(gè)HTTP請(qǐng)求。這一利用這個(gè)。怎么做?有一些網(wǎng)站給其他的網(wǎng)站提供流量統(tǒng)計(jì)服務(wù),比如友盟。這些網(wǎng)站會(huì)要求客戶在他們的網(wǎng)頁里嵌入一段程序,這段程序會(huì)發(fā)一個(gè)請(qǐng)求給那個(gè)網(wǎng)站,所以每當(dāng)用戶打開客戶的網(wǎng)頁,就會(huì)發(fā)一個(gè)請(qǐng)求給那個(gè)網(wǎng)站,那個(gè)網(wǎng)站會(huì)記下來誰來訪問了,把搜集的訪問統(tǒng)計(jì)一下,就是客戶網(wǎng)頁的訪問次數(shù)了。有的時(shí)候客戶的網(wǎng)頁上可能不能嵌入程序(不允許運(yùn)行javascript),如果是這樣的話,流量統(tǒng)計(jì)網(wǎng)站就得讓客戶網(wǎng)頁直接發(fā)HTTP請(qǐng)求給他們,比如客戶在他們的網(wǎng)站上放一個(gè)用戶不可見的圖片,然后圖片地址是指向流量統(tǒng)計(jì)網(wǎng)站的。我們也可以利用這個(gè),假裝用戶打開了一個(gè)頁面,主動(dòng)發(fā)請(qǐng)求,地址就是這個(gè)不可見圖片的地址。 說了這么多不理解也沒關(guān)系。辦法就是:1.在https://注冊(cè)一個(gè)賬號(hào)(不要錢,提供一個(gè)郵箱地址即可)。 2.建一個(gè)project。 3.在設(shè)置里選默認(rèn)的安裝指南。 4.選”基本“的選項(xiàng),然后在顯示的一堆代碼里找到一個(gè)類似于//c./1222323/0/12312323/0/的地址。 5.在按鍵精靈腳本的開始位置寫一行URL.Get 'http://c./1222323/0/12312323/0/'(注意加上http;最好另起一個(gè)線程調(diào)用這個(gè),因?yàn)檫@個(gè)調(diào)用會(huì)比較慢,在主線程里會(huì)卡)。可以只發(fā)一次,也可以每天發(fā)一次,取決于要不要統(tǒng)計(jì)日活躍用戶。 6.登陸就可以看到用戶統(tǒng)計(jì)了,時(shí)間,IP,甚至連用戶在哪里都給你在地圖上畫出來。 網(wǎng)站提供有中文翻譯,雖然很爛。不行就找中文的流量統(tǒng)計(jì)網(wǎng)站,大致思路是一樣的。 輔助死了怎么辦 輔助其實(shí)不怎么死,安卓模擬器也不怎么死機(jī)了。之前倒是經(jīng)常發(fā)生模擬器死機(jī)現(xiàn)象,現(xiàn)在不知為啥穩(wěn)定了很多,可能模擬器優(yōu)化了吧,我輔助的代碼確實(shí)是一點(diǎn)沒變。但是無論如何,如果要長時(shí)間掛機(jī)(一周甚至一個(gè)月),萬一掛死了要重啟掛會(huì)相當(dāng)麻煩和耽誤事的。解決辦法就是,讓輔助定期給電腦上另外一個(gè)程序發(fā)心跳(heartbeat),如果那個(gè)程序長時(shí)間沒收到heartbeat,就重啟模擬器,然后等模擬器重啟了再自動(dòng)重啟輔助。這樣就需要兩個(gè)額外的東西,一個(gè)是電腦上運(yùn)行的監(jiān)視程序,輔助可以通過IP地址10.0.2.2和電腦上的監(jiān)視程序通信(做安卓開發(fā)的應(yīng)該知道);另外一個(gè)是“開機(jī)自動(dòng)啟動(dòng)輔助”的app,我不知道按鍵精靈手機(jī)版現(xiàn)在有沒有提供開機(jī)自動(dòng)運(yùn)行的功能,但我當(dāng)時(shí)是自己做了一個(gè)的app,開機(jī)后會(huì)自動(dòng)運(yùn)行輔助。這個(gè)app還會(huì)自動(dòng)點(diǎn)擊跳過廣告和開始運(yùn)行等按鈕----我相當(dāng)于自己做了個(gè)按鍵精靈╮(╯_╰)╭ 初衷是要確保輔助長時(shí)間運(yùn)行,但是后來發(fā)現(xiàn)輔助和模擬器相當(dāng)穩(wěn)定,連跑一周都沒有問題,這些東西都不需要了??墒怯行┻z跡還在代碼里沒有刪掉。 自動(dòng)識(shí)別游戲運(yùn)行包 有些輔助需要在設(shè)置里指定游戲版本,這個(gè)真是十分沒有必要。因?yàn)椴煌姹镜挠螒蜻\(yùn)行包名字都是com.supercell.clashofclans.xxxx(除了最近的騰訊版),xxxx可以是uc,可以是kunlun,或者是其他別的。簡單的掃描手機(jī)里所有的安裝包,然后找到名字是以com.supercell.clashofclans開頭的那就是游戲的運(yùn)行包了。shanhai插件提供了掃描安裝包的功能。當(dāng)然,如果安裝了多個(gè)游戲版本,還是要選運(yùn)行哪個(gè)版本的。 先寫這么多. |
|