北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 5075|回复: 9

求助task机器人

[复制链接]
发表于 2009-9-22 09:15:06 | 显示全部楼层 |阅读模式
我自己写了个task机器人,思路这样的
1、首先用糖果的思路做好遍历,然后开始取房间信息,每个区域兜一圈
#tri{^(%x)%s-%s$}{#log 11.txt;#say @lujing}
#tri{^%s 这里*的出口是 *$}{#log}
每进入一个地点就打开log记录,看到出口就关闭log,lujing记录的是遍历起点到这个房间的最短路径,整理后导入access数据库就得到地点描述表:区域名称、房间名称、房间描述、最短路径,最后加个字段ck
2、locate物品
先task一下,把当前未完成的任务记录在tasklist中,
复位数据库"update didian set ck=0"
locate一下
#tri{这个地方的描述中含有这样的字眼:(*),(*)}{#var TaskMS1 %1;#var TaskMS2 %2}
然后搜索数据库"update didian set ck=ck+1 where id in (select id from didian where desp like '% @TaskMS%')"
搜索到匹配的记录ck加1
如果locate两次并且能匹配到记录的话ck=4,此时基本能确定具体方位,然后跑到该区域起始地点,走一下最短路径就到了,拿完东西直接反向跑回起始地点,回ct
3、送物品
没什么难度,人物地点都固定,来回的命令很容易做
4、遍历
没什么好说的,npc在能达到的地方应该都能找到,一般遍历1次就能找到,不行2次,不行就放弃了,好多地方进不去
这个机器人用下来发现效率比较低,一轮下来做不超过10个,主要locate不理想,拿东西效率太慢,遍历地点太少
首先查询数据库发现有滞后或忽略现象,locate出来的结果有时会是前一个的结果,可能连数据库的速度响应比较慢
还有乱码会影响查询结果,无法准确定位
拿东西的时候每个人都杀一遍再get all from corpse,效率不高
遍历的时候经常跑过,明明看看那个人穿衣服拿武器了但跑过了或者停下来那个人又闪了,跟着跑过去人都没影了,只好重新遍历一下,也能找到,就是时间浪费了不少
以上几点请教各位该如何解决?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2009-9-22 09:50:30 | 显示全部楼层
用zmud连接access?很厉害啊!
locate的时候加上个房间出口,这样准确率会高很多,当然前提是要重新做一遍数据库;
可以把大部分的task npc搬到你的房间,会快很多,目前服务器挺稳定的,搬一次可以顶10天;
杀人拿东西的时候要快,get all from corpse貌似有busy吧?可以直接 get du jing from corpse,这样还不错,并且不用drop布衣之类的,也不会不小心get 了别人的藏宝图被pk;还有最好是“xx脚下不稳,跌倒了”就get xx from yy,这样最好,因为人多的时候killall会直到所有人都晕了会停下来,这时候再killall就不爽了。
遍历的时候经常跑过,这个不应该跑回起点重新开始遍历吧?应该手动的在附近几个房间搜索一下,当然能自动区域遍历则更好。
还有不知道你是什么门派的?杀task 小贼的速度怎么样?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2009-9-22 10:10:04 | 显示全部楼层
告你一个很悲惨的消息

我的经验,locate的时候,出现的两个字段,都是忽略了房间描述里的所有标点符号的(逗号,句号,全角半角,空格等等)
如果你locate的时候,出现的字段正好在某个标点前后各一个字,那数据库是匹配不到的
所以数据库要更新,把所有的标点都去掉

还有,task npc的行走方式是,每秒都有几率行走,行走的几率比杀手小,但是每次行走的步数很可怕,至少在5步以上。如果你遍历到他那里的时候,他正好走在这几步中间的话,你就会看到他在你身边跑来跑去。不过一般就在你找到他的地点的附近1~5步吧,看你的运气以及当时地点的复杂程度了,自己手动走两步找找吧,多半能找到。

不要用get all,有busy的,locate的时候,task物品@task_item的id保存下来,每次有人晕了或者死了,就get @task_item from corpse或者get @task_item from xxx,再做一个从n个尸体上搜东西的alias,比如#6 get @task_item from corpse %i。因为经常trigger出得慢,杀了第二个人,第一个的trigger才出,这个时候,只会去搜第二个尸体两次……

dzlc做task很快的,比我快一倍
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2009-9-22 10:16:53 | 显示全部楼层
原帖由 liangyijian 于 2009-9-22 10:10 AM 发表
告你一个很悲惨的消息

我的经验,locate的时候,出现的两个字段,都是忽略了房间描述里的所有标点符号的(逗号,句号,全角半角,空格等等)
如果你locate的时候,出现的字段正好在某个标点前后各一个字,那数据 ...

这个我也注意到了,不过我的解决方法是把两个字拆开组成一个字符串:a%b%c%d 这样再去检索access就可以忽略标点了,并且不用对数据库做改动。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2009-9-22 10:19:02 | 显示全部楼层
原帖由 dzlc 于 2009-9-22 10:16 AM 发表

这个我也注意到了,不过我的解决方法是把两个字拆开组成一个字符串:a%b%c%d 这样再去检索access就可以忽略标点了,并且不用对数据库做改动。

