以下为过程中的一些心得:
1 . 探索地图和使用已经被证明是正确的地图是完全两回事,探索过程中进入任何房间即使所有信息一致,也得证明它是新房间还是已经探明的房间。
2. 房间之间的连接不全都是互逆的,有些出口是单向的。
3. 房间允许看向四周获得信息,这些信息对辅助定位非常重要。把这些可以获得的信息整合到一起,用特定顺序组织后转换为哈希码,作为该房间的身份签名(signature),这个签名有不同的等级,可分为房间名、房间描述+出口、周围房间名+出口、周围房间名+描述+出口,房间签名用于比对两个房间是不是同一个房间。
4. 有些房间并非一成不变的,它可以自己随机变化,比如:骰子房,房间描述随着骰子的变化在不停的变化;有些房间描述会因为玩家的互动而变化。
5. 有些地图中的结构完全对称,即有些房间不但自身签名完全一致而且它周围房间的签名也完全一致,要探索很远才能确定它是哪一个。
6. 有些房间进入需要特定条件或被npc拦截,不过这个基于pymud的命令很好解决。
7. 迷宫内的房间和常规房间完全不同的逻辑,要提前提取迷宫入口特征,把对应的入口识别出来在代码中封住。
8. 深度优先排重需要角色可以回到备选房间,如果附近有单向出口,导致回溯失败会从而测绘出错。
9. 探索过程中对于可通过的连接,必须保证100%可以执行成功,这是探索地图的基石。
10. 如果对游戏了解,知道某些房间是独一无二的,即一旦进入就知道自己的位置,需要提前写进列表中,作为探索地图的锚点。
11. 原则上只相信通过移动而获得的连接,但为提高效率,把那些移动后彼此通过look可以确认互逆方向的房间签名匹配的连接直接写进数据库,而无需实际移动
T
terry
@terry
-
初探pymud的自动地图功能 -
初探pymud的自动地图功能
-
初探pymud的自动地图功能从开始着手自动画地图,到今天基本上完成,足足用了6周,可最开始竟然企图一周完成
总体来说,之前的框图的算法是对的,但由于对西游记mud本身的不了解走了很多弯路
现在告一段落,也该总结一下了 -
PyMUD 0.22.2 正式版发布不知道为什么现在又可以了
这个功能挺好~~~~ -
PyMUD 0.22.2 正式版发布我按照示例设置自动登录,不成功呢~~
-
初探pymud的自动地图功能实践证明这个方法无效,无法完成那种两个房间的连接不是互逆的情况
-
初探pymud的自动地图功能探索地图流程图

-
如何实现session断线重连的功能呢多谢群主大人~~~~~~
-
如何实现session断线重连的功能呢如题,麻烦各位大佬解答
-
一个极简COMMAND的演示代码command还可以返回值,所以可以把一个大任务分解成若干具有返回值的command,根据返回值判断下一步操作
-
中文MUD都有什么站点清华西游记 xyj.thu.cn:6666
-
初探pymud的自动地图功能@newstart 就是这意思,基于pymud实现自动地图功能
-
初探pymud的自动地图功能抛砖引玉,我现在是不会啊,等大佬现身说法
-
cmdScore.py数据问题@shanghua 你不能插入代码块么?别总贴图
-
cmdScore.py数据问题正则你得自己优化吧。我不玩xkx,我不不知道是否匹配
-
cmdScore.py加载报错@newstart 现在的逻辑不是也应该这样么?
后边的那些命令我还没写好,所以暂时让我注释掉了 -
cmdScore.py加载报错@shanghua
打score命令,然后在命令行输入#var(或者#var char_profile)查看变量 -
cmdScore.py加载报错@shanghua 你的IDE对于不能识别的关键字不会提示么?
-
关于commands的问题,如何在异步执行的await中添加其他条件?谢谢各位大佬。
我在skill item的触发中计数,当计数和总技能数相等的时候开启end触发,算是绕过去了。from pymud import Command, Trigger, IConfig, DotDict,trigger,async_exception import traceback import re, cn2an class CmdSkills(Command, IConfig): _help = """ 通过命令行查看技能的命令: 正常指令 含义 skills: 查看角色所有技能 skills xxx: 查看npc'xxx'的所有技能 """ def __init__(self, session, *args, **kwargs): pattern = r"^(?:skills|sk)\s*(.*)$" kwargs.setdefault("id", "cmd_skills") super().__init__(session, patterns = pattern, *args, **kwargs) self.session.setVariable('skills',[]) self.category = '' self.skill_count = 0 def __unload__(self): super().__unload__() @trigger(id = "cmd.skills.start", patterns = r"^你目前所掌握的技能:((.*?)项)", group = "cmd.skills",enabled = False) def start(self, name, line, wildcards): self.skills = [] self.skill_order = 0 self.session.info('Start to parse skill on') self.skill_count = cn2an.cn2an(wildcards[0],'normal') self.session.enableGroup(group = "cmd.skills", enabled = True, subgroup = True) @trigger(id = "cmd.skills.end", patterns = r'┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛', group = "cmd.skills",enabled = False) def end(self, name, line, wildcards): self.session.info(f'End to parse skills') self.session.enableGroup(group = "cmd.skills", enabled = False, subgroup = True) @trigger(id = "cmd.skills.item", patterns = r'^\s*┃\s*([□ ]?)\s*([^()]+)\s*\(([^)]+)\)\s*-\s*([^ ]+)\s+(\d+)/\s*(\d+)\s*┃\s*$', group = "cmd.skills",enabled = False) def item(self, name, line, wildcards): skill = {} skill['category'] = self.category skill['enabled'] = '□' in wildcards[0].strip() skill['cn_name'] = wildcards[1].strip() skill['en_name'] = wildcards[2].strip() skill['title'] = wildcards[3].strip() skill['level'] = int(wildcards[4].strip()) skill['experience'] = int(wildcards[5].strip()) self.skills.append(skill) self.skill_order += 1 if self.skill_order == self.skill_count: self.session.tris["cmd.skills.end"].enabled = True @trigger(id = "cmd.skills.category", patterns = r'^[┏┠][━─]\s{2}([\u4e00-\u9fa5]+)\s{2}[━─]+.*[┓┨]\s*$', group = "cmd.skills",enabled = False) def category(self, name, line, wildcards): self.category = wildcards[0].strip() self.session.info(f'Skill category: {self.category}') async def execute(self, cmd = "skills", *args, **kwargs): try: self.reset() self.session.tris["cmd.skills.start"].enabled = True await self.session.waitfor(cmd, self.session.tris["cmd.skills.end"].triggered()) self.session.enableGroup(group = "cmd.skills", enabled = False, subgroup = True) self.session.setVariable('skills',self.skills) return self.SUCCESS except Exception as e: self.error(f"异步执行中遇到异常, {e}, 类型为 {type(e)}") self.error(f"异常追踪为: {traceback.format_exc()}") -
cmdScore.py加载报错跟我之前遇到的问题一样的,你需要先定义‘char_profile’变量
self.session.setVariable("char_profile",DotDict()) self.session.vars["char_profile"].update(self.profile)