成人午夜激情影院,小视频免费在线观看,国产精品夜夜嗨,欧美日韩精品一区二区在线播放

制作QQ游戲對對碰外掛教程詳解

2010-08-28 10:45:56來源:西部e網作者:

  這些日子,QQ游戲外掛是風光了一陣.俄羅斯方塊,連連看,對對碰這些游戲的外掛層出不窮。其實這一類外掛的原理大體都是一樣的。下面我就以QQ游戲對對碰外掛作為例子闡述一下QQ外掛的制作原理。

  觀察QQ游戲對對碰的游戲界面及游戲規則,發現玩家是在固定的一個游戲區內尋找復合要求的方塊然后點擊兩次鼠標消去方塊從而達到得分的目的。因此,我們可以通過模擬人的觀察,和鼠標點擊來實現外掛自動消除方塊,完成全局。

  取得可消方塊(模擬人觀察):要判斷哪個方塊可以消,我們可以通過獲取方塊某點的顏色來判斷方塊的類型,然后建立方塊矩陣,然后在矩陣中選擇出適合消去的方塊。關于取顏色,我們用到幾個API函數 GetPixel、GetDC、ReleaseDC。(詳細的介紹請參考MSDN或各種API相關資料)

  模擬鼠標擊:在此我們使用 mouse_event 來模擬鼠標的移動,點擊,彈起。個人認為用postmessage是更好的,在此使用mouse_event只是為了闡述簡單。

下面是VB實現代碼(帶詳細注釋):
'模塊中
'*************模塊:modMain******************
'作者:Cyril
'Email:terry6394@126.com
'Web: http://www.sguca.com/other
'書寫日期:2004.10.23
'編輯日期:2002.10.23
'轉載請保留此信息
'版權所有(a)Cyril 405 工作室 
'********************************************
Option Explicit

'API聲明
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
'API類型定義
Private Type POINTAPI
x As Long
y As Long
End Type
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

'方塊類型定義
Public Enum BOX_TYPE
Ox = 0
Dog = 1
Panda = 2
Chicken = 3
Cat = 4
Frog = 5
Monkey = 6
End Enum

'自定義方塊數據類型x,y位方塊坐標,type為方塊類型.
'在Easy對對碰1.5版中還加如了一些其他屬性,例如是否帶道具屬性.
Public Type BOX
x As Integer
y As Integer
type As BOX_TYPE
End Type

'Api常量

'鼠標事件常量
Private Const MOUSEEVENTF_LEFTDOWN = &H2
Private Const MOUSEEVENTF_LEFTUP = &H4
Private Const MOUSEEVENTF_MOVE = &H1
Private Const MOUSEEVENTF_ABSOLUTE = &H8000

Public Const HWND_TOPMOST = -1
Public Const SWP_NOSIZE = &H1
Public Const SWP_NOMOVE = &H2
'自定義常量
'游戲區左上角坐標
Const GAME_LEFT As Integer = 176
Const GAME_TOP As Integer = 102
'每個方塊的長寬
Const BOX_WIDTH As Integer = 48
Const BOX_HEIGHT As Integer = 48

'游戲窗口句柄
Public g_WindowHwnd As Long
'方塊矩陣 (8*8)
Public boxs(7, 7) As BOX
**********過程名:DelayTime******************
'作者:Cyril
'書寫日期:2004.10.23
'編輯日期:2002.10.23
'目的:獲取當前場景 , 建立方塊矩陣
'方法:killBox
'應用于:MainMod模塊
'********************************************
Public Function getBoxs()
Dim i As Integer '矩陣行
Dim j As Integer '矩陣列
Dim color1 As Long '顏色 (22,22)處
Dim color2 As Long '顏色 (22,17)處