我怎么没想到,我哭
以后只要dzlc在做task,我就不做了
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2009-9-22 11:02:31 | 显示全部楼层
用access查询感觉延时太厉害,不知大家用什么方法做的
拆四个字搜的话效率是不是低了些
我数据库标点全都去掉了,甚至有个备份把乱码字全替换为■,想把关键字也替换为■再检索,结果不行,请问有什么方法
另外task物品只固定出现在某些人身上吗,不然搬npc干什么?
请问做task npc触发用什么,我一直没做好,有时停不下来
task npc跑了是不是再做个机器人自动在周围一定范围内搜索?
问题有些多请谅解,这个机器人我花了20天零零碎碎做起来的,测试效果不理想一度想放弃的
另外我明教id,180级目前parry,sword用英雄剑法,没用金花,老张那学不到暗器
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2009-9-22 11:44:39 | 显示全部楼层
原帖由 tonii 于 2009-9-22 11:02 AM 发表
用access查询感觉延时太厉害,不知大家用什么方法做的
拆四个字搜的话效率是不是低了些
我数据库标点全都去掉了,甚至有个备份把乱码字全替换为■,想把关键字也替换为■再检索,结果不行,请问有什么方法
另外task物品只固定出现在某些人身上吗,不然搬npc干什么?
请问做task npc触发用什么,我一直没做好,有时停不下来
task npc跑了是不是再做个机器人自动在周围一定范围内搜索?
问题有些多请谅解,这个机器人我花了20天零零碎碎做起来的,测试效果不理想一度想放弃的
另外我明教id,180级目前parry,sword用英雄剑法,没用金花,老张那学不到暗器


1、用mush连接access感觉不到延时
2、就算12个字一起搜,也没什么延时,还是很快
3、zmud乱码具体怎么乱的搞不清楚,我只知道“库”会变成“B”
4、搬npc是指搬李莫愁、段誉、裘千仞这些还task物品的npc,这样集中起来一来是还的快,二来防止有些npc被杀了
5、task npc跑了的问题,我是做了个区域遍历:可以从一个房间开始遍历周围N步的所有房间,但是不知道用zmud能不能实现
6、task npc的触发是先在交还task物品的时候抓取中文、英文名字,遍历的时候进入每个房间时分析每个物品是不是中英文符合,符合了就停下来(mush做法),zmud可以用英文名字做触发比较好,因为中文名字可能出乱码
7、明教做task你问问其他人或者搜搜论坛

最后,我觉得你还是转mush算了,你现在已经做好了前期的工作了,转到mush也简单。

[ 本帖最后由 maper 于 2009-9-22 11:46 AM 编辑 ]
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2009-9-23 11:17:13 | 显示全部楼层
感谢各位的耐心解答
楼上第6个答案好象不行,因为看不到task npc,只看见某某穿衣服拿武器,如果他叫杀还能停下来,不然他走开我就傻在那了或者继续遍历了,难道是进一个房间就id here?能发现吗?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2009-9-23 11:43:53 | 显示全部楼层
原帖由 tonii 于 2009-9-23 11:17 AM 发表
感谢各位的耐心解答
楼上第6个答案好象不行,因为看不到task npc,只看见某某穿衣服拿武器,如果他叫杀还能停下来,不然他走开我就傻在那了或者继续遍历了,难道是进一个房间就id here?能发现吗?

这个 也没什么好的办法了,因为中文名如果是k开头的可能会出现乱码,这在mush中就没问题了。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2009-9-23 15:54:30 | 显示全部楼层
研究了半天mush。。。。。还是放弃
刚才研究了乱码字问题写了个转换命令
#var s1 %left( @taskms1, 2)
#if (%len( @s1)<2) {#var s1 "■"}
#if %pos( %char( 191), @s1) {#var s1 "■"}
#var s2 %right( @taskms1, 2)
#if (%len( @s2)<2) {#var s2 "■"}
#if %pos( %char( 191), @s2) {#var s2 "■"}
#var taskms1 %concat( @s1, @s2)
其中taskms1是截取的关键字之一,s1s2是中间变量
s1截取第一个中文字,如果是乱码字可能会变成一个字符,因此直接{#var s1 "■"}
有些乱码字截取正常,那第二行就起作用了%char( 191)=16进制BF,中文字内码包含两个字节,懂点电脑知识的都知道,zmud721中所有包含BF字节的字都是乱码,不管出现在前面还是后面,可能被程序用作其他用途了,咱也不会改,直接换另一个不乱的字吧
s2同上,最后组合起来
幸亏关键字只有两个,不然截取中间的字用%copy函数返回乱码,只能左右各取一次
把数据库乱码字全变成■,就可以搜索了
以上情况针对多中文字符就没办法了,不知各位同学有没有更好的方法
另外用update didian set ck=ck+1 where id in (select id from didian where desp like '% @TaskMS%')发现数据库更新明显滞后,因此直接select * from didian where desp like '*@taskms1*' and desp like '*@taskms2*' 搜一次就行,取出数据放入list,再搜跟list比较,绕过更新数据库的过程,延时问题也解决
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-24 09:49 PM , Processed in 0.011327 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表