北大侠客行MUD论坛

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

【新人向】实用型mud路径计算器(mapper)

[复制链接]
发表于 2022-10-7 13:50:46 | 显示全部楼层 |阅读模式
mapper是mud中一个非常常用,基础的功能。

我把我hellclient中的路径计算模块翻译成了lua5.1可用版本,供大家参考和使用。

github地址:

https://github.com/hellclient-scripts/mudmapper.lua

主要功能包括

  • 寻找起点和多个终点之间的最近路径。
  • 支持不同房间出口的步长,比如粘鼠板可以设置更长的步长参与计算
  • 支持标签,可以设置有具体标签或没有具体标签才能使用某出口。常见标签如门派,长袖2,正气,轻功等级,性别等。
  • 支持飞行路径。这个北侠用出不大。典型如新人的travel,可以从任意地点前往指定目标


附带一个利用特性1,能够使用标签进行动态计算的动态遍历路径生成器。

注意,由于mud现在属于客户端性能压制状态,代码都没有做性能优化。

具体的使用demo如下

  1. -- 格式化输出路径列表
  2. function Dumpsteps(path)
  3.     if path==nil then
  4.         return "nil"
  5.     end
  6.     local count=#path
  7.     local commnds={}
  8.     local delay=0
  9.     local to=path[#path].to
  10.     local from=path[1].from
  11.     local result=""
  12.     for i,v in pairs(path) do
  13.         table.insert(commnds,v.command)
  14.         delay=delay+v.delay
  15.     end
  16.     result=result.."count:"..count..","
  17.     result=result.."from:"..from..","
  18.     result=result.."to:"..to..","
  19.     result=result.."commands:"..table.concat(commnds,";")..","
  20.     result=result.."delay:"..delay..","
  21.     return result
  22. end

  23. local Mapper=require "mapper"

  24. -- 新建mapper实例
  25. local m=Mapper.newmapper()
  26. -- 初始化房间
  27. m:setroomname("shanghai","上海")
  28. m:setroomname("beijing","北京")
  29. m:setroomname("hangzhou","杭州")
  30. m:setroomname("ningbo","宁波")
  31. m:setroomname("xiaoxianchen1","小县城")
  32. m:setroomname("xiaoxianchen2","小县城")
  33. m:setroomname("xiaoxianchen3","小县城")

  34. local paths={
  35.     {from="shanghai",to="beijing",command="坐火车"},
  36.     {from="beijing",to="shanghai",command="坐火车回"},
  37.     {from="hangzhou",to="shanghai",command="坐汽车",excludetags={yunche=true}},
  38.     {from="shanghai",to="hangzhou",command="坐汽车回",excludetags={yunche=true}},
  39.     {from="hangzhou",to="beijing",command="坐飞机",tags={rich=true}},
  40.     {from="beijing",to="hangzhou",command="坐飞机回",tags={rich=true}},
  41.     {from="hangzhou",to="shanghai",command="骑自行车",delay=10},
  42.     {from="shanghai",to="hangzhou",command="骑自行车回",delay=10},
  43.     {from="ningbo",to="shanghai",command="骑自行车2",delay=10},
  44.     {from="shanghai",to="ningbo",command="骑自行车回2",delay=10},

  45. }

  46. -- 引入飞行路径
  47. local path=Mapper.newpath()
  48. path.command="包车"
  49. path.to="beijing"
  50. m:setflylist({path})


  51. for i,v in ipairs(paths) do
  52.     local path=Mapper.newpath()
  53.     path.from=v.from or ""
  54.     path.to=v.to or ""
  55.     path.command=v.command or ""
  56.     path.delay=v.delay or 0
  57.     path.tags=v.tags or {}
  58.     path.excludetags=v.excludetags or {}
  59.     m:addpath(path.from,path)
  60. end

  61. -- 获取hangzhou的可用出口,没有rich坐飞机不可用
  62. -- 2
  63. print(#m:getexits("hangzhou"))
  64. -- 获取hangzhou的全部出口
  65. -- 3
  66. print(#m:getexits("hangzhou",true))
  67. -- 获取shanghai的房间名
  68. -- 上海
  69. print(m:getroomname("shanghai"))
  70. -- 获取不存在的newyork房间
  71. -- ""
  72. print(m:getroomname("newyork"))
  73. -- 获取房间名为上海的房间
  74. -- shanghai
  75. print(table.concat(m:getroomid("上海"),","))
  76. -- 获取房间名为纽约的房间
  77. -- ""
  78. print(table.concat(m:getroomid("纽约"),","))
  79. -- 获取房间名为小县城的房间
  80. -- xiaoxianchen3,xiaoxianchen2,xiaoxianchen1
  81. print(table.concat(m:getroomid("小县城"),","))
  82. -- 获取shanghai到beijing的路径
  83. -- count:1,from:shanghai,to:beijing,commands:坐火车,delay:1,
  84. print(Dumpsteps(m:getpath("shanghai",false,{"beijing"})))
  85. -- 获取hangzhou到beijing的路径,经过shanghai
  86. -- count:2,from:hangzhou,to:beijing,commands:坐汽车;坐火车,delay:2,
  87. print(Dumpsteps(m:getpath("hangzhou",false,{"beijing"})))
  88. -- 开启飞行列表
  89. -- count:1,from:hangzhou,to:beijing,commands:包车,delay:1,
  90. print(Dumpsteps(m:getpath("hangzhou",true,{"beijing"})))
  91. -- 不存在的起点
  92. -- nil
  93. print(Dumpsteps(m:getpath("newyork",false,{"beijing"})))
  94. -- 不存在的终点
  95. -- nil
  96. print(Dumpsteps(m:getpath("shanghai",false,{"newyork"})))
  97. -- 终点中包含不可用房间
  98. -- count:1,from:shanghai,to:beijing,commands:坐火车,delay:1,
  99. print(Dumpsteps(m:getpath("shanghai",false,{"newyork","beijing"})))
  100. -- 设置rich标签
  101. m:settag("rich",true)
  102. -- 有钱,所以坐飞机
  103. -- count:1,from:hangzhou,to:beijing,commands:坐飞机,delay:1,
  104. print(Dumpsteps(m:getpath("hangzhou",false,{"beijing"})))
  105. -- 重置标签
  106. m:flashtags()
  107. -- 不晕车,可以做汽车
  108. -- count:1,from:hangzhou,to:shanghai,commands:坐汽车,delay:1,
  109. print(Dumpsteps(m:getpath("hangzhou",false,{"shanghai"})))
  110. -- 阿,晕车了
  111. m:settag("yunche",1)
  112. -- 晕车了,只能骑自行车
  113. -- count:1,from:hangzhou,to:shanghai,commands:骑自行车,delay:10,
  114. print(Dumpsteps(m:getpath("hangzhou",false,{"shanghai"})))
  115. -- 重置标签
  116. m:flashtags()
  117. -- 宁波去杭州,多条路线找delay最短的
  118. -- count:2,from:ningbo,to:hangzhou,commands:骑自行车2;坐汽车回,delay:11,
  119. print(Dumpsteps(m:getpath("ningbo",false,{"hangzhou"})))
  120. -- 宁波就近去beijing或者hangzhou,杭州近
  121. -- count:2,from:ningbo,to:beijing,commands:骑自行车2;坐火车,delay:11,
  122. print(Dumpsteps(m:getpath("ningbo",false,{"beijing","hangzhou"})))

  123. -- 动态遍历房间
  124. local result=m:walkall({"shanghai","beijing","ningbo","hangzhou","xiaoxianchen1","xiaoxianchen2","xiaoxianchen3"},0)
  125. -- 遍历成功的房间
  126. -- shanghai,beijing,hangzhou,ningbo
  127. print(table.concat(result.walked,","))
  128. -- 遍历失败的房间
  129. print(table.concat(result.notwalked,","))
  130. -- 遍历路径
  131. -- count:5,from:shanghai,to:ningbo,commands:坐火车;坐火车回;坐汽车回;坐汽车;骑自行车回2,delay:14,
  132. print(Dumpsteps(result.steps))

  133. m:flashtags()
  134. -- 打印起效标签
  135. -- ""
  136. print(table.concat(m:alltags(),","))
  137. -- 批量添加标签
  138. m:addtags({"tag1","tag2","tag3","tag1"})
  139. -- 打印起效标签
  140. -- tag3,tag1,tag2
  141. print(table.concat(m:alltags(),","))
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2022-10-7 13:55:58 | 显示全部楼层
注意,动态遍历本质是多次多点walk

只能说的确能实现遍历效果,但实际效率肯定不如预录遍历路径
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2022-10-7 16:59:08 | 显示全部楼层
感谢分享,希望能多些通俗的理论阐述
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2022-10-7 17:22:11 | 显示全部楼层
这叫新人向?新人现在这么变态了吗?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2022-10-7 17:53:50 | 显示全部楼层
icer 发表于 2022-10-7 05:22 PM
这叫新人向?新人现在这么变态了吗?

在杰佬眼里,比他弱的都叫新人
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
回复 支持 0 反对 1

使用道具 举报

发表于 2022-10-19 02:36:47 | 显示全部楼层
我不配做新人
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 05:50 AM , Processed in 0.009685 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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