QQ游戏对对碰教程
这些日子,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).t
相关文章
通常情况下,只有群主才具备设置管理员和解散群聊的权限,该怎么设置qq群管理员呢?详细请看下文介绍2025-01-30
电脑qq聊天框变成一侧显示怎么切换回来? 电脑qq聊天变成两边的技巧
电脑qq聊天框变成一侧显示怎么切换回来?qq聊天框正常聊天内容是一左一右显示的,该怎么解决这个问题呢?下面我们就来看看电脑qq聊天变成两边的技巧2023-11-07
QQ作为年轻人社交软件,在这里大家如果喜欢发布说说应该都比较好奇如何去设置说说定时发布,下面小编带来了详细操作步骤,一起来学习一下吧2023-01-06
QQ作为年轻人使用的社交软件,在这里大家想要知道在过去一年中,我们和谁的交流最多可以查看年度报告,下面就跟着小编来看看2022年的年度报告在哪里查看吧2022-12-22
腾讯QQ是腾讯公司开发的一款基于Internet的即时通信(IM)软件,腾讯QQ最新版支持在线聊天、视频通话、点对点断点续传文件、共享文件、网络硬盘、自定义面板、QQ邮箱等多种功2022-12-20
腾讯QQ支持在线聊天、视频通话、点对点断点续传文件、共享文件、网络硬盘、自定义面板、QQ邮箱等多种功能,并可与多种通讯终端相连,下面就跟着小编来学习如何导入文件到腾2022-12-20
QQ乐在沟通数十年,聊天欢乐9亿人,下载QQ最新版,随时随地收发好友和群消息,一触即达,在这里大家知怎么去下载腾讯问卷吗?一起来看看下面的教程吧2022-12-20
在QQ上和亲朋好友聊天,如果我们当前不再QQ页面,我们可以设置消息预览的方式,让我们不用打开QQ就能了解到消息内容,下面来看看设置的具体步骤吧2022-12-20
QQ群可以汇集一群志同道合、有共同兴趣爱好或者目标的小伙伴在一起交流讨论,在这里大家还可以使用抽签工具,下面小编带来了使用抽签工具的方法,一起来看看吧2022-12-13
12月9日,QQ上线了一个全新的榜单功能,通过这个新功能查看到自己的等级在全球排名多少,那么该如何进行排名的查看呢?跟着小编带来的教程学习一下吧2022-12-12











最新评论