手机按键精灵版的微信跳一跳脚本思路、源码
2018-01-11 08:32阅读:
注意:此脚本仅供交流图形识别等方法的实现
一、采用三种计算距离方式:1、扫描新积木顶点算出横坐标,棋子和新积木中点的连线和水平方向夹角其实是固定角度,大约30度,利用这一点可以直接算出距离,该方法比较稳定,但是时间长容易偏离。2、直接扫描新积木顶点和下边界,这样可以算出新积木的中点,但是结果不稳定,不过算对了就比较精确。3、找白点直接算,前提是上一次跳到积木中点
二、由于很多脚本的刷的高分上不了榜单,怀疑一方面微信加入了行为检测,一方面是高分控制,解决方法是模拟人的行为,将所有固定数据改为允许范围内的随机数据,如按压点在给定范围内随机,每次跳跃停顿时间随机,加分积木一定要停留并拿到这个分数,主动打断连击,每次都能连击必然上不了榜单
三、打算适配所有手机,所以会故意跳出积木以计算跳跃速度
四、本脚本仅供交流学习,不做商业用途,源码首发公众号“小浅玩机”,欢迎来观光:)
////////////////////////////复制以下内容/////////////////////////////////
Dim pai = 3.14159265358979323846
Dim BackgroundColor
Dim ArruratePointx,ArruratePointy,topy
Dim whitepointx,whitepointy
Dim Cheesex,Cheesey
Dim speed
Dim midx,midy//中点坐标
Dim ContinuousjumpCount = 0//连跳中心点计次
Dim ScorePlus = 0//加分的积木停留时间
Dim MyValue1,MyValue2
Dim 背景色
ShowMessage '5秒后开始'
Delay 5000
Call 获得手机分辨率()
Call 计算速度()
///////////////////////////循环部分///////////////////////////
Do
KeepCapture
br> Call 跳跃()
Call 随机延迟()
Delay 1000 + MyValue1 * 100 + ScorePlus
Loop
/////////////////////////////////////////////////////////////
///////////////////////////准备工作///////////////////////////
Sub 获得手机分辨率
KeepCapture
Dim i,j
Dim rColor
i = 0
Do
rColor =
GetPixelColor(0+i,0,0)
If rColor = '000000' Then
midx = i/2
Goto
获得手机分辨率标记1
Else
i = i + 1
End If
Loop
Rem 获得手机分辨率标记1
j = 0
Do
rColor =
GetPixelColor(0,0+j,0)
If rColor = '000000' Then
midy = j/2
Goto
获得手机分辨率标记2
Else
j = j + 1
//TracePrint
j
End If
Loop
Rem 获得手机分辨率标记2
TracePrint '手机分辨率为: '&midx*2,midy*2
ReleaseCapture
End Sub
Sub 计算速度
Dim Count
Dim intx,inty
Call 找到棋子()
intx = Cheesex
inty = Cheesey
随机按压 (750,1500,1000)
Do
Call 找到棋子()
If Cheesex = 0 Then
Else
Count = Count +
1
If Count > 2
Then
Exit Do
End If
End If
Loop
speed =
(sqr((Cheesex-intx)^2+(Cheesey-inty)^2))/1000
TracePrint 'speed = '&speed
Delay 3000
Call 重新开始游戏()
End Sub
Sub 随机延迟
Randomize
MyValue1 = Int(((9-5+1) * Rnd()) + 1)
//TracePrint 'MyValue1'&MyValue1
End Sub
Sub 随机连击
Randomize
MyValue2 = Int(((5-1+1) * Rnd()) + 1)
//TracePrint 'MyValue2'&MyValue2
End Sub
Function 随机按压(a,b,t)
Dim MyValue
Randomize
MyValue = Int(((20-(-20)+1) * Rnd()) + (-20))
Touch a+MyValue, b+MyValue, t
End Function
/////////////////////////////////////////////////////////////
///////////////////////////距离计算///////////////////////////
Sub 找到棋子
//
Dim intX,intY
FindMultiColor
0,0,0,0,'3E3635','27|44|5F4540,-12|108|3D3535,9|197|663B39',0,1,intX,intY
If intX > -1 And intY > -1 Then
Cheesex = intX + 8
Cheesey = intY + 190
Else
FindMultiColor
0,0,0,0,'3E3635','27|44|5F4540,-12|108|3D3535,9|197|663B39',0,0.95,intX,intY
If intX > -1 And intY > -1
Then
Cheesex = intX +
8
Cheesey = intY +
190
Else
FindMultiColor 0,
0, 0, 0, '3E3635', '27|44|5F4540,-12|108|3D3535,9|197|663B39', 0,
0.9, intX, intY
If intX > -1 And
intY > -1 Then
Cheesex = intX + 8
Cheesey = intY + 190
Else
Cheesex = 0
Cheesey = 0
End If
End If
End if
TracePrint 'Cheesex ,Cheesey =
'&Cheesex&','&Cheesey
End Sub
Function 得到某一横线数量最多的颜色(a)//a是代表纵坐标y的值
//TracePrint 'midxmidx = '&midx
Dim rColor
rColor = GetPixelColor(0, a, 0)
背景色 = rColor
//TracePrint 'rColor = '&rColor
Dim 是否相等
Dim 颜色数量
Dim 颜色数量1
dim i
颜色数量 = GetColorNum(0,a,midx*2-1,a,rColor,1.0)
If 颜色数量 > 560 Then
//TracePrint '背景色1 =
'&背景色
Else
i=1
Do
是否相等 =
CmpColor(i,a,背景色,1)
If 是否相等 > -1
Then
Else
rColor = GetPixelColor(i, a, 0)
颜色数量1 = GetColorNum(0, a, midx * 2 - 1, a, rColor, 1.0)
If
颜色数量1 > 颜色数量 Then
颜色数量 = 颜色数量1
背景色 = rColor
Else
End
If
End If
i=i+1
If i = midx*2-1
Then
Exit Do
End If
Loop
End If
//TracePrint '背景色 = '&背景色
End Function
Sub 获取背景色()
//因为背景色自上而下渐变,获取平均色点后,算出平均色点和上下两端的差值,作为背景色
//获取顶部背景色点
Dim rColor1,rColor2
得到某一横线数量最多的颜色(1)
rColor1 = 背景色
//TracePrint '这个点的颜色为:'&rColor1
Dim r1,g1,b1
ColorToRGB(rColor1,r1,g1,b1)
//TracePrint '上方取样色点为:
'&r1&','&g1&','&b1
//TracePrint 'midx,midy =
'&midx&','&midy
得到某一横线数量最多的颜色(midy*2-1)
rColor2 = 背景色
//TracePrint '这个点的颜色为:'&rColor2
Dim r2,g2,b2
ColorToRGB(rColor2,r2,g2,b2)
//TracePrint '下方取样色点为:
'&r2&','&g2&','&b2
Dim r,g,b
r = (r1 + r2) / 2
g = (g1 + g2) / 2
b = (b1 + b2) / 2
//转化为十六进制
Dim rr,gg,bb
rr = Hex(r)
gg = Hex(g)
bb = Hex(b)
BackgroundColor = bb & gg & rr
//计算色差
Dim dc,dc1,dc2,dc3
dc1 = Hex(Abs(b1 - b2))
dc2 = Hex(Abs(g1 - g2))
dc3 = Hex(Abs(r1 - r2))
//TracePrint '差值dc=
'&dc1&','&dc2&','&dc3
//TracePrint 'Len(dc1)=
'&Len(dc1)
//TracePrint 'Len(dc2)=
'&Len(dc2)
//TracePrint 'Len(dc3)=
'&Len(dc3)
If Len(dc1) = 1 Then
dc1 = '0' & dc1
End If
If Len(dc2) = 1 Then
dc2 = '0' & dc2
End If
If Len(dc3) = 1 Then
dc3 = '0' & dc3
//TracePrint 'dc3 = '&dc3
End If
dc = dc1 & dc2 & dc3
BackgroundColor =
BackgroundColor&'-'&dc
End Sub
Function 搜索积木顶点(a, b)
//TracePrint 'a,b = '
&a&','&b//a和b是搜索范围的起点
//
Call 获取背景色()
TracePrint'背景色为:'&BackgroundColor
//TracePrint 'BackgroundColor =
'&BackgroundColor
Dim i,j,k
//TracePrint 'a='&a
j=0
Do
i = 0
Do
Dim 是否相等1
是否相等1 =
CmpColor(a+i,b-600+j,BackgroundColor,1)
If 是否相等1 > -1
Then
//TracePrint '匹配颜色的序号为:'&是否相等1
//TracePrint RoughPointx-SearchScope+i
Else
//TracePrint '找到顶点'
Goto 搜索积木顶点标记1
End If
i = i + 1
Loop until a+i>midx+a-2
j=j+1
Loop Until b - 500 + j > b
//TracePrint '找不到想要的顶点,循环自动结束后退出到这里'
Rem 搜索积木顶点标记1
k = 0
Do
Dim 是否相等2
是否相等2 =
CmpColor(a+i+k,b-600+j,BackgroundColor,1)
If 是否相等2 > -1 Then
Exit Do
Else
End If
k = k + 1
//TracePrint 'k = '&k
Loop
//TracePrint 'k = '&k
Dim rColor
rColor = GetPixelColor(a+i+k/2, b-600+j,0)
//TracePrint '新积木顶点的颜色为:'&rColor
Dim IntX,IntY
FindColor
a+i+k/2-100,b-600+j,a+i+k/2+100,b-600+j+200,'5D69F3|F89C6B|2789F4|B36C0D|7776EF|6BAB50|433F3D|262626',0,1.0,intX,intY
If intX >-1 then
Traceprint '找到加分积木'
Call 随机延迟()
ScorePlus =
MyValue1*1000+1000
Else
ScorePlus = 0
End If
//TracePrint 'i = '&i
Delay 100
ArruratePointx = a + i + k / 2
topy = b-600+j
//TracePrint '得到了新积木顶点横坐标X =
'&ArruratePointx
End Function
Function 计算新积木纵坐标(a)
Dim i=1
//TracePrint 'topy = '&topy
Do
Dim 是否相等1
是否相等1 =
CmpColor(ArruratePointx,a+i,BackgroundColor,1)
If 是否相等1 > -1 Then
Exit Do
Else
End If
i=i+1
Loop
//TracePrint '纵向扫描长度为 '&i
ArruratePointy = a + (i-143) /
2//这里需要减去积木的高度143像素,这是1080P手机下的值,唯一不能适配只能填入的值
End Function
Sub 寻找白点
whitepointx = -1
Dim IntX,IntY
FindMultiColor
10,midy-400,midx*2-10,midy,'F5F5F5','-19|-6|F5F5F5,18|-1|F5F5F5',0,1,intX,intY
If intX > -1 Then
whitepointx = intX
whitepointy = intY
Else
FindMultiColor
10,midy-400,midx*2-10,midy,'F5F5F5','-19|-5|F5F5F5,19|-3|F5F5F5',0,1,intX,intY
If intX > -1 Then
whitepointx =
intX
whitepointy =
intY
Else
FindMultiColor
10,midy-400,midx*2-10,midy,'F5F5F5','-17|-9|F5F5F5,18|-3|F5F5F5',0,1,intX,intY
If intX > -1
Then
whitepointx = intX
whitepointy = intY
Else
End If
End If
//TracePrint '找不到白点'
End If
End Sub
/////////////////////////////////////////////////////////////
////////////////////////跳跃及重新开始////////////////////////
Sub 跳跃
//计算中心点
Dim dd=0
Dim Distance,Distance1,Distance2
Dim i,j,k,l
Dim t
Dim SearchScopex,SearchScopey
SearchScopex = 250
SearchScopey = 250
Call 找到棋子()
//如果找到白点则直接用白点
If Cheesex = 0 Then
Call 重新开始游戏()
End If
Call 寻找白点()
If whitepointx > 0 Then
ContinuousjumpCount =
ContinuousjumpCount + 1
Call 随机连击()
If ContinuousjumpCount >
MyValue2 Then
dd=20
End If
//TracePrint '用白点'
Distance = Sqr((Cheesex -
whitepointx) ^ 2 + (Cheesey - whitepointy) ^ 2)
Dim IntX,IntY
FindColor
whitepointx-100,whitepointy-100,whitepointx+100,whitepointy+100,'5D69F3|F89C6B|2789F4|B36C0D|7776EF|6BAB50|433F3D|262626',0,1.0,intX,intY
If intX >-1 then
Traceprint
'找到加分积木'
Call 随机延迟()
ScorePlus =
MyValue1*1000+1000
Else
ScorePlus = 0
End If
Goto 跳跃标记1
Else
ContinuousjumpCount = 0
dd = 0
End If
If Cheesex
//TracePrint'积木在右边'
搜索积木顶点(midx, Cheesey)
Else
//TracePrint'积木在左边'
搜索积木顶点 10, Cheesey
End If
//方法一:根据角度计算距离的方法稳定性好,但是精确度会逐渐下降
Distance1 = (Sqr((Cheesex - ArruratePointx) ^ 2)) /
cos((pai/180)*30)
//TracePrint '计算得到距离为:'&Distance1
//方法二:扫描确定Y坐标,精确度高但是稳定性差,在和Distance1差距不大的情况下选择Distance2,否则选择Distance1
计算新积木纵坐标(topy)
Distance2 = Sqr((Cheesex - ArruratePointx) ^ 2 +
(Cheesey - ArruratePointy) ^ 2)
//TracePrint 'abs(Distance1 - Distance2) =
'&abs(Distance1 - Distance2)
If abs(Distance1 - Distance2) < 30 Then
Distance = Distance2
//TracePrint '选用方法一'
Else
Distance = Distance1
//TracePrint '选用方法二'
End If
Rem 跳跃标记1
t= (Distance+dd)/speed
随机按压(750,1500,t)
End Sub
Sub 重新开始游戏
Dim IntX,IntY
FindColor
0,0,midx*2,midy*2,'77C700',0,1.0,intX,intY
If intX >-1 then
随机按压(intX,intY,100)
Else
End If
Delay 2000
End Sub
////////////////////////////复制以上内容/////////////////////////////////