北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
楼主: thelast

请教几个遍历问题

[复制链接]
 楼主| 发表于 2009-6-19 05:32:21 | 显示全部楼层
感觉 wiz应该把遍历像路径那样给出来 现在遍历都是最基本的东西 做起来真是不容易啊
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2009-6-19 06:08:58 | 显示全部楼层
被你的机器人看晕了。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2009-6-19 09:01:07 | 显示全部楼层
论坛下载的zmud462附带的 atoz (task)机器人有全遍历路径,应该还能用吧。。。囧
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2009-6-19 11:29:39 | 显示全部楼层
原帖由 ppeng 于 2009-6-19 06:08 AM 发表
被你的机器人看晕了。

哈哈,搞晕了。。。都6点多了还在研究这个,太捧场了,
主要是嵌套不好理解,这个要从简单的慢慢入手,最好在zmud里专门试验,给你们几个简单点的例子,如果再看不懂就没办法了
主要的想法是依次取出shenlong变量里的每一项来执行,碰到特殊的地方要停一停,本来zmud有#while命令,但是由于zmud的#wait不够强大
多个#wait同时执行不能起到预期的效果,只能用嵌套来实现#while的功能,下面给几个简单的例子,边看边在zmud里试验下是不是这么回事,
这些例子都看完了复杂的也就懂了

#var abc 20|19|18|17|16|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1
%item(n,@abc)表示abc的第n项,比如%item(14,@abc)就是7,  %item(2,@abc)是19
先定义一个变量abc来试验,下面来遍历abc这个变量
A      先遍历2步
#alias bianli {#if @n {%item(@n,@abc);#add n -1;bianli}}
#var n 2
然后输入bianlin,结果就是先执行第2项19,n减1,接着执行第1项20,n再减1,执行了这2项之后n已经被减成0了,#if @n判断不为真,遍历结束
要小心,#alias a {north;;#add n -1;a}这个alias是无限次嵌套,永远不会停止,命令行里输入a的话在将会死机崩溃,因为没有语句让它停止,谨慎!!

B     遍历20步
#alias bianli {#if @n {%item(@n,@abc);#add n -1;bianli}}
#var n 20
在命令行里输入bianli,结果就是1;2;3;4;5;6;7;...;20

C    每遍历2步停止1秒,一直遍历20步
多用一个命令%mod(),是数学里的模,%mod(@n,10)意思是@n除以10后的余数,如果#var n 18,那么%mod(@n,10)的值是8
#if (%mod(@n,2)=0) {say n是偶数} {say n是奇数}
一个判断n是偶数还是奇数的办法
#alias bianli {#if @n {#if (%mod(@n,2)=0) {%item(@n,@abc)} {#wa 1000;%item(@n,@abc)};#add n -1;bianli}}
#var n 20
跟例子B不同的是,直接执行第n项被替代成了先判断奇偶,n是偶数直接执行,n是奇数就wait 1000然后执行
命令行里输入bianli,结果等同于1;#wa 1000;2;3;#wa 1000;4;5;...;#wa 1000;18;19;#wa 1000;20

D    执行到第5项的时候中止遍历,用trigger来让它继续
#var abc 20|19|18|17|kill zhang|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1
第5项被替换成了kill zhang
#alias bianli {#if @n {#if (@n=5) {%item(@n,@abc)} {%item(@n,@abc);bianli};#add n -1}}
#var n 20
#trigger 张死了 {bianli}
命令行里输入bianli,结果就是1;2;3;4;5;......;13;14;kill zhang,等张死了,继续16;17;18;19;20

E   执行到第5项时等待10秒再执行,其他的直接执行,用这个方法来坐船
#var abc 20|19|18|17|16|enter boat|14|13|12|11|10|9|8|7|6|5|4|3|2|1
第6项被替换成了enter boat
#alias bianli {#if @n {#if (@n=5) {#wait 10000;%item(@n,@abc)} {%item(@n,@abc)};#add n -1;bianli}}
#var n 20
命令行里输入bianli,结果就是1;2;3;4;...;13;14;enter boat;#wait 10000;16;17;18;19;20

上面的5个例子亲自到zmud里试验下就能明白

把BCDE4个都糅合到一起就是一个复杂的每2步停1秒,碰到坐船停10秒,碰到杀人就中止,杀完人后trigger继续,一个遍历就成功了
例子我就不写了,就是我前面那个把你们搞晕的一堆if
现在应该明白了吧

