jarlyyn 发表于 2021-9-7 01:40:11

下一个要处理的部分就是重头戏,游戏基础信息了。

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

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

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

jarlyyn 发表于 2021-9-7 01:49:11

本帖最后由 jarlyyn 于 2021-9-7 01:50 AM 编辑

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

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

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

位置信息


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

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

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


路径信息

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

      "yzqz":"yzgc|n;w|e;s",
      "yzdp":"yzgc|s;e|w;n",
      "yztj":"yzgc|e;e;s|n;w;w",
      "yzzxl":"yzgc|n;n;e|w;s;s",
      "yzzxl":"yzgc|s;s;w|e;n;n",
      "yzyp":"yzgc|e;e;n|s;w;w",
      "yzsy":"yzgc|e;e;n|s;w;w",
      "yzkd":"yzgc|n;e|w;s",
|分割,提前,前往的路径,回来的路径

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

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

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

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

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

不过时间不早了,等下次再更新行走的模块了。

jarlyyn 发表于 2021-9-8 03:13:24

本帖最后由 jarlyyn 于 2021-9-8 03:55 PM 编辑

让我冷静一下……

hzlhzlhzlhzl


jarlyyn 发表于 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。


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

具体来说

我现在的房间信息列表为

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


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

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


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

{
"Delay": 6,
"Path": [
    {
      "command": "e;s",
      "from": "yzqz",
      "to": "yzgc",
      "delay": 2
    },
    {
      "command": "e;e;s",
      "from": "yzgc",
      "to": "yztj",
      "delay": 3
    },
    {
      "command": "s",
      "from": "yztj",
      "to": "yzdtpns",
      "delay": 1
    }
],
"Command": "e;s;e;e;s;s"
}

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

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

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




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

同时注册了一个GetPath的API

好了。

今天就到这里了。

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




xgg 发表于 2021-9-8 12:15:54

看了楼主的帖子,我只想把你拐来用 tintin++,对于普通用户来讲不会编程语言是个巨大障碍。tintin++ 的脚本语言贴合自然语言,能和游戏内容深度结合,现在就缺你这样思路清晰,论述简洁的人才来帮助普通玩家入门了(手动捂脸)。

jarlyyn 发表于 2021-9-8 16:09:25

接下来应该是更新行走模块。

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

估计今晚写不出,咕一天

争取这周内能写出来。

jarlyyn 发表于 2021-9-8 16:11:56

另外今天看论坛发现 北侠还有个

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

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

这个比较小,可能先做这个。

jarlyyn 发表于 2021-9-9 11:52:40

果然还是鸽了

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

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

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

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

具体修改的代码是

https://github.com/hellclient-scripts/pkuxkx.noob/blob/def66a283e50680bd23743318ea0a0affda0273b/script/core/player.js




jarlyyn 发表于 2021-9-10 02:38:04

今晚的由于应要求尝试编译mac版本客户端,再咕一晚……

jarlyyn 发表于 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位置或逆运算出路径并前往,




页: 1 2 [3] 4 5 6 7 8 9
查看完整版本: 一步一步在北侠做机器人