For i = 0 To 7
For j = 0 To 7
With boxs(i, j)
.x = GAME_LEFT + 22 + BOX_WIDTH * j
.y = GAME_TOP + 22 + BOX_HEIGHT * i
'取每個方塊坐標(22,22)和(22,17)位置的顏色
color1 = getColor(.x, .y)
color2 = getColor(.x, .y - 5)
'用兩點顏色確定一個方塊類型.
If color1 = 16777215 And color2 = 16777215 Then .type = Panda
If color1 = 2097151 And color2 = 1353909 Then .type = Chicken
If color1 = 4473924 And color2 = 14209230 Then .type = Dog
If color1 = 13828048 And color2 = 3862322 Then .type = Frog
If color1 = 8623264 And color2 = 5805536 Then .type = Monkey
If color1 = 10921638 And color2 = 9408399 Then .type = Cat
If color1 = 15398649 And color2 = 1655140 Then .type = Ox
End With
Next j
Next i
End Function

為了方便理解,這里用了一種比較簡單的算法 -- 窮舉法.(這也是Easy對對碰最初版本的算法).
'其主要思想是列舉16種消除方塊的可能。一旦有匹配的情況出現,則馬上執行鼠標點擊動作.
'如果你要使你的外掛更強大,就必須采更優秀的算法.

'**********過程名:DelayTime******************
'作者:Cyril
'書寫日期:2004.10.23
'編輯日期:2002.10.23
'目的:消去一個方塊
'方法:killBox
'說明:無
'返回值:無
'應用于:MainMod模塊
'********************************************
Public Function killBox()
Dim i As Integer
Dim j As Integer
getBoxs

' :
'   情況

For i = 0 To 4
For j = 0 To 7
If boxs(i, j).type = boxs(i + 2, j).type And boxs(i, j).type = boxs(i + 3, j).type Then
mouseClick boxs(i, j).x, boxs(i, j).y
mouseClick boxs(i + 1, j).x, boxs(i + 1, j).y
Exit Function
End If
Next j
Next i

'_
'   情況

For i = 0 To 5
For j = 0 To 6
If boxs(i, j).type = boxs(i + 2, j + 1).type And boxs(i, j).type = boxs(i + 1, j + 1).type Then
mouseClick boxs(i, j).x, boxs(i, j).y
mouseClick boxs(i, j + 1).x, boxs(i, j + 1).y
Exit Function
End If
Next j
Next i

' _
'  情況

For i = 0 To 5
For j = 1 To 7
If boxs(i, j).type = boxs(i + 2, j - 1).type And boxs(i, j).type = boxs(i + 1, j - 1).type Then
mouseClick boxs(i, j).x, boxs(i, j).y
mouseClick boxs(i, j - 1).x, boxs(i, j - 1).y
Exit Function
End If
Next j
Next i

' 
': 情況
For i = 3 To 7
For j = 0 To 7
If boxs(i, j).type = boxs(i - 2, j).type And boxs(i, j).type = boxs(i - 3, j).type Then
mouseClick boxs(i, j).x, boxs(i, j).y
mouseClick boxs(i - 1, j).x, boxs(i - 1, j).y
Exit Function
End If
Next j
Next i

'_   情況
For i = 2 To 7
For j = 0 To 6
If boxs(i, j).type = boxs(i - 1, j + 1).type And boxs(i, j).type = boxs(i - 2, j + 1).type Then
mouseClick boxs(i, j).x, boxs(i, j).y
mouseClick boxs(i, j + 1).x, boxs(i, j + 1).y
Exit Function
End If
Next j
Next i

'  _ 情況
For i = 2 To 7
For j = 1 To 7
If boxs(i, j).type = boxs(i - 1, j - 1).type And boxs(i, j).type = boxs(i - 2, j - 1).type Then
mouseClick boxs(i, j).x, boxs(i, j).y
mouseClick boxs(i, j - 1).x, boxs(i, j - 1).y
Exit Function
End If
Next j
Next i

'_-- 情況
For i = 1 To 7
For j = 0 To 5

If boxs(i, j).type = boxs(i - 1, j + 2).type And boxs(i, j).type = boxs(i - 1, j + 1).type Then
mouseClick boxs(i, j).x, boxs(i, j).y
mouseClick boxs(i - 1, j).x, boxs(i - 1, j).y
Exit Function
End If
Next j
Next i

'-_ _ 情況
For i = 0 To 6
For j = 0 To 5