[ 本帖最后由 sghjjj 于 2009-6-19 11:43 AM 编辑 ]
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2009-6-20 06:04:03 | 显示全部楼层
高手高手。。
您这个如果要用来做hyd, 让他找到dbr 就自动停止,怎么实现呢?
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2009-6-20 16:24:24 | 显示全部楼层
停止不了,可以用2次遍历,第1次遍历全部,获得盗宝人所在步数,第2次遍历到DBR停下,但是如果是一个id遍历2次的话,第1次碰到dbr有可能被叫杀,dbr可能会乱走,所以需要一个大米配合,大米去找dbr,然后告诉主id盗宝人所在步数,主id遍历到盗宝人那里停下杀掉,然后遍历剩下的就可以返回,目前这种方法已经实现了遍历找到返回的自动化。战斗过程如果机器人做好点,不怕死的话,hyd有可能完全自动化,不过任务完成率只能保证在70%左右,因为一些迷宫和即使手动都很难进去的地方是必须要放弃的
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2009-6-20 16:33:44 | 显示全部楼层
在ticker里加判断,应该就可以停下吧

#if (@hasMeet>0) {
    进入战斗模块
} {
    其他遍历内容}
每次遍历初始化hasMeet=0
触发 @dbr_name~(@dbr_id~)
执行 hasMeet=1

不知道sghjjj的细节如何,但俺觉得应该可以停下 囧

[ 本帖最后由 duno 于 2009-6-20 04:36 PM 编辑 ]
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2009-6-20 17:30:14 | 显示全部楼层
我的遍历是每10步停留1.5秒,1次性10个命令发出去,一般一溜烟就跑过头了,只能停留在DBR附近10步以内。
有个另类办法能停留在1步以内但是会稍微影响遍历速度,就是利用zmud的缺陷,他的#wait功能不行,正好可以利用这个。
如果在命令行输入#wait 10000000;hp然后再输入#wait 1,结果就是立刻执行hp,没有等待到10000秒,就利用这个

把遍历改成每走一步停留1分钟,用房间名作触发,没有盗宝人执行#wa 1有盗宝人就停止
不过这个停止不是立刻停止,而是还要走1步才能停止,需要另外定义方向和反方向以便返回一步
实际效果就是每步走成功了就立刻走下一步,不会真的停留一分钟,即使这样遍历速度还是没有每次10步来的快
而且有些地方是不可逆的,简单点的迷宫也是不可逆的,这个想不到办法解决
所有这个方法不光麻烦而且不好

如果用大米来配合,我试过,基本上那边大米一接触到盗宝人,这边主ID就出发了,等大米遍历结束,主id就找到了。主id在返回的时候大米又出发了,有时候还没有完全返回,下一个盗宝人已经找到,速度非常快
大米和主ID用的机器人90%都是相同的,不需要另外再做机器人,很方便
昨天晚上挂了一会,死了1次,太伤心了,掉了20w pot,我可怜啊,连存pot的钱都没有,每天带着7,80万潜能到处跑
不下kill命令虽然安全点但是他会到处跑,只能另外想办法返回
所以我直接kill他,不想他到处跑,要么他死要么我死,结果被戳瞎了2次直接over

[ 本帖最后由 sghjjj 于 2009-6-20 05:39 PM 编辑 ]
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2009-6-20 17:40:07 | 显示全部楼层
n步一走,先大致找到范围,思路比一步一走高科技
但是,n一走在网络状况差的时候,容易被吃掉步子,一步一走都有被吃掉的时候
高科技思路,例外处理起来更繁复

有毅力作这么复杂的结构,厉害
admire sghjjj
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2009-6-20 17:48:43 | 显示全部楼层
原帖由 duno 于 2009-6-20 05:40 PM 发表
n步一走,先大致找到范围,思路比一步一走高科技
但是,n一走在网络状况差的时候,容易被吃掉步子,一步一走都有被吃掉的时候
高科技思路,例外处理起来更繁复

有毅力作这么复杂的结构,厉害
admire sghjjj

这个也好解决,如果遍历结束后没有回到中央广场,表示被吃掉步子了,有时候还会被阿善抓住,这个时候就quit,回到客店然后重新遍历一次
如果网络实在不好,每次都被吃掉步子,就玩不了了
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-28 01:33 AM , Processed in 0.009423 second(s), 12 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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