北大侠客行MUD论坛

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

新手求教PATH路径搜索

[复制链接]
发表于 2020-12-10 15:50:00 | 显示全部楼层 |阅读模式
以下是我借用的路径搜索
function is_number(c_name)

        local x,y=string.find(c_name,".*");
        for x=1,y do
                local b=string.byte(string.sub(c_name,x,x));
                if ((b<48) or (b>57)) then
                        return false;
                end
        end
        return true;
end

temp_slow_path_table={};
function fill_slow_path(path_name)
        local i,v = string.find(path_dir_bianli_table[path_name],".*");
        while i<=v  do
                if is_number(string.sub(path_dir_bianli_table[path_name],i,i+1)) then
                        for j=1,string.sub(path_dir_bianli_table[path_name],i,i+1) do

                                if nil~= path_dir_table[string.sub(path_dir_bianli_table[path_name], i+2, i+2)] then
                                        table.insert(temp_slow_path_table, path_dir_table[string.sub(path_dir_bianli_table[path_name], i+2, i+2)].cmd);
                                else
                                        table.insert(temp_slow_path_table, string.sub(path_dir_bianli_table[path_name], i+2, i+2));
                                end
                        end
                        i=i+3;
                elseif is_number(string.sub(path_dir_bianli_table[path_name], i, i)) then
                        for j=1,string.sub(path_dir_bianli_table[path_name],i,i) do
                                if nil~= path_dir_table[string.sub(path_dir_bianli_table[path_name],i+1,i+1)] then
                                        table.insert(temp_slow_path_table, path_dir_table[string.sub(path_dir_bianli_table[path_name],i+1,i+1)].cmd);
                                else
                                        table.insert(temp_slow_path_table, string.sub(path_dir_bianli_table[path_name],i+1,i+1));
                                end
                        end
                        i=i+2;
                else
                        if nil~= path_dir_table[string.sub(path_dir_bianli_table[path_name], i, i)] then
                                table.insert(temp_slow_path_table, path_dir_table[string.sub(path_dir_bianli_table[path_name], i, i)].cmd);
                        else
                                table.insert(temp_slow_path_table, string.sub(path_dir_bianli_table[path_name], i, i));
                        end
                        i=i+1;
                end
        end
end

function slow_path(path_name, time_wait)
        if nil~= path_dir_bianli_table[path_name] then
                fill_slow_path(path_name);
                slow_path_thread=coroutine.create(function ()
                        for i,v in ipairs(temp_slow_path_table) do
                                world.DoAfterSpecial(time_wait, "slow_auto_next();",12);
                                coroutine.yield();
                                world.Send(v);
                        end
                end);
                coroutine.resume(slow_path_thread);
        else
                Note("你有这个搜索路径么");
        end
end
slow_state=0;
function slow_pause()
        slow_stat=1;
end
function slow_resume()
        slow_stat=0;
        slow_auto_next();
end
function slow_auto_next()
        if slow_state==0 then
                coroutine.resume(slow_path_thread);
        end
end

function slow_path_Init()
        world.AddAlias("al_slow_path","^\\#slow (.*?) (.*?)$",
                                "slow_path(\"%1\",%2);",
                                alias_flag.Enabled + alias_flag.Replace + alias_flag.RegularExpression,
                                "");
        world.SetAliasOption("al_slow_path", "send_to", "12");
end

按照maper大哥的调用function slow_path(path_name, time_wait)函数使用,
我发现我遍历一个地方后,需要遍历第二的地方,会先遍历第一个地方再遍历我选择的地点,是不是代码哪里有问题哦?还是需要改变哪个参数让遍历重置
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2020-12-10 17:41:25 | 显示全部楼层
temp_slow_path_table={}; 这个估计需要清一下
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2020-12-10 23:17:24 | 显示全部楼层
本帖最后由 dengtaliyi 于 2020-12-10 11:27 PM 编辑

