本帖最后由 pavo 于 2019-1-29 04:35 PM 编辑
由于历次看大佬的机器人。。都是一头雾水。。完全看不懂(扶额
刚好有空(放假啦啦啦啦),于是反方向,直接从头开始研究看看。。
以下是咸鱼玩家放假第一天的,什么扩充功能都没考虑的,什么复杂语句都不会用的,连函数都没打包的,注释超多的,路径计算实验(做到一半才知道这思路学名叫dijkstra算法。。59年就被提出了。。顺便作为来自外行的一甲子纪念吧就算。。),供鲜鱼参考&请大佬指教&备忘。。- --walk连接
- Start = 1 --测试用起点
- Target = 10 --测试用终点
- Path = {} --最短路径
- PathReverse = {} --最短路径倒序
- walkPath = {} --到各节点最短路径的上一节点
- Distance = {} --起点到各节点的距离
- nodeNum = 10 --节点数量
- nodeList = {} --节点表
- nodeList[1] = {} --节点中文名
- nodeList[2] = {} --节点英文名
- nodeList[3] = {} --节点计算标记
- nodeList[1][1] = "古墓派"
- nodeList[2][1] = "gumu"
- nodeList[1][2] = "全真派"
- nodeList[2][2] = "quanzhen"
- nodeList[1][3] = "华山村"
- nodeList[2][3] = "huashancun"
- nodeList[1][4] = "华山派"
- nodeList[2][4] = "huashan"
- nodeList[1][5] = "南阳"
- nodeList[2][5] = "nanyang"
- nodeList[1][6] = "洛阳"
- nodeList[2][6] = "luoyang"
- nodeList[1][7] = "襄阳"
- nodeList[2][7] = "xiangyang"
- nodeList[1][8] = "许昌"
- nodeList[2][8] = "xuchang"
- nodeList[1][9] = "长安"
- nodeList[2][9] = "changan"
- nodeList[1][10] = "麒麟村"
- nodeList[2][10] = "qilincun"
- walkList = {}
- for i=1,nodeNum,1
- do
- nodeList[3][i] = 0 --初始化节点计算标记
- walkPath[i] = 0 --初始化路径
- walkList[i] = {} --节点i,j间的距离表
- for j=1,nodeNum,1
- do
- walkList[i][j] = 10000 --初始化节点间的距离,应为无穷大(也就是不相连),用10000凑合一下
- end
- end
- walkList[1][2] = 19
- walkList[2][1] = 19
- walkList[2][3] = 11
- walkList[3][2] = 11
- walkList[3][4] = 8
- walkList[3][5] = 6
- walkList[4][3] = 8
- walkList[5][3] = 6
- walkList[5][6] = 7
- walkList[5][7] = 7
- walkList[5][8] = 2
- walkList[6][5] = 7
- walkList[6][9] = 12
- walkList[6][10] = 13 --刚记录到洛阳。。这么记录也是个坑。。不过只是学习也无所谓,提高效率是以后的问题。。
- walkList[7][5] = 7
- walkList[8][5] = 2
- walkList[9][6] = 12
- walkList[10][6] = 13
- --计算起点
- for i = 1,nodeNum,1
- do
- Distance[i] = walkList[Start][i] --更新起点到节点i的距离
- end
- Distance[Start] = 0 --起点到起点的距离当然为0,而不是无穷大
- nodeList[3][Start] = 1 --标记起点为已计算
- --计算其它节点
- for i = 1,nodeNum,1 --每次循环计算一个节点
- do
- LastPassDistance = 10000 --初始化,无穷大再用10000凑合凑合
- for j = 1,nodeNum,1
- do
- if Distance[j] < LastPassDistance and nodeList[3][j] == 0 --选取与已计算区域相连,且,在节点表中顺序最靠前的一个未计算节点
- then
- LastPass = j --取该点为LastPass,可能成为最短路径上的最后一个中途节点
- LastPassDistance = Distance[j] --取起点到该节点的距离
- break
- end
- end
- nodeList[3][LastPass] = 1 --标记该点为已计算
- for j = 1,nodeNum,1
- do
- if LastPassDistance + walkList[LastPass][j] < Distance[j] --如果从起点经过该节点到节点j的距离,比原来从起点到节点j的距离近
- then --那么该节点为新最短路径上的最后一个中途节点
- Distance[j] = LastPassDistance + walkList[LastPass][j] --更新起点到节点j的距离
- walkPath[j] = LastPass --用walkPath[j]记录,从起点到j,现有最短路径上的最后一个中途节点LastPass
- end
- end
- end
- --获得逆序路径PathReverse
- PathReverse[1] = Target --逆序路径第一个当然是终点
- i = 2
- while walkPath[Target] ~= 0
- do
- PathReverse[i] = walkPath[Target] --逐个累加,最短路径上的最后一个中途节点walkPath[Target]
- Target=walkPath[Target]
- i = i + 1
- end
- --获得路径Path
- for i=1,#PathReverse,1
- do
- Path[i] = PathReverse[#PathReverse+1-i] --获得路径
- Note(Path[i]) --丢进脚本测试输出
- end
复制代码 北大侠客行MUD,中国最好的MUD |