只有菜鳥才寫LLK外掛(標題摘自互連網,不代表本人觀點)

來源:互聯網
上載者:User

    好吧,哥也只是一個很菜的死胖紙    

 

    聽JJ同學說,小雪做了一個連連看的外掛,是用->映像分析->尋路做的.瞬間各種膜拜.分析映像這一點已經夠亮了,但是據說以此為基礎的尋路有點小問題.昨天幹了一個命令列版的.曬下

 

    如果讓我說亮點,我覺得

    1.直接開進程空間讀Table,能夠自動適應不同的作業系統尋找Table基址(就是棋盤基址,寫入程式碼嘖- -),分析過程比較亮,後面有圖有真相

    2.做了自動Reload功能,單無解時候自動進行Reload,不過只做一次(一般Reload道具有兩個)

 

    學到神馬,嗯,CE工具,無敵加強大,記憶體斷點,nice~介面...表示很糾結...過段時間拜JJ同學為師學C#吧(熱衷底層的人兒你傷不起啊有木有)

 

    程式思路:1.讀Table;2.尋路(無解則reload);3.輸出解決指令碼;4.按指令碼類比滑鼠點擊;

    晒圖先:

 

 

 

 

    稍微看看圖,通過分析可以知道,Table基址是棧地址,不同的作業系統是不同的,程式裡面通過EBP+1770C來定位這個Table的基址,在不同的作業系統中,EBP的值有變化.

    對於尋路演算法,推薦文章:http://hi.baidu.com/umu618/blog/item/8eb88b0a624ef23eb1351db4.html,講的很清楚,實現了之後暴力對棋盤進行窮舉就OK了,之前擔心這樣的時間複雜度太高,但是由於尋路裡面的判斷條件很多,因此總體來說已耗用時間還好啦.

    對於文章當中講到的3種尋路的實現代碼:

BOOL<br />FindLine(<br />UCHAR Table[ROW][COL],<br />LLKPOINT p1,<br />LLKPOINT p2<br />)<br />{<br />int i = 0;<br />int max, min;<br />if (p1.row == p2.row)<br />{<br />max = (p1.col > p2.col) ? p1.col : p2.col;<br />min = (p1.col < p2.col) ? p1.col : p2.col;<br />if (max == min + 1)<br />{<br />return TRUE;<br />}<br />for (i = min + 1; i < max; i++)<br />{<br />if (Table[p1.row][i] != 0)<br />{<br />return FALSE;<br />}<br />}<br />return TRUE;<br />}</p><p>if (p1.col == p2.col)<br />{<br />max = (p1.row > p2.row) ? p1.row : p2.row;<br />min = (p1.row < p2.row) ? p1.row : p2.row;<br />if (max == min + 1)<br />{<br />return TRUE;<br />}<br />for (i = min + 1; i < max; i++)<br />{<br />if (Table[i][p1.col] != 0)<br />{<br />return FALSE;<br />}<br />}<br />return TRUE;<br />}</p><p>return FALSE;<br />}</p><p>BOOL<br />FindCorner(<br />UCHAR Table[ROW][COL],<br />LLKPOINT p1,<br />LLKPOINT p2<br />)<br />{<br />int row = 0;<br />int col = 0;<br />LLKPOINT p = {0};</p><p>row = p1.row;<br />col = p2.col;<br />if (Table[row][col] == 0)<br />{<br />p.row = row;<br />p.col = col;<br />if (FindLine(Table, p1, p)/<br />&& FindLine(Table, p, p2))<br />{<br />return TRUE;<br />}<br />}</p><p>row = p2.row;<br />col = p1.col;<br />if (Table[row][col] == 0)<br />{<br />p.row = row;<br />p.col = col;<br />if (FindLine(Table, p1, p)/<br />&& FindLine(Table, p, p2))<br />{<br />return TRUE;<br />}<br />}</p><p>return FALSE;<br />}</p><p>BOOL<br />FindTwoCorner(<br />UCHAR Table[ROW][COL],<br />LLKPOINT p1,<br />LLKPOINT p2<br />)<br />{<br />int i;<br />LLKPOINT tp1 = {0};<br />LLKPOINT tp2 = {0};</p><p>//橫向搜尋<br />for (i = 0; i < COL; i++)<br />{<br />if (i == p1.col)<br />{<br />continue;<br />}<br />tp1.row = p1.row;<br />tp1.col = i;<br />if (Table[tp1.row][tp1.col] == 0)<br />{<br />if (FindLine(Table, p1, tp1))<br />{<br />tp2.row = p2.row;<br />tp2.col = i;<br />if (Table[tp2.row][tp2.col] == 0)<br />{<br />if (FindLine(Table, p2, tp2))<br />{<br />if (FindLine(Table, tp1, tp2))<br />{<br />return TRUE;<br />}<br />}<br />}<br />}<br />}<br />}</p><p>//縱向搜尋<br />for (i = 0; i < ROW; i++)<br />{<br />if (i == p1.row)<br />{<br />continue;<br />}<br />tp1.col = p1.col;<br />tp1.row = i;<br />if (Table[tp1.row][tp1.col] == 0)<br />{<br />if (FindLine(Table, p1, tp1))<br />{<br />tp2.col = p2.col;<br />tp2.row = i;<br />if (Table[tp2.row][tp2.col] == 0)<br />{<br />if (FindLine(Table, p2, tp2))<br />{<br />if (FindLine(Table, tp1, tp2))<br />{<br />return TRUE;<br />}<br />}<br />}<br />}<br />}<br />}</p><p>return FALSE;<br />}

 

    哥一直都是在練習裡面測試的,為了測試真實效果而跟真人玩了2局.

    哥享受的是寫的過程,測試成功的過程,而不是虐人的過程..

 

    最後代表黨和人民感謝一下JJ同學,如果有機會順便感謝一下史努比和加菲貓(前進方向上的明燈啊)..

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.