找回密码
 注册
搜索
查看: 2746|回复: 88

mush路径构建的核心哪位大神给解读一下

[复制链接]
门派:古墓派
发表于 2017-4-26 13:16:53 | 显示全部楼层 |阅读模式
List = {}
--创建链表
function List.new(val)
        return {pnext = nil, index=val}
end
--添加一个节点
function List.addNode(nodeParent, nodeChild)
    nodeChild.pnext = nodeParent.pnext
    nodeParent.pnext = nodeChild
    return nodeChild
end
function searchPre()
    road.rooms={}
    --print(road.id)
    --if road.id =='sld/xiaolu' or road.id =='sld/haitan' then map.rooms["sld/haitan"].ways["#toSld"]=nil end
    if string.find(road.id,'sld') then map.rooms["sld/lgxroom"].ways["#outSld"]=nil end
        local p_room = map.rooms[road.id].name
        local p_dest = getLookCity(road.id)
        local l_distance = 6
  if job.name and (job.name=="clb" or job.name=='tdh' or job.name=='tmonk') and flag.times==1 then
           l_distance = 2
        end
        if job.name and job.name=='xueshan' and flag.times==1 then
       l_distance = 3
  end
        if p_dest==nil then
           p_dest=job.area
        end
    local rooms = getAroundRooms(p_room,p_dest,l_distance,'all')
        roomsnum=countTab(rooms)
        --构造邻接表,用于递归搜索
        --插入起始road.id
        starttime=os.clock() --测试计算时间
        newrooms = {}
        for id in pairs(rooms) do
                        table.insert(newrooms,id)
        end

        myrt={}
       
        for _,roomid in pairs(newrooms) do --插入房间链表
                        roomV = List.new(roomid)
                        local node = roomV
                        for k,v in pairs(newrooms) do --所有的房间id
                                for route,link_way in pairs(map.rooms[roomid].ways) do  --当前id的出口
                                        local routeLength = map.rooms[roomid]:length(route) --获取路径方向是否可达,返回false标示此路不通,那么这个方向的路就不插入出口链表
                                        if routeLength then
                                                if v==link_way then
                                                        node = List.addNode(node,List.new(k)) --插入节点生成第一个房间的出口链表
                                                end
                                        end
                                end
                        end
                        table.insert(myrt,roomV)
        end
        visited={}
        for i=1 ,countTab(newrooms) do
                visited[i]=false --初始化所有节点未曾访问
        end
        if not visited[1] then
                FastDFS(myrt,1) --计算起点的连通图
        end
        for i=1 ,countTab(newrooms) do
                if visited[i]==false then--未曾访问的节点测试一下跟第一个起点的连通性,如果能联通,则递归这个节点
                        local path, len = map:getPath(myrt[1].index,myrt[i].index)
                        if path then
                                FastDFS(myrt,i) --继续遍历指定的myrt[i]这个节点
                                messageShow("发现通路,遍历下一个节点!","red")
                        end
                end
        end
        --messageShow("【"..job.name.."】深度优先计算结束,遍历【"..roomsnum.."】个房间,用时【"..os.clock()-starttime.."】秒","SandyBrown")
end
function FastDFS(myrt,i)
        visited[i] = true          --设置下标为I的顶点为已访问  
    --Note(myrt[i].index)  --输出顶点信息
    table.insert(road.rooms,myrt[i].index)
        local p = myrt[i].pnext --下一个边表结点  
        if p==nil then return end
    while p~=nil do   
      
        if(not visited[p.index]) then--如果是未访问的则递归
                        visited[p.index]=true
            FastDFS(myrt,p.index)
                end
        p = p.pnext
               
    end  
end
门派:不明
发表于 2017-4-26 13:29:31 | 显示全部楼层
这个看着确实头大。没解释,看不明白啊。
门派:桃花岛
发表于 2017-4-26 15:41:21 | 显示全部楼层
确实不懂这个,坐等大神吧
门派:少林派
发表于 2017-4-26 16:31:07 | 显示全部楼层
风起云涌大神你自己就是好大的大神了
门派:少林派
发表于 2017-4-26 16:32:09 | 显示全部楼层
这个根本表示我就看不懂在说啥啊                           
门派:古墓派
 楼主| 发表于 2017-4-26 16:35:12 | 显示全部楼层
woshicy@tj 发表于 2017-4-26 16:32
这个根本表示我就看不懂在说啥啊

我也摸不透怎么建表啊,打算优化下明教紫衫林别像现在似的去个长廊练武场总先去林子里找半天。
没看懂这个想不出好办法优化。。
门派:姑苏慕容
发表于 2017-4-26 18:51:45 | 显示全部楼层
本帖最后由 faint@tj 于 2017-4-26 18:55 编辑

这个是无向图深度递归搜索的lua实现,主要用于在npc搜索上。
具体的数据结构可以看这个http://blog.csdn.net/jnu_simba/article/details/8866844
目的就是不要乱走,按一定顺序并且尽量少走重复房间。

其中一部分是构造邻接表,用于计算,关于邻接表请看:http://jingyan.baidu.com/article/fec7a1e50de9551190b4e7bb.html
另一部分是递归搜索,使用的是深度优先搜索。

其中复杂的部分可能是关于表的结构,使用的是指针结构来构造表。
门派:古墓派
 楼主| 发表于 2017-4-26 18:53:05 | 显示全部楼层
faint@tj 发表于 2017-4-26 18:51
这个是无向图深度递归搜索的lua实现,主要用于在npc搜索上。
具体的数据结构可以看这个http://blog.csdn.n ...

昏神威武,我去那个链接看看。
门派:姑苏慕容
发表于 2017-4-26 19:11:46 | 显示全部楼层
fqyy@tj 发表于 2017-4-26 16:35
我也摸不透怎么建表啊,打算优化下明教紫衫林别像现在似的去个长廊练武场总先去林子里找半天。
没看懂这 ...

明教紫衫林用纯粹的触发方式能更快一些
门派:天龙寺
发表于 2017-4-26 20:52:35 | 显示全部楼层
fqyy@tj 发表于 2017-4-26 16:35
我也摸不透怎么建表啊,打算优化下明教紫衫林别像现在似的去个长廊练武场总先去林子里找半天。
没看懂这 ...

明教一个简单的解决办法是:如果任务地点不等于*字门,和紫杉林,第一遍搜索的时候,把四旗的出口封闭,找不到npc,第二遍搜索的时候再打开那几个出口
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|书剑永恒MUD ( 闽ICP备14012032号|闽公网安备 35050202000162号 )

GMT+8, 2025-6-16 06:32 , Processed in 0.039802 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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