<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[深入浅出制作全自动Mud机器人-问与答]]></title><description><![CDATA[<p dir="auto">问与答是一个最为典型简单的Mud解密，是大部分Mud任务的基础与核心，可以作为我们研究Mud解密的入口。</p>
<p dir="auto">对于一个标准的问答对话来说，一般是</p>
<ul>
<li>主动发起ask</li>
<li>游戏提示 你向XXXX打听关于XXXX的事情</li>
<li>可能有部分干扰，没听清之类</li>
<li>紧跟着你打听的内容，NPC会进行回复。同时NPC也会恢复其他玩家的问题，这时可能对你有所干扰。</li>
</ul>
<p dir="auto">这时，很多老玩家可能会向你介绍多行匹配这一神器。</p>
<p dir="auto">但很可惜，这只是试图逃避正确解决问答问题的逃课行为。</p>
<p dir="auto">多行匹配完全不适合问答解密上。因为多行匹配无法进行逻辑处理，无法引入状态。也无法标准化处理。</p>
<p dir="auto">因此，多行匹配在问答问题上，只能算是一个补丁。如果你的机器建立在大量补丁上，很快就会带来难以解决的架构问题。</p>
<p dir="auto">那么，怎么来进行一个标准化的问答呢？</p>
<p dir="auto">很简单，对NPC的回答进行录制。</p>
<p dir="auto">在ask npc时，同时发送你的ask指令和同步指令。对应的，你会预期两个服务器的回复</p>
<ul>
<li>你想XXX大厅关于XXX的事情:开始录制，把这行之后的每一行都追加到一个数组里</li>
<li>你的同步响应：结束录制，ask结束，进行下一步处理。</li>
</ul>
<p dir="auto">这样，就把问答问题，转换为对一个字符串数组的按行分析。</p>
<p dir="auto">再配合简单的状态机形式，一般就是一个局部的Mode变量，就行解决大部分的问题了。</p>
<p dir="auto">以hongchenjs的长安任务为例，需要向梁兴禄发起ask 任务，处理的代码如下</p>
<pre><code class="language-javascript">    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 &lt; 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
        }
    }

</code></pre>
<p dir="auto"><a href="https://github.com/hellclient-scripts/hongchenjs/blob/main/script/src/quests/changanjob/changanjob.js" target="_blank" rel="noopener noreferrer nofollow ugc">代码地址</a></p>
<p dir="auto">能很好的看出怎么用标准录制的问答信息，来解决复杂谜题。</p>
]]></description><link>https://forum.hellclient.com/topic/47/深入浅出制作全自动mud机器人-问与答</link><generator>RSS for Node</generator><lastBuildDate>Mon, 25 May 2026 02:55:12 GMT</lastBuildDate><atom:link href="https://forum.hellclient.com/topic/47.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 04 May 2026 16:49:27 GMT</pubDate><ttl>60</ttl></channel></rss>