北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
楼主: jarlyyn

一步一步在北侠做机器人

[复制链接]
 楼主| 发表于 2021-9-7 01:40:11 | 显示全部楼层
下一个要处理的部分就是重头戏,游戏基础信息了。

这个可以说是做mud的重中之重,所以我把它单独的抽了一层出来。

对于一个好的机器人来说,这一块应该是会经常变动,不停补充的

所以,这一块应该尽量解耦合,尽量以提供接口的形式和 mod部分进行交互 以便发生大更新时,只需要替换游戏基础信息,不需要大的重构。

北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-9-7 01:49:11 | 显示全部楼层
本帖最后由 jarlyyn 于 2021-9-7 01:50 AM 编辑

游戏基础信息里比较重要的就是 位置信息和路径了。

由于这次我们做的是符合北侠标准的绿色机器人,不收集复杂的 信息。

我第一步先收集了扬州的一些重要位置。

位置信息


https://github.com/hellclient-sc ... cript/info/rooms.js

  1.     addroom("yzgc","扬州广场",{Landmark:"Rong shu"})
  2.     addroom("yzqz","扬州钱庄",{Station:"扬州钱庄"})
  3.     addroom("yzdp","扬州当铺",{Landmark:"Tang nan"})
  4.     addroom("yztj","扬州铁匠",{Landmark:"Wang tiejiang"})
  5.     addroom("yzzxl","扬州醉仙楼",{Station:"醉仙楼"})
  6.     addroom("yzcg","春来茶馆",{Station:"春来茶馆"})
  7.     addroom("yzyp","扬州药铺",{Landmark:"Ping yizhi"})
  8.     addroom("yzsy","扬州书院",{Landmark:"Fu zi"})
  9.     addroom("yzkd","扬州客店",{Landmark:"Song shengyi"})
复制代码
其中Station指独一无二的房间名

Landmark指固定的独一无二的房间内元素


路径信息

https://github.com/hellclient-sc ... cript/info/paths.js

  1.         "yzqz":"yzgc|n;w|e;s",
  2.         "yzdp":"yzgc|s;e|w;n",
  3.         "yztj":"yzgc|e;e;s|n;w;w",
  4.         "yzzxl":"yzgc|n;n;e|w;s;s",
  5.         "yzzxl":"yzgc|s;s;w|e;n;n",
  6.         "yzyp":"yzgc|e;e;n|s;w;w",
  7.         "yzsy":"yzgc|e;e;n|s;w;w",
  8.         "yzkd":"yzgc|n;e|w;s",
复制代码
|分割,提前,前往的路径,回来的路径

同时,我还绑定了两个事件,用于在进入新房间或者look查看信息时判断是否为独特房间,进行定位。

那么最终的效果是,当我移动到能识别出的房间时,会自动定位并进行提醒,比如

  1. > 扬州钱庄 - [大宋国] [城市]
  2.      这里明显的出口有 east 和 south。
  3. 定位成功,位于 扬州钱庄(yzqz)
  4.      钱庄老板「铁公鸡」钱眼开(Qian yankai)
  5.      善人 大轮寺第十一代弟子「傣族首领快点给我人世间」橘右京(Ukyo)
  6.      全真派 散仙「22ok」无痕心(Xiaobaichi)
  7.      日月神教 教众「三分毒七分奶亲戚是黑白子」毒奶扁鹊(Bianque)
复制代码

那么,很好。

能定位,有路径,下一步就是自动行走了。

我们的机器人马上就要动起来了。

不过时间不早了,等下次再更新行走的模块了。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2021-9-8 03:13:24 | 显示全部楼层
本帖最后由 jarlyyn 于 2021-9-8 03:55 PM 编辑

让我冷静一下……




北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2021-9-8 03:42:42 | 显示全部楼层
本帖最后由 jarlyyn 于 2021-9-8 04:24 PM 编辑

先把获取路径部分代码丢出来吧。

获取路径一般需要路径数据,通过简单的算法算出来。

寻路算法最有名的是dijkstra


介绍可以看https://www.jianshu.com/p/a235d9877d32

由于mud本身的特性,对性能要求不高,算法并不需要很完美的实现。


我10年前在北侠论坛放出的机器人里包含一个mush用的dll的实现,这次客户端里自带一个,其实用lua或js来实现也很简单。

就是把地图想象为一张白纸,从起点开始,按时间依次沿路径向外(白色的地方)扩散,只要有颜色了就不再覆盖,没轮扩散后检查是否有重点被染色了,有就是需要的路径,没有继续扩散。知道扩无可扩,说明找不到路径。

go语言的代码没用什么语言特性,可以很容易的迁移到其他语言,具体见:

https://github.com/jarlyyn/hellc ... es/mapper/mapper.go

以及

https://github.com/jarlyyn/hellc ... s/mapper/walking.go

我们现在做的很简单,就是把昨天我添加的几条路径,分解为 为去和来的路径,比如 yzgc到 yztj 的 e;e;s 和yzth到yzgc 的 n;w;ww 添加到房间信息里去

同时注册了一个ready事件,在机器人ready(所有模块记载完之后)将地图信息载入mapper。


然后把起点和目标地址列表传入,就能获取到路径信息了

具体来说

