自動掃雷——游戲框架


要實現一個自動完成windowsXP掃雷游戲(winmine,XP下用這個命令可啟動游戲)的程序,需要實現下面三大點:

  • 獲取游戲數據,即分析游戲在類型(初級、中級還是高級),每個塊是否揭開,如何揭開了上面的數字是多少。
  • 分析數據,即要從上面所得的數據,分析出哪些塊是雷,哪些不是雷,哪些還不能確定。
  • 從第二步得到的數據中,操作鼠標去點擊那些確定沒有雷的塊。

下面詳細介紹自己如何實現第一步和第三步(分析數據,留到后面的文章中介紹):

一、獲取游戲數據

為了簡化處理,自己只研究XP系統下自帶的掃雷。后來自己的電腦被迫升級到win7后,將XP下的掃雷游戲復制過來,繼續實現。

用FindWindow(NULL,_T("掃雷"))查找到掃雷游戲的窗體句柄,用窗體句柄找到窗體所在的區域。再截取到整個屏幕的圖像(詳見http://www.cnblogs.com/xiangism/archive/2012/06/21/2557901.html),這樣即可獲取游戲場景的像素信息,接下面的任務即是通過分析像素值完成任務。

游戲場景,如圖:

可以發現每個數字的顏色都不一樣,故可以通過顏色特征判斷出每個塊上分別是什么數字。下面分別是從1-8這些數字的顏色RGB值

{255,0,0},
{0,128,0},
{0,0,255},
{128,0,0},
{0,0,128},
{128,128,0},
{0,0,0},
{128,128,128}   RGB從右往左排列。
沒有揭開的塊,上面和左面會有白色區域,通過這個信息即可判斷出塊是否被揭開。

而游戲類型的判斷,則是通過窗體窗口的大小實現,初級的游戲窗口寬是170,中級為282,高級為506~~

二、操作游戲

如果已經從獲取的數據中分析出了哪些塊不是雷,那么即可自動點擊。這里使用的方法是用控件鼠標的win32API去點擊。即

 

//將確定沒有雷的方塊坐標i,j,轉化成鼠標要點擊的像素坐標。
//m_gameRect是窗體相對於桌面的坐標,firstClick是第一塊相對於窗體的坐標,width是每一個塊的寬度
int x= m_gameRect.left + firstClick.first + i*width; 
int y= m_gameRect.top + firstClick.second +j*width;  
SetCursorPos(x,y);
mouse_event(MOUSEEVENTF_LEFTDOWN,x,y,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,x,y,0,0);

還有一種方式,即是向游戲窗體發現鼠標點擊的消息,

SendMessage(m_gameHandle,WM_LBUTTONDOWN,1,r);
SendMessage(m_gameHandle,WM_LBUTTONUP,1,r);

不過這種方式,只能在xp下用,在win7下有點問題,為了統一,就都用mouse_event了。

下面是整個程序的UML靜態類圖

 

從上面的類圖可以看出,開始也想支持win7的自帶掃雷游戲,可發現win7掃雷太過花哨,數字都是用漸變色顯示的,不過開始為了挑戰下自己的實力,想用圖像處理、模式識別的相關知識來獲取游戲信息,可在實現過程中一不小心把win7下的掃雷游戲弄成這樣了(好像是在某一個操作鼠標點擊游戲界面時弄成這樣的)。

奇大無比   並且也沒辦法還原回去了,於是放棄了對win7掃雷的支持。只專注與實現自己想要實現的東西.對於win7系統,自己的做法是將xp中的那個掃雷程序復制過來,即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM