按键精灵吧 关注:500,295贴子:1,028,447
  • 12回复贴,共1

挂机脚本思路祥解

只看楼主收藏回复

今天网络巨卡,闲来无事,集合最近使用按键的体会,把本人编写挂机脚本的思路提供给大家,写的不妥之处请高手指点。

一、自动找怪

大部分游戏都提供了怪物血条显示,可借助血条显示完成自动找怪和判别怪的死亡,当然利用按键新提供的全屏查图功能也可以实现,但本人认为除非游戏没有提供血条显示,万不得已再使用查图找怪,毕竟此功能在系统资源消耗大和速度上也不占优势。下面是使用圆渐变方法找怪的详细程序:

Rem re
VBS dim x(基准点x坐标),y(基准点x坐标),x0(渐变圆x坐标),y0(渐变圆y坐标),n(渐变弧度), r(渐变圆半径)

VBS x0=512:y0=379:x=100:n=0:::r=50 /付初值
While x<1000
 VBS y=y0-r*Sin(n) /得到当前点x坐标
 VBS x=x0+r*Cos(n) /得到当前点y坐标
 VBSCall Call SetCursorPos(x,y)@<stdlib.vbs> /设置鼠标位置
 VBS n=n+0.3 /递增渐变弧度
 IfExpression n>6.28 /完成一次圆渐变 
 VBS n=0 /弧度致0
 VBS r=r+20 /渐变圆半径递增
 EndIf 
 IfColor 532 40 ffffff 2 /如果怪物血条存在
 Goto start
 EndIf 
EndFor 
Goto re
Rem start
LeftDoubleClick 1 /双击鼠标左键开始攻击(如有快捷攻击键应优先使用)
IfColor 446 23 3f4d36 2 /取怪物血条减少至最低时的非血颜色判别怪物是否即将死亡
 Delay 1000 
 Goto re /怪未死亡返继续攻击
EndIf 
Goto start /怪死亡返到开始找怪

over,可以通过修改圆渐变弧度和半径的步长来改变找怪的速度和精度

二、自动补药

取角色红兰条进行判断

IfColor 196 18 0 0
 KeyPress 53 1 /按补血快捷键5
EndIf 
IfColor 182 39 0 0
 KeyPress 54 1 /按补兰快捷键6 
EndIf 
KeyPress 55 1 /按检物快捷键7(也可在此插入延时语句)

此程序很简单,就不做解释了

三、自动技能攻击

主要是施放技能的时间间隔需要自己通过试验设定,总的原则尽量不要使技能空闲时间过长,以发挥最大攻击强度

KeyPress 49 1 /按快捷键盘1施放技能1
Delay 2000
KeyPress 50 1 /按快捷键盘2施放技能2

Delay 2000
KeyPress 51 1 /按快捷键盘3施放技能3 
Delay 2000
KeyPress 52 1 /按快捷键盘4施放技能4

好了,3个程序都有了,如何将他们组合起来使用,其实很简单,分别作为三个脚本独立运行,进入游戏后依次启动或关闭。为什么不将他们组合在一个程序当中?组合可以但要解决并发运行目前的脚本语言实现起来有难度,如果简单将三个程序组合在一起会出现找怪和攻击怪时无法及时补药的情况,这对于在怪物较密集的地方挂机或遭到怪围攻时存在角色死亡的危险。当然三个脚本同时运行可能对于机器配置较低的玩家来说有难度,可以根据实际情况选择组合模式。


