跳转至内容
  • 欢迎
  • 版块
  • 最新
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
品牌标识

Hellclient 社区

  1. 主页
  2. Script脚本
  3. 深入浅出制作全自动Mud机器人-问与答

深入浅出制作全自动Mud机器人-问与答

已定时 已固定 已锁定 已移动 Script脚本
全自动
1 帖子 1 发布者 11 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • jarlyynJ 离线
    jarlyynJ 离线
    jarlyyn
    编写于 最后由 编辑
    #1

    问与答是一个最为典型简单的Mud解密,是大部分Mud任务的基础与核心,可以作为我们研究Mud解密的入口。

    对于一个标准的问答对话来说,一般是

    • 主动发起ask
    • 游戏提示 你向XXXX打听关于XXXX的事情
    • 可能有部分干扰,没听清之类
    • 紧跟着你打听的内容,NPC会进行回复。同时NPC也会恢复其他玩家的问题,这时可能对你有所干扰。

    这时,很多老玩家可能会向你介绍多行匹配这一神器。

    但很可惜,这只是试图逃避正确解决问答问题的逃课行为。

    多行匹配完全不适合问答解密上。因为多行匹配无法进行逻辑处理,无法引入状态。也无法标准化处理。

    因此,多行匹配在问答问题上,只能算是一个补丁。如果你的机器建立在大量补丁上,很快就会带来难以解决的架构问题。

    那么,怎么来进行一个标准化的问答呢?

    很简单,对NPC的回答进行录制。

    在ask npc时,同时发送你的ask指令和同步指令。对应的,你会预期两个服务器的回复

    • 你想XXX大厅关于XXX的事情:开始录制,把这行之后的每一行都追加到一个数组里
    • 你的同步响应:结束录制,ask结束,进行下一步处理。

    这样,就把问答问题,转换为对一个字符串数组的按行分析。

    再配合简单的状态机形式,一般就是一个局部的Mode变量,就行解决大部分的问题了。

    以hongchenjs的长安任务为例,需要向梁兴禄发起ask 任务,处理的代码如下

        Changan.Check = function () {
            if (App.Data.Ask.Answers.length) {
                if (App.Data.Ask.Answers[0].Line == "梁兴禄对你说道:本府不是已经给你派发了差事,完不成的话就先跟我取消。") {
                    Changan.Fail();
                    return;
                }
                if (App.Data.Ask.Answers[0].Line == "梁兴禄对你说道:你的江湖经验已经很高了,再在衙门里也混不出个名堂了。") {
                    Quest.Cooldown(10 * 60 * 60 * 1000)
                    App.Next();
                    return
    
                }
                if (App.Data.Ask.Answers[0].Line == "梁兴禄盯着你看了看,说道:“你刚取消过一次任务,过一分钟再来吧。”") {
                    Quest.Cooldown(60 * 1000)
                    // App.Core.Timeslice.Change("")
                    App.Next();
                    return
                }
                if (App.Data.Ask.Answers[0].Line.match(matcherTooMany)) {
                    Quest.Cooldown(4 * 3600 * 1000)
                    // App.Core.Timeslice.Change("")
                    App.Next();
                    return
                }
                if (App.Data.Ask.Answers[0].Line == "梁兴禄对你说道:嗯,既然你有心为衙门出力,我便给你个差事。") {
                    Changan.All++;
                    App.Send("changanjob")
                    if (App.Data.Ask.Answers[1].Line == "梁兴禄说着便拿出一份公函交给你。") {
                        Changan.Gonghan()
                        return
                    }
                    Changan.Check2()
                    return
                }
            }
            App.Fail()
        }
        Changan.Check2 = function () {
            let result = App.Data.Ask.Answers[1].Line.match(matcherCode)
            if (result) {
                Changan.Data.Name = result[2];
                for (var i = 3; i < App.Data.Ask.Answers.length; i++) {
                    let token = App.Data.Ask.Answers[i].Line.match(matcherCodeToken)
                    if (token) {
                        Changan.Data.Code += token[1].trim()
                    } else {
                        break
                    }
                }
                Changan.Data.Type = "code"
                Changan.DoCode()
                return
            } else {
                App.Log("未知的长安任务对话")
                Changan.Fail()
                return
            }
        }
    
    

    代码地址

    能很好的看出怎么用标准录制的问答信息,来解决复杂谜题。

    1 条回复 最后回复
    • jarlyynJ jarlyyn 被引用 于这个主题
    • jarlyynJ jarlyyn 被引用 于这个主题
    回复
    • 在新帖中回复
    登录后回复
    • 从旧到新
    • 从新到旧
    • 最多赞同


    • 登录

    • 没有帐号? 注册

    • 登录或注册以进行搜索。
    Powered by Herbrhythm.
    • 第一个帖子
      最后一个帖子
    0
    • 欢迎
    • 版块
    • 最新
    • 标签
    • 热门
    • 用户
    • 群组