还有两个问题:
1、world.AddAlias("al_slow_path","^\\#slow (.*?) (.*?)$", 这一句报错为空,完全不懂怎么修改
2、调用function slow_path(path_name, time_wait)函数,可以一次连续遍历1个以上path_name吗?或者一次连续遍历所有
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2020-12-12 14:54:12 | 显示全部楼层
1、temp_slow_path_table={}这个语句要放入到函数function fill_slow_path(path_name)之中,这样每次执行都会初始化一下。
2、world.AddAlias这一段语句,从语法上看并没有什么问题,你说的报错为空不知道是啥意思。这一段语句的作用是增加了一个alias,用法是在命令行输入“#slow yangzhou 1”,以1秒钟一步的速度遍历扬州地图。当然我只是用yangzhou举个例子,关于第一个参数path_name是需要符合其它代码的要求,得是path_dir_bianli_table中的键值。
3、function slow_path(path_name, time_wait)函数根据你提供的代码部分看,一次只能遍历一个path_name,如果需要遍历多个地点,需要再编写外部的嵌套函数来调用slow_path()。也可以加一个判定,如果传入的参数path_name是table的话,就将table中每一个值进行 fill_slow_path操作,最后拼成一个大的table来替代temp_slow_path_table,再执行后面的遍历操作。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2020-12-13 10:35:53 | 显示全部楼层
非常感谢,学习,继续学习
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2020-12-13 13:27:00 | 显示全部楼层
本帖最后由 dengtaliyi 于 2020-12-13 01:28 PM 编辑

@nrm 我使用上面代码在遍历一个区域后需要过河、坐船,如果我开始设定的time_wait为0.3秒,过河需要5秒时间,这种情况怎么处理呢?就是您说的外部嵌套吗?,能提供一个例子作参考吗?非常感谢
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2020-12-14 14:30:30 | 显示全部楼层
dengtaliyi 发表于 2020-12-13 01:27 PM
@nrm 我使用上面代码在遍历一个区域后需要过河、坐船,如果我开始设定的time_wait为0.3秒,过河需要5秒时间 ...


过河的时候停掉行走的部分,下船的消息触发继续行走机器人,过河不单是5秒的问题,可能要等船,时间是不确定的
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2020-12-16 18:45:19 | 显示全部楼层
是的
过河,坐车等都是用触发来暂停
结束之后再继续走路。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2020-12-19 11:11:37 | 显示全部楼层
本帖最后由 dengtaliyi 于 2020-12-19 11:30 AM 编辑

还有几个问题请教大家:
1、请教我上面的代码 slow_state=1 slow_state=0 是暂停、开启命令吗?

2、还有以下推车遍历代码能插入暂停吗?我现在停止靠的是关闭房间入口触发,老走过头
function bianli()------走路家伙
    if lj == nil  then
        lj = GetVariable("lj")
        lj = Split(lj, ";")
        print("lj = zhfxlj(lj)")
        lj = zhfxlj(lj)
        end
        ---print("lj变量:",table.concat(lj,";"))
        local i=tonumber(GetVariable("bianli_i"))-------bianli_i是个计数器,表明现在走到数组的哪一个元素了。

           if tonumber(GetVariable("hubiao"))==1 then ------------hubiao个作为一个标志:如果为1就表明现在不带着镖车走,如果为0就得带着镖车走。
                   if lj[tonumber(GetVariable("bianli_i"))]==nil then Note("已经走完了,还走个屁啊") return end -------数组遍历完成之后就不要遍历了再
                   local s1="当前行走段一共"..tostring(table.getn(lj)).."步,现在为 第"..GetVariable("bianli_i").."步"..",当前命令:"..lj
                   Note(s1)---------以上两行是用来提醒自己的。
                   Execute(lj)------这才是行走的命令
           elseif tonumber(GetVariable("hubiao"))==0 then
                   if lj[tonumber(GetVariable("bianli_i"))]==nil then Note("已经走完了,还走个屁啊") return end

                   local s1="当前行走段一共"..tostring(table.getn(lj)).."步,现在为 第"..GetVariable("bianli_i").."步"..",当前命令:"..lj
                   Note(s1)
                   Execute("gan che to "..lj..";xixi")
           end
    end

3、我发觉遍历老走过头,如果坐船的情况,上船后多走了几步暂停,下船后继续走路会发生错误,而且上下船对遍历回到起点也有影响,这种情况怎么处理哦
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2020-12-25 07:40:59 | 显示全部楼层
上船的时候把遍历步数减一。我碰到被石头绊倒,就是先停遍历,然后步数减一,几秒之后再开始遍历。应该同样道理吧
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 10:32 AM , Processed in 0.010167 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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