我现在的房间信息列表为

  1.     addroom("yzgc","扬州广场",{Landmark:"Rong shu"})
  2.     addroom("yzqz","扬州钱庄",{Station:"扬州钱庄"})
  3.     addroom("yzdp","扬州当铺",{Landmark:"Tang nan"})
  4.     addroom("yztj","扬州铁匠",{Landmark:"Wang tiejiang"})
  5.     addroom("yzzxl","扬州醉仙楼",{Station:"醉仙楼"})
  6.     addroom("yzcg","春来茶馆",{Station:"春来茶馆"})
  7.     addroom("yzyp","扬州药铺",{Landmark:"Ping yizhi"})
  8.     addroom("yzsy","扬州书院",{Landmark:"Fu zi"})
  9.     addroom("yzkd","扬州客店",{Landmark:"Song shengyi"})
  10.     addroom("yzdtpns","扬州打铁铺内室",{Station:"打铁铺内室"})
复制代码
路径列表为
  1.     app.Info.Paths={
  2.         "yzqz":"yzgc|n;w|e;s",
  3.         "yzdp":"yzgc|s;e|w;n",
  4.         "yztj":"yzgc|e;e;s|n;w;w",
  5.         "yzzxl":"yzgc|n;n;e|w;s;s",
  6.         "yzzxl":"yzgc|s;s;w|e;n;n",
  7.         "yzyp":"yzgc|e;e;n|s;w;w",
  8.         "yzsy":"yzgc|e;e;n|s;w;w",
  9.         "yzkd":"yzgc|n;e|w;s",
  10.         "yzdtpns":"yztj|s|n",
  11.     }
复制代码


我在扬州钱庄去了钱,想去铁匠铺内室买牛哄哄金闪闪的武器。

由于我有钱庄到广场,广场到铁匠铺,铁匠铺到内室的路径,能算出要走的命令


输入 /DumpPath("yzqz","yztjpns"),得到结果

  1. {
  2.   "Delay": 6,
  3.   "Path": [
  4.     {
  5.       "command": "e;s",
  6.       "from": "yzqz",
  7.       "to": "yzgc",
  8.       "delay": 2
  9.     },
  10.     {
  11.       "command": "e;e;s",
  12.       "from": "yzgc",
  13.       "to": "yztj",
  14.       "delay": 3
  15.     },
  16.     {
  17.       "command": "s",
  18.       "from": "yztj",
  19.       "to": "yzdtpns",
  20.       "delay": 1
  21.     }
  22.   ],
  23.   "Command": "e;s;e;e;s;s"
  24. }
复制代码

很明显,需要6步,总命令为“e;s;e;e;s;s”每一步要走的信息和时间在Path里。

主要变动的代码不多,主逻辑在

https://github.com/hellclient-sc ... cript/info/paths.js




注册了info.paths.loadpaths 回调,绑定到了ready事件上

同时注册了一个GetPath的API

好了。

今天就到这里了。

我需要缓一缓,去平复下我的心情。




北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2021-9-8 12:15:54 来自手机 | 显示全部楼层
看了楼主的帖子,我只想把你拐来用 tintin++,对于普通用户来讲不会编程语言是个巨大障碍。tintin++ 的脚本语言贴合自然语言,能和游戏内容深度结合,现在就缺你这样思路清晰,论述简洁的人才来帮助普通玩家入门了(手动捂脸)。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2021-9-8 16:09:25 | 显示全部楼层
接下来应该是更新行走模块。

但行走模块是侠客行类mud最复杂的模块(第二是战斗)

估计今晚写不出,咕一天

争取这周内能写出来。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2021-9-8 16:11:56 | 显示全部楼层
另外今天看论坛发现 北侠还有个

hpbrief命令,score/hp有频率限制,hpbreif可能还会被吞。

所以要做个频率限制模块。

这个比较小,可能先做这个。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2021-9-9 11:52:40 | 显示全部楼层
果然还是鸽了

昨天把原来的hp触发去掉了,加入了hpbrief。

hpbrief是典型的多行触发,唯一的特点是由于抓取点较多(18)个,超过了mush非lua脚本传递参数的上限

需要用GetTriggerWildcard去获取。同时用命名捕获组进行匹配。

最蛋疼的是发现我的客户端里GetTriggerWildcard这个api还没实现,所以昨天实现和测试了一下。

具体修改的代码是

https://github.com/hellclient-sc ... ript/core/player.js




北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2021-9-10 02:38:04 | 显示全部楼层
今晚的由于应要求尝试编译mac版本客户端,再咕一晚……
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2021-9-10 11:48:56 | 显示全部楼层
接下来先归纳下自动行走的形式。

自动行走,本质是一个移动模块,处理的是改变mud中的重要变量(位置)的处理。

一般来说,行走会有3种形式

  • 移动:按指定的路径,从出发点移动到终点。为了效率起见,往往会采用多步行走的形式
  • 遍历:按指定的路径,每移动一个房间,就执行一次命令,做判断。比如,按路径对所有看到的npc下一次偷窃命令
  • 定位:指不知道当前位置,没有路径,根据当前房间的出口,随即做布朗运动,直到遇到能够定位的房间为止。

其中 移动 和 遍历 是侠客行类很多任务的重点

比如
  • 去XXX位置(移动)购买XXX,然后送给XXX位置的(移动)的固定npc xxxx
  • 在XXX区域搜索(遍历)XXX道具,然后送给XXX区域(搜索)的npc xxxxx
  • 在XXX区域找到(遍历)xxxx npc,得到XXXX道具,并送给(移动)XXX位置的npc xxxx

注意搜索其实未必是遍历,移动也可以搜索,但这需要全地图或者特殊的可逆路径支持。

在移动中发现npc后,标记npc的当前位置(房间号 或 剩余路径)

在多步移动结束后,前往npc位置或逆运算出路径并前往,




北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-24 01:17 AM , Processed in 0.014411 second(s), 13 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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