dniao 发表于 2011-10-17 22:44:19

求解析path_bianli_lib.lua

yct43谁帮我翻译下这个文件,主要是算法有点看不懂。。。会用,但是功能太少了,我想自己加点东西进去 path_dir_bianli_table={
        ["path_dl"]="wtlkwenssnjnwnsenhehlnnsjkewlhswlseetjhnehkesklgwwsgeensstgsnwenwswweeeewnssnwsweeudwswswenntwnsegseenssnwspllhnhntgslshiswwntnswuwtgeetgetgwwdegseeselelhwhw6n",
       
}

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,".*");--匹配表中的字符串,i为字符串的起始位置,v为结束位置
        while i<=vdo
                if is_number(string.sub(path_dir_bianli_table,i,i+1)) then
                --如果is_number()为true,但括号里的内容有点不理解,怎么成为is_number的参数
               
                        for j=1,string.sub(path_dir_bianli_table,i,i+1) do--string.sub返回的是什么值?

                                if nil~= path_dir_table, i+2, i+2)] then
                                        table.insert(temp_slow_path_table, path_dir_table, i+2, i+2)].cmd);
                                        --将当前获取的一个字符串所表示的cmd值存入temp_slow_path_table中
                                else
                                        table.insert(temp_slow_path_table, string.sub(path_dir_bianli_table, i+2, i+2));
                                        --将当前获取的一个字符串存入temp_slow_path_table
                                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 ()--coroutine.create创建一个协同程序
                        for i,v in ipairs(temp_slow_path_table) do--遍历表
                world.DoAfterSpecial(time_wait, "slow_auto_next();",12);--n秒之后继续执行slow_path_thread
                                coroutine.yield();--程序被挂起,暂停运行
                                world.Send(v);
                        end
                end);
                coroutine.resume(slow_path_thread);--从yeild处开始继续执行else
                Note("你有这个搜索路径么");end endfunction slow_auto_next() if slow_state==0 then coroutine.resume(slow_path_thread); endend

[ 本帖最后由 aiccybb 于 2011-10-18 04:10 PM 编辑 ]

dniao 发表于 2011-10-17 23:54:22

sigh。。。yct42来个人交流下吧。。。这是好东西啊

littleknife 发表于 2011-10-18 07:10:35

回复 2楼 的帖子

这是一个线性遍历库,它的作用是根据zmud录制的路线,按照一定的路线遍历最后返回出发点。
1、这个库是一个早期的库,现在要是用估计得修改不少内容。但是确实是一个不错的学习材料(早期的城际互联就是参考这个代码)。
2、它的暂停机制有时候会失灵。
3、这里有zmud录制的遍历路线转换为一般路线函数,可是缺少一般的zmud路线转换为遍历路线的函数。即遍历路线的形成必须进入zmud中自己录制才可以。

pizzagoo 发表于 2011-10-18 08:32:06

我的明教新手机器人就用了这个,不过发现有个bug,有个table在赋值的时候没有初始化以下,会造成循环遍历。

littleknife 发表于 2011-10-18 10:10:16

城际互联脚本模式是提供这种慢速行走的。
比如你有个zmud的路线:#3 e;n;ne;w;nu;nd;e;se;sw
可以定义path="#3 e;n;ne;w;nu;nd;e;se;sw"
然后wait_step=-1 do_walkgo(path,1)即是以每1秒走一步的方式,慢速行走。

[ 本帖最后由 littleknife 于 2011-10-18 10:16 AM 编辑 ]

dniao 发表于 2011-10-18 10:49:57

原帖由 pizzagoo 于 2011-10-18 08:32 发表 http://pkuxkx.com/forum/images/common/back.gif
我的明教新手机器人就用了这个,不过发现有个bug,有个table在赋值的时候没有初始化以下,会造成循环遍历。
对,初始化是个问题。。。

dniao 发表于 2011-10-18 10:53:30

原帖由 littleknife 于 2011-10-18 10:10 发表 http://pkuxkx.com/forum/images/common/back.gif城际互联脚本模式是提供这种慢速行走的。比如你有个zmud的路线:#3 e;n;ne;w;nu;nd;e;se;sw可以定义path="#3 e;n;ne;w;nu;nd;e;se;sw"然后wait_step=-1 do_walkgo(path,1)即是以每1秒走一步的方式,慢速行走。 我去看看do_walkgo()函数,其实我是想加入个后退一步的功能。这个lua路径主要是用到了一个模式匹配函数,我去lua程序设计里面找到了。暂时还不会用。。。

[ 本帖最后由 aiccybb 于 2011-10-18 11:11 AM 编辑 ]

dniao 发表于 2011-10-18 12:41:17

原帖由 pizzagoo 于 2011-10-18 08:32 发表 http://pkuxkx.com/forum/images/common/back.gif
我的明教新手机器人就用了这个,不过发现有个bug,有个table在赋值的时候没有初始化以下,会造成循环遍历。 temp_slow_path_table={}
要把这个表的内容清空yct13
用value=table.remove(temp_slow_path_table)来清除。。
不知道有没有弄错yct27
页: [1]
查看完整版本: 求解析path_bianli_lib.lua