2楼2006-03-09 16:51
回复
    处理文件用到的常量有:ForReading = 1 ,ForWriting=2,ForAppending=8,用于的操作分别是读/写和追加,都要在使用之前用VBS Const来声明。常用于处理文本文件的方法有:Read(var)—读var个字符,ReadLine—读一行,ReadAll—读整个文件内容,SkipLine—跳过本行指向下一行,Write(var)—把字符串var写入文件,WriteLine(var)—把字符串var和换行符写入文件,WriteBlankLines(n)—写入n个换行符。
    下面给出几个利用VBScript访问外部文件的例子:
    1.创建一个新的文本文件,如果文件已经存在则报告错误:
    Rem 在当前盘根目录下创建"测试.txt"并写入一个字符串
    VBS dim fso,file,filename
    VBS filename="\测试.txt"
    VBS Const ForWriting=2
    VBS Set fso=CreateObject("Scripting.FileSystemObject")
    IfExpression fso.FileExists(filename)=-1
    VBSCall Call MessageBox("发现错误!!!文件已经存在!!!")@<stdlib.vbs>
    Goto over
    EndIf 
    VBS Set file=fso.CreateTextFile(filename,Ture)
    VBS file.WriteLine("文件第一行,这是一个测试文件")
    VBS file.Close
    VBSCall Call MessageBox("测试文件创建成功!!!")@<stdlib.vbs>
    Rem over
    EndScript 
    2.强行写入文件覆盖原有内容:
    Rem 往当前盘根目录下的文件"测试.txt"写入一个字符串,覆盖原有内容
    VBS dim fso,file,filename
    VBS filename="\测试.txt"
    VBS Const ForWriting=2
    VBS Set fso=CreateObject("Scripting.FileSystemObject")
    IfExpression fso.FileExists(filename)=0
    VBSCall Call MessageBox("发现错误!!!文件不存在!!!")@<stdlib.vbs>
    Goto over
    EndIf 
    VBS Set file=fso.OpenTextFile(filename,ForWriting,Ture)
    VBS file.WriteLine("测试写入文件行")
    VBS file.Close
    VBSCall Call MessageBox("写入文件成功!!!")@<stdlib.vbs>
    Rem over
    EndScript 
    3.往文件尾部追加内容:
    Rem 往当前盘根目录下的文件"测试.txt"末尾追加一个字符串
    VBS dim fso,file,filename
    VBS filename="\测试.txt"
    VBS Const ForAppending=8
    VBS Set fso=CreateObject("Scripting.FileSystemObject")
    IfExpression fso.FileExists(filename)=0
    VBSCall Call MessageBox("发现错误!!!文件不存在!!!")@<stdlib.vbs>
    Goto over
    EndIf 
    VBS Set file=fso.OpenTextFile(filename,ForAppending)
    VBS file.WriteLine("测试追加字符串到文件末尾")
    VBS file.Close
    VBSCall Call MessageBox("追加字符串到文件成功!!!")@<stdlib.vbs>
    Rem over
    EndScript 
    4.读取指定文件一行
    Rem 从当前盘根目录下的文件"测试.txt"读一行
    VBS dim fso,file,filename,text
    VBS filename="\测试.txt"
    VBS Const ForReading=1
    VBS Set fso=CreateObject("Scripting.FileSystemObject")
    IfExpression fso.FileExists(filename)=0
    VBSCall Call MessageBox("发现错误!!!文件不存在!!!")@<stdlib.vbs>
    Goto over
    EndIf 
    VBS Set file=fso.OpenTextFile(filename,ForReading)
    VBS text=file.ReadLine
    VBS file.Close
    VBS text="从文件"&filename&"读取行成功!读到的字符串为:"&text
    VBSCall Call MessageBox(text)@<stdlib.vbs>
    Rem over
    EndScript
    5.从指定文件行读取2个字符
    Rem 从当前盘根目录下的文件"测试.txt"读取2个字符
    VBS dim fso,file,filename,text
    VBS filename="\测试.txt"
    VBS Const ForReading=1
    VBS Set fso=CreateObject("Scripting.FileSystemObject")
    IfExpression fso.FileExists(filename)=0
    VBSCall Call MessageBox("发现错误!!!文件不存在!!!")@<stdlib.vbs>
    Goto over
    EndIf 
    VBS Set file=fso.OpenTextFile(filename,ForReading)
    VBS text=file.Read(2)
    VBS file.Close
    VBS text="从文件"&filename&"读取2个字符成功!读到的字符为:"&text
    VBSCall Call MessageBox(text)@<stdlib.vbs>
    Rem over
    EndScript 
    6. ReadAll读取整个文件内容,大文件太占资源,不建议使用
    使用方法和ReadLine近似
    7.SkipLine跳过当前行
    使用方法是file.SkipLine,仅用于只读属性打开的文件
    8.测试文件行结束/文件结束
    a.测试行结束
    判断语句
    IfExpression file.AtEndOfLine=-1
    ...
    EndIf
    表达式为真的时候当前指针处于行末
    b.测试文件结束
    判断语句
    IfExpression file.AtEndOfStream=-1
    ...
    EndIf
    表达式为真的时候当前指针处于文件末
    9.其他用于文件的函数或者叫方法功能有
    a.file.Column 返回当前列号
    b.file.Line 返回当前行号
    c.file.FileExists(filename) 判断指定文件是否存在


    3楼2006-03-09 16:52
    回复
      2025-08-27 06:33:57
      广告
      不感兴趣
      开通SVIP免广告
      图形查找不成功大都是图片编辑问题,若对编辑图片没什么经验的请看看我的编图过程:
      1、截图:在游戏中按下Print键就可将图截下来。
      2、编辑:(将图片背景透明处理)打开系统自带的画图软件,按下Ctrl+V就可将截下来的图复制到画图中,选定要剪的图片,将其拖到左上角;接着按Ctrl+PageDown将图片放大,用画直线工具将不属于要剪的图片的颜色用白色复盖掉(特别注意:图片的边缘一定要白色,若背景不变的就不用填充白色了),设置好图片的大小,按Ctrl+PageUP将图像缩小后存盘。
      3。保存:将图片以BMP格式保存到按键精灵的script目录下以后用就不用指明路径,若保存到其它地方用时就需指明路径。
      详细操作请看附件(晕!图片老是传不上,若需要详细操作截图的请留下邮箱)

      直接将图剪下来难免会有一些没用的背景,而游戏中背景一般都是动的,只好降低相似度来忽略图中那些用不到的东西,通常相似度要设到0.9以下才能查找,而低相似度,会经常没有图形都能找到(特别是较小的图片),你说晕不?
      而经过透明背景处理过的图片,相似度设为1亦能正确找出(前提是:你所抓的图在游戏中的颜色必须是不变的),推荐用0.9
      经过透明处理的图片兼容性较强:比如封神榜的合成材料和红蓝只用一个图片就行了,因为那些东西后面都有一个“乘1”(那个叉不会写)。合成材料的“乘1”是白色的红蓝药的“乘1”是黄色的,但“乘1”的轮廓是黑色的,将“乘1”的外面和里面都经过透明处理就能“白乘1”和“黄乘1”一起抓了。还有血条数值、地图坐标、红蓝数量的数字都是同一字体轮廓颜色也相同,所以只要抓0-9这10个数字就能将血量、坐标、红蓝数量都读出来了。兼容性是不是强很多呢?

      我对图形查找的看法是:图形查找并不是认轮廓的,而是认颜色的,只要颜色稍为不对就不认了,大家可以试下:有些图在32色下能找在16色下就找不到了。所以我们在编辑图片的时候要将不固定的颜色都要用白色复盖掉,只留低固定的颜色。对于相似度我就不怎么理解了,有时0。9以下的找不到而用1却能找到

      以前误导大家了:将不透明处理前的勾去掉和不去也是一样的,还有复盖背景时不一定要用白色,用其它色也可以,大家可以试试

      按键是自动判断外面一圈的颜色,并且把外面一圈的颜色作为透明色


      4楼2006-03-09 16:53
      回复
        上了论坛翻了翻最近的帖子,发现有不少朋友在研究〖如何在几个脚本间传递数据〗的问题。其实这个问题在以前也有朋友讨论过,以前也有朋友利用“读写文本文件”的方法来传递数据,这个方法是一个比较好的方法,但是,在实际操作中相对比较复杂。下面,我想给大家介绍一种方法【利用剪切板在脚本间传递数据】在使用这个方法时,有一个前提,那就是你的 浏览器必须是 Internet Explorer 5.5 以上版本。

        以下脚本在 按键精灵 5.50 版本下测试。请看以下代码:

        脚本一:向剪贴板中写如数据。你可以随意修改变量strdate的值,可以是字符串,也可以是数值。有点要注意的是,写如剪贴板中的内容只能是文本格式的,不能是图片、表格等!

        VBS strdate="风花雪月"
        VBS Set objIE = CreateObject("InternetExplorer.Application")
        VBS objIE.Navigate("about:blank")
        VBS objIE.document.parentwindow.clipboardData.SetData "text", strdate
        VBS objIE.Quit

        脚本二:从剪贴板中读取数据。脚本将弹出一个窗口,并显示剪贴板中的内容

        VBS Set objIE = CreateObject("InternetExplorer.Application")
        VBS objIE.Navigate("about:blank")
        VBS strdate = objIE.document.parentwindow.clipboardData.GetData("text")
        VBS objIE.Quit
        VBSCall Call MessageBox(strdate)

        如果你要测试的话,可以把以上两段代码分别复制到两个脚本的“源代码”中

        在实际运用中,可以在脚本合适的位置插入以上代码,就可以实现在两个脚本中传递数据了。有一点要注意,就是在实际使用中,要注意写入和读出的数据的格式哦

        当然,利用以上代码还可以做一些其他事情,相信大家可以自由发挥了。


        5楼2006-03-09 16:53
        回复
          按键精灵常用功能-解说[版本5.0以上]
          首先-启动按键精灵-看到主程序界面的“小灯泡”增加按钮了吗?点击它...
          然后-这样就新建了一个脚本,并进入了脚本编辑器界面。(具体参见Qmacro基础资料http://www.vrbrothers.com/cn/qmacro/

          按键精灵常用功能-详细解说[3]-控制动作-6个功能
          (1)抓点颜色并执行语句-通过判断屏幕x,y坐标的某点的颜色,是等于、不等于、还是近似某颜色,来执行后面的动作或控制...抓点颜色教程详见...
          (2)循环语句-循环N次,其实这里除了可以用for,还可以用while语句。
          (3)条件语句-如果某条件成立,执行某命令...除了简单的If...EndIf,还可以If...else...endif,或if...elseif...elseif...endif等形式。
          (4)跳转和调用子程序-跳转用goto,可以跳转到rem标记过的地方,调用子程序用gosub,这里要说明一点是:rem标记和子程序名字一样的话,将也会goto到子程序处,而不仅仅是goto到rem的标记。
          (5)标记和子程序-rem除了用来解释,最重要的作用就是做goto的标记;sub...return子程序的好处,就是不必在主程序写很多相同的代码,使用模块化的子程序,调用方便,结构清晰...不过,最好使用唯一的子程序名称,和rem的标记名称也要独立唯一,不然容易出错,还有就是同一个子程序未结束的时候再次调用,return的时候容易看错哦。
          (6)脚本停止-很简单Endscript表示到此脚本运行完毕。

          举例:大家可以找找论坛里的各种脚本,参见其中的这些功能,按下你设定的快捷键开始执行你的脚本...
          rem while语句循环
          VBS i=0
          while i<=9
          VBS i=i+1
          endfor
          VBSCALL CALL messagebox(i)

          rem if语句循环
          VBS j=0
          if j<=10
          j=j+1
          goto if语句循环
          else
          VBSCALL CALL messagebox(j)
          endif

          rem 子程序
          VBS k=0
          gosub 跳出对话框k

          rem 演示rem和sub同名
          waitkey
          VBS k=0
          goto 跳出对话框k
          VBS k=0
          gosub 跳出对话框k
          rem 跳出对话框k
          VBS k=100
          VBSCALL CALL messagebox(k)

          rem 演示重复调用
          VBS p=0
          VBS pp=1
          gosub 重复
          VBSCALL CALL messagebox(p)
          VBSCALL CALL messagebox(pp)
          endscript

          sub 跳出对话框k
          VBS k=i+j
          VBSCALL CALL messagebox(k)
          return

          Sub 重复
           If p=3
           Goto 返回
           Else 
           VBSCall CALL messagebox("我是重复")
           VBS p=p+1
           Gosub 重复
           VBS pp=pp+1
           EndIf 
           Rem 返回
           VBSCall CALL messagebox(pp)
          Return


          6楼2006-03-09 16:54
          回复
            • 222.213.47.*
            看不


            8楼2006-03-09 22:07
            回复
              • 222.245.195.*
              尽量试验


              9楼2006-03-24 19:17
              回复
                • 58.50.89.*
                我昏了!~~~
                看昏了~~~~


                10楼2006-03-25 17:09
                回复
                  2025-08-27 06:27:57
                  广告
                  不感兴趣
                  开通SVIP免广告
                  • 221.192.241.*
                  楼主你QQ多少,我+


                  11楼2006-03-26 12:32
                  回复
                    • 218.14.155.*
                    好难啊。我水平不够高啊。晕死了


                    12楼2006-03-26 18:38
                    回复
                      • 61.29.236.*
                      bu dong


                      13楼2006-03-26 20:15
                      回复
                        我大概懂了 可又不是很明白 查图找怪为什么不使呢 在热血江湖里 怪是没有血条显示的 我试着抓点 可不好用 即使查到和怪物大约相同的颜色 鼠标也不点击 麻烦楼主赐教 我的邮箱 770213@163.com


                        14楼2006-03-26 23:21
                        回复
                          • 221.212.173.*
                          我大概懂了 可又不是很明白 查图找怪为什么不使呢 在热血江湖里 怪是没有血条显示的 我试着抓点 可不好用 即使查到和怪物大约相同的颜色 鼠标也不点击 麻烦楼主赐教 我的邮箱 suiheng000@163.com


                          15楼2006-03-27 08:12
                          回复