If boxs(i, j).type = boxs(i + 1, j + 2).type And boxs(i, j).type = boxs(i + 1, j + 1).type Then
mouseClick boxs(i, j).x, boxs(i, j).y
mouseClick boxs(i + 1, j).x, boxs(i + 1, j).y
Exit Function
End If
Next j
Next i

' -_- 情況
For i = 1 To 7
For j = 1 To 6

If boxs(i, j).type = boxs(i - 1, j - 1).type And boxs(i, j).type = boxs(i - 1, j + 1).type Then
mouseClick boxs(i, j).x, boxs(i, j).y
mouseClick boxs(i - 1, j).x, boxs(i - 1, j).y
Exit Function
End If
Next j
Next i
' _-_ 情況
For i = 0 To 6
For j = 1 To 6

If boxs(i, j).type = boxs(i + 1, j - 1).type And boxs(i, j).type = boxs(i + 1, j + 1).type Then
mouseClick boxs(i, j).x, boxs(i, j).y
mouseClick boxs(i + 1, j).x, boxs(i + 1, j).y
Exit Function
End If
Next j
Next i

' < 情況

For i = 1 To 6
For j = 1 To 7

If boxs(i, j).type = boxs(i + 1, j - 1).type And boxs(i, j).type = boxs(i - 1, j - 1).type Then
mouseClick boxs(i, j).x, boxs(i, j).y
mouseClick boxs(i, j - 1).x, boxs(i, j - 1).y
Exit Function
End If
Next j

Next i
'>  情況
For i = 1 To 6
For j = 0 To 6

If boxs(i, j).type = boxs(i + 1, j + 1).type And boxs(i, j).type = boxs(i - 1, j + 1).type Then
mouseClick boxs(i, j).x, boxs(i, j).y
mouseClick boxs(i, j + 1).x, boxs(i, j + 1).y
Exit Function
End If
Next j
Next i
'--_ 情況

For i = 1 To 7
For j = 2 To 7

If boxs(i, j).type = boxs(i - 1, j - 2).type And boxs(i, j).type = boxs(i - 1, j - 1).type Then
mouseClick boxs(i, j).x, boxs(i, j).y
mouseClick boxs(i - 1, j).x, boxs(i - 1, j).y
Exit Function
End If
Next j
Next i
'-- - 情況
For i = 0 To 7
For j = 3 To 7

If boxs(i, j).type = boxs(i, j - 2).type And boxs(i, j).type = boxs(i, j - 3).type Then
mouseClick boxs(i, j).x, boxs(i, j).y
mouseClick boxs(i, j - 1).x, boxs(i, j - 1).y
Exit Function
End If
Next j
Next i
'_ _- 情況
For i = 0 To 6
For j = 2 To 7

If boxs(i, j).type = boxs(i + 1, j - 2).type And boxs(i, j).type = boxs(i + 1, j - 1).type Then
mouseClick boxs(i, j).x, boxs(i, j).y
mouseClick boxs(i + 1, j).x, boxs(i + 1, j).y
Exit Function
End If
Next j
Next i

'- -- 情況
For i = 0 To 7
For j = 0 To 4

If boxs(i, j).type = boxs(i, j + 2).type And boxs(i, j).type = boxs(i, j + 3).type Then
mouseClick boxs(i, j).x, boxs(i, j).y
mouseClick boxs(i, j + 1).x, boxs(i, j + 1).y
Exit Function
End If
Next j
Next i

End Function

這里的鼠標模擬用了鼠標事件.你也可以用sendmessage來實現.

'**********過程名:DelayTime******************
'作者:Cyril
'書寫日期:2004.10.23
'編輯日期:2002.10.23
'目的:模擬鼠標單擊
'方法:mouseClick(ByVal x As Long, ByVal y As Long)
'說明:x -- 方塊相對游戲窗口的X; y -- 方塊相對游戲窗口的Y;
'返回值:無
'應用于:MainMod模塊
'********************************************
Public Sub mouseClick(ByVal x As Long, ByVal y As Long)
Dim po As POINTAPI 'po點擊前鼠標位置
Dim kX As Long '方塊的絕對X坐標
Dim kY As Long '方塊的絕對Y坐標
Dim winRECT As RECT '游戲窗口的RECT

