|
难得有北俠这么一个地方可以讨论机器, 更难得这里有很多高手, 有很多教程, 模版可供参考, 获益很多
我用mush做机器就是在北俠学会的, 感谢各路英雄
以下是我做地图的一些思路, 请各位高手指点
1. 地图需要实现的功能
a. 最基本的当然是无拘束的随意行走, 包括任意2点间最短路径, 任意一点为中心, 设定深度范围内遍历
b. goto指令, goto 房间id, goto 房间名字, goto npc名字, goto npc id, 任意给定参数都可以准确无误的抵达目的地.
2. 地图数据需包含的信息
建立数据的时候信息越多越好, 以便使用时候拆分成各种索引表, 比如 房间名字索引, npc名字索引等等, 方便查询
房间id是唯一的一个索引值, area是这个房间在什么区域, 区域可以自己定, 比如我这里将白驼山放入yz(扬州)区域- id = 1,
- name = "中央广场",
- desc= "房间描述ooxx",
- area = "yz",
- exits = "climb up:421,nw:5,enter:7,d:2,e:6,w:4,n:3,s:8",
- npcs = "流氓(Liu mang)|流氓头(Liumang tou)",
- mark = ""
复制代码 以上是一个正常的房间信息- id = 11,
- name = "客栈",
- area = "yz",
- desc= "房间描述ooxx",
- exits = "w:3,u:1014:blocked::none:give 1 gold to xiao er,e:26", //给钱就可以走u到1014房间
- npcs = "店小二(Xiao er)",
- mark = ""
- id = 883,
- name = "后门",
- desc= "房间描述ooxx",
- area = "yz",
- exits = "n:817,s:975:blocked:bt:trendb:门卫+门卫", // 白驼? -> 负神? -> 如都不满足, 杀门卫
- npcs = "门卫(Men wei)",
- mark = ""
复制代码 这2个是2种不同情况拦路的处理, 拦路分各种情况: 门派, 神值, npc, 特殊指令(比如开门), 程序自会根据不同设定情况做出不同的处理- id = 23,
- name = "北门",
- desc= "房间描述ooxx",
- area = "yz",
- exits = "s:9,n:44,w:45,e:53:oneway",
- npcs = "官兵(Guan bing)|武将(Wu jiang)|马超兴(Ma chaoxing)",
- mark = ""
复制代码 这里有个特殊出口, e:53:oneway, 表示e到达53号房间, 是单向路径, 无法返回, 程序计算路径的时候可以另外处理.
3. 各种路径的获取
我将一些相对独立的地方单独设置区域, 比如神龙岛, 桃花岛, 或者某些有明显入口的区域, 比如少林寺
中原地区连成一片的区域, 可以作为一个大区域, 也可以分成若干小区域来计算路径, 比如 扬州区, 华山派区, 等等.
计算路径的时候, 首选判断当前房间区域和目标房间区域是否一样, 如果不一样就调用区域路径走到目标区域某一个固定点, 然后计算这个固定点到目标房间的路径
路径的一些特殊情况处理
拦路: 根据不同的设置, 采取不同的方式, 比如 给钱的, 直接将 give xxx silver 加入路径, 比如 npc拦路的, 将npc按固定格式加入路径, 以便后续行走程序调用清拦路程序清除npc
最终形成的路径: e;e;s;s;e;give 50 silver to xiaoer;u 或者 w;w;s;门卫|门卫;s;s
行走程序会将路径按";"拆分后, 根据内容依次执行
单向: 表示不能返回, 在计算路径时候, 终点开始的那个循环, 如果碰到单向出口, 则略过. 而起点开始的那个循环, 则可以使用这个单向出口
这些都需要在地图数据中手动设置, 一次性的体力劳动, 问题不大.
a. 两点间的最短路径
这个貌似有很多算法, 由于我不是专业人士, 只能粗略了解下, 我目前采取的方式是 起点房间 和 终点房间 同时进行广度优先计算, 碰到相同id的房间, 表示路径计算成功
起始房间 -> 碰面房间的路径 + 终点房间 -> 碰面房间的反路径 = 起点到终点的路径
可以想象成在平静的水面, 起点 和 终点 同时扔下2块石头, 水波一层层的扩散, 最终交汇.
b.某点任意深度的遍历路径
这个略简单, 从这个点开始, 走所有出口, 出口房间深度+1, 碰到同名房间深度不变, 计算满设定的深度就行. 关于算法, 我觉得是深度优先比较好, 不用绕来绕去, 路径重复率较低
c. goto指令的各种参数
这个最简单, 只是根据各种不同参数, 通过各自的索引表, 最终指向到唯一的房间id, 然后计算两点间路径走过去就成了.
具体到任务, 比如我要杀武将, 会找到很多房间id,这些房间id作为一个列表, 依次行走, 直到发现武将.
4. 丢失位置信息后的处理, 以及确认行走成功的判断
这是我尚未完善的方面, 主要涉及到房间定位的问题
根据littleknife同学的建议, 目前对这方面有了比较清晰的想法
a. 确认行走是否成功
行走完成后, 判断当前房间名称, 描述, npc等等参数, 是否和目标房间匹配
行走过程中, 是否出现一定数量的错误信息, 比如"什么","这个方向没有出口"等等
b. 行走不成功重新定位,
也就是丢失了位置信息的情况下, 获取当前房间名字, 查询地图库获取匹配这个名字的所有房间id, 如不唯一, 继续比对房间描述, 出口信息, npc信息, 如还是不唯一, 随机走出口继续比对, 极端情况下, 比如掉到坑里, 陷阱, 未知区域, 被外星人抓走, 只能quit重连.
北大侠客行MUD,中国最好的MUD |
|