dengtaliyi 发表于 2020-12-10 15:50:00

新手求教PATH路径搜索

以下是我借用的路径搜索
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,".*");
        while i<=vdo
                if is_number(string.sub(path_dir_bianli_table,i,i+1)) then
                        for j=1,string.sub(path_dir_bianli_table,i,i+1) do

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

function slow_path(path_name, time_wait)
        if nil~= path_dir_bianli_table 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)函数使用,
我发现我遍历一个地方后,需要遍历第二的地方,会先遍历第一个地方再遍历我选择的地点,是不是代码哪里有问题哦?还是需要改变哪个参数让遍历重置

falun 发表于 2020-12-10 17:41:25

temp_slow_path_table={}; 这个估计需要清一下

dengtaliyi 发表于 2020-12-10 23:17:24

本帖最后由 dengtaliyi 于 2020-12-10 11:27 PM 编辑

还有两个问题:
1、world.AddAlias("al_slow_path","^\\#slow (.*?) (.*?)$", 这一句报错为空,完全不懂怎么修改{:7_276:}
2、调用function slow_path(path_name, time_wait)函数,可以一次连续遍历1个以上path_name吗?或者一次连续遍历所有

nrm 发表于 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,再执行后面的遍历操作。

dengtaliyi 发表于 2020-12-13 10:35:53

非常感谢,学习,继续学习

dengtaliyi 发表于 2020-12-13 13:27:00

本帖最后由 dengtaliyi 于 2020-12-13 01:28 PM 编辑

@nrm 我使用上面代码在遍历一个区域后需要过河、坐船,如果我开始设定的time_wait为0.3秒,过河需要5秒时间,这种情况怎么处理呢?就是您说的外部嵌套吗?,能提供一个例子作参考吗?非常感谢

falun 发表于 2020-12-14 14:30:30

dengtaliyi 发表于 2020-12-13 01:27 PM
@nrm 我使用上面代码在遍历一个区域后需要过河、坐船,如果我开始设定的time_wait为0.3秒,过河需要5秒时间 ...

过河的时候停掉行走的部分,下船的消息触发继续行走机器人,过河不单是5秒的问题,可能要等船,时间是不确定的

nrm 发表于 2020-12-16 18:45:19

是的
过河,坐车等都是用触发来暂停
结束之后再继续走路。

dengtaliyi 发表于 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 == nilthen
        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==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==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、我发觉遍历老走过头,如果坐船的情况,上船后多走了几步暂停,下船后继续走路会发生错误,而且上下船对遍历回到起点也有影响,这种情况怎么处理哦

bigb 发表于 2020-12-25 07:40:59

上船的时候把遍历步数减一。我碰到被石头绊倒,就是先停遍历,然后步数减一,几秒之后再开始遍历。应该同样道理吧
页: [1] 2
查看完整版本: 新手求教PATH路径搜索