'獲得游戲窗口的RECT
GetWindowRect g_WindowHwnd, winRECT
'絕對坐標 = 游戲窗口左上角坐標 + 游戲中的相對坐標
kX = winRECT.Left + x
kY = winRECT.Top + y
'獲得鼠標點擊前位置
GetCursorPos po
'模擬鼠標移動
mouse_event MOUSEEVENTF_MOVE Or MOUSEEVENTF_ABSOLUTE, kX * 65535 / 1024, kY * 65535 / 768, 0&, 0&
'模擬鼠標按下彈起
mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP Or MOUSEEVENTF_ABSOLUTE, 0, 0, 0&, 0&
'點擊后返回原先位置
SetCursorPos po.x, po.y
End Sub

'**********過程名:DelayTime******************
'作者:Cyril
'書寫日期:2004.10.23
'編輯日期:2002.10.23
'目的:取游戲中某點顏色
'方法:getColor(ByVal newX As Long, ByVal newY As Long) As Long
'說明:newX -- 要取顏色的點的X; newY -- 要取顏色的點的Y;(X,Y均相對于游戲窗口)
'返回值:Long
'應用于:MainMod模塊
'********************************************
Public Function getColor(ByVal newX As Long, ByVal newY As Long) As Long
Dim windowDC As Long
'獲取游戲場景
windowDC = GetDC(g_WindowHwnd)
'取場景中 (newX,newY)坐標的顏色
getColor = GetPixel(windowDC, newX, newY)
'釋放場景(不要漏掉此項)
ReleaseDC g_WindowHwnd, windowDC
End Function


'====在窗體中========在窗體中========在窗體中===
Option Explicit
'##################################################################
'## 過程名稱:Command5_Click
'## 參數: 無
'##################################################################
Private Sub Command5_Click()
Command6.Enabled = Not Command6.Enabled
Command5.Enabled = Not Command5.Enabled
Timer1.Enabled = True
End Sub

'##################################################################
'## 過程名稱:Command6_Click
'## 參數: 無
'##################################################################
Private Sub Command6_Click()
Timer1.Enabled = False
Command6.Enabled = Not Command6.Enabled
Command5.Enabled = Not Command5.Enabled
End Sub

'##################################################################
'## 過程名稱:Form_Load
'## 參數: 無
'##################################################################
Private Sub Form_Load()
g_WindowHwnd = FindWindow(vbNullString, "對對碰")
'窗口總在前
SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
End Sub

'##################################################################
'## 過程名稱:Label2_Click
'## 參數: 無
'##################################################################
Private Sub Label2_Click()
End Sub

'##################################################################
'## 過程名稱:Timer1_Timer
'## 參數: 無
'##################################################################
Private Sub Timer1_Timer()
killBox
End Sub

以上代碼相對簡單,只實現了對對碰外掛的基本功能。其他的一些功能(如自動使用道具,自動開始)還需要讀者自己去擴充。不過只要你理解了取顏色,模擬鼠標動作的話,這些已經不是難題了。:)
  本例源碼下載:http://www.sguca.com/other/source.rar
  作者對對碰外掛作品Easy對對碰 1.5下載:http://www.sguca.com/other/EasyTwins.rar

關鍵詞:游戲開發

贊助商鏈接:

主站蜘蛛池模板: 武邑县| 柳林县| 北流市| 马公市| 沂南县| 太谷县| 五大连池市| 稷山县| 镶黄旗| 瓦房店市| 株洲县| 马龙县| 健康| 顺义区| 商水县| 苏尼特右旗| 雷波县| 陵川县| 元阳县| 磴口县| 宜阳县| 焉耆| 小金县| 读书| 延吉市| 汉中市| 叶城县| 临清市| 行唐县| 白沙| 普格县| 秦安县| 将乐县| 项城市| 五峰| 安达市| 长兴县| 陆河县| 谢通门县| 民权县| 武城县|