踩地雷機器人-MineSweeper Solver

這個是高中地科老師提過的課題,耳聞同學中有人做出來了,當然,讀這科的要不落人後,開始實做吧。


對於這個目標,首要就是對項目的留意,除了自己上網查資料,生活中接觸到相關內容也要留心,像幾個月前同學介紹看sitcon的直播,就有查一些幾年前的影片,當中剛好就看到從技術面簡介線上遊戲外掛介紹一些API的調用,就直接去google這些名詞了。


由於升級到win10,原本的M$game都進去xbox裡了,踩地雷也進去了,我覺得用舊版的應該比較好做,新版的花花綠綠的,根本就變成花園了,地雷變瓢蟲...受不了 > <

而且對於畫面的規劃感覺不是很好,還要滾輪滑動螢幕?!




怒載舊版


首先比較麻煩的就是畫面像素分析,但剛好踩地雷數字的顏色都有分開所以只要抓那格的顏色就好了。( 3 7 8的顏色都一樣,所以我是看周圍狀態去變動3 , 7和8)

先把matrix做出來吧!!







我參考了一下這篇自動化連連看,差不多了解流程。

像素怎抓??首先要抓到form的headler(名稱),我是用spy++(VS2010自帶的...剛好有裝 : )




首先要注意的是headler,因為minesweeper程式開下去玩的時侯會生成一個child form,那個headler是抓不到的(因為根本沒有),所以要再借助API抓child form's headler

整句下來會變這樣:


wndPaneParent = FindWindow(NULL , "Minesweeper"); // wndPaneParent 是一種windows API 的資料型態 , 名為 HWND , 宣告方式 : HWND 變數 ;

if(!wndPaneParent) puts("no such wnd !!") , exit(1); // 除錯

wndPane = GetWindow( wndPaneParent , 5); // wndPane亦同

if(!wndPane) puts("no child wnd") , exit(1); //除錯



再配合一下標尺工具FSCapture(真的不錯用 螢幕截圖都靠它了,還可以錄影 >///<

其中與其用標尺,我覺得用 "擷取矩形區域" 去看位置比較快 然後像素顏色用 "螢幕取色器" 很方便 RGB都直接幫你標出來

原本還不熟悉這個工具,不知道有取色器可以用,還抓了整段顏色數值再用API轉RGB,真蠢 www


因為它的顏色是一個range,不是說每格內的某色RGB都一樣,所以我寫成從1/3段開始往後抓,抓到某色range就停下來,確認為某色,這比較麻煩,可能就是要耐心去試。

這個真要好好做啊,畢竟題目看錯要寫正確答案...有點難 www


要注意的一點是用函式抓像素的位置是相對於form原點的位置,但標尺抓到的是螢幕的絕對位置。

所以form的原點可能要抓一下。(然後在form標到的點減原點,即為form上的位置值)


能夠抓到正確的matrix後,就代表能夠看清題目了,可以開始動手囉!!


簡述一下我寫的流程


抓form 沒有就用system開一個

掃螢幕取得數字分布狀態

while(1){


    直觀解(絕對正確):

        周遭剩下空格=數字-原本旗子->都插上旗

        周遭旗子數=數字->左右鍵齊擊,直接打開

        重掃螢幕*可以用遞迴,掃剛開的格子附近的,或是全掃


    一次假設(絕對正確):

        假設此格是旗子或空格,旁邊必然的情形繼續推理下去,當有矛盾,則假設錯誤

        重掃螢幕*可以用遞迴,掃剛開的格子附近的,或是全掃


    枚舉:

        枚舉所有情形並記錄(就是b043 , 當然 , 有機率錯):

        把所有情況舉出來,並將是旗子的加到該格上,我還用了科學記號(自己宣告的資料型態),

        加上排列組合的計算才完成

        重掃螢幕*可以用遞迴,掃剛開的格子附近的,或是全掃


}


大概就是這樣,附上Demo







my code on github


在網上有發現algorithm , 線性代數的解法,還沒研究,不過感覺會快很多。


好了,下一步該去考試了(話說這一步搞好久,為了實踐這個目標搞好久,不過也因為在這裡立誓,才有動力codeing下去!!)


那先來預告下下步~實現三管道的online judge!!(網頁、GUI及terminal的應用程式submit、clone題目當然是運用前面學的socket囉!!)


留言

這個網誌中的熱門文章

[Antergos] disable touchpad

[Editor] 入坑 Atom => Markdown 轉 PDF