gpt4 book ai didi

interpreter - 基于文本的 RPG 命令解释器

转载 作者:行者123 更新时间:2023-12-01 10:13:18 27 4
gpt4 key购买 nike

我只是在玩一个基于文本的 RPG,我想知道,命令解释器究竟是如何实现的,现在有没有更好的方法来实现类似的东西?编写大量 if 语句很容易,但这似乎很麻烦,特别是考虑到大多数情况下 pick up the goldpick up gold 相同,后者具有和take gold的效果一样。我确信这是一个非常深入的问题,我只想知道如何实现这样的解释器的一般概念。或者如果有一个开源游戏,有一个体面和有代表性的解释器,那就完美了。

答案可以独立于语言,但尽量保持合理,而不是序言或 Golfscript 或其他东西。我不确定到底要标记什么。

最佳答案

这类游戏的通常名称是文字冒险或互动小说,如果是单人游戏,或者是 MUD,如果是多人游戏。

有几种特殊用途的编程语言可用于编写交互式小说,例如 Inform 6 , Inform 7 (编译为 Inform 6 的全新语言),TADS , Hugo ,等等。

这是 Inform 7 中的一个游戏示例,它有一个房间,房间里有一个物体,您可以拿起、放下和以其他方式操作该物体:

"Example Game" by Brian Campbell

The Alley is a room. "You are in a small, dark alley." A bronze key is in the
Alley. "A bronze key lies on the ground."

播放时产生:

Example GameAn Interactive Fiction by Brian CampbellRelease 1 / Serial number 100823 / Inform 7 build 6E59 (I6/v6.31 lib 6/12N) SDAlleyYou are in a small, dark alley.A bronze key lies on the ground.>take keyTaken.>drop keyDropped.>take the keyTaken.>drop keyDropped.>pick up the bronze keyTaken.>put down the bronze keyDropped.>

For the multiplayer games, which tend to have simpler parsers than interactive fiction engines, you can check out a list of MUD servers.

If you would like to write your own parser, you can start by simply checking your input against regular expressions. For instance, in Ruby (as you didn't specify a language):

case input
when /(?:take|pick +up)(?: +(?:the|a))? +(.*)/
take_command(lookup_name($3))
when /(?:drop|put +down)(?: +(?:the|a))? +(.*)/
drop_command(lookup_name($3))
end

一段时间后,您可能会发现这变得很麻烦。您可以使用一些速记来简化它以避免重复:

OPT_ART = "(?: +(?:the|a))?"  # shorthand for an optional article
case input
when /(?:take|pick +up)#{OPT_ART} +(.*)/
take_command(lookup_name($3))
when /(?:drop|put +down)#{OPT_ART} +(.*)/
drop_command(lookup_name($3))
end

如果您有很多命令,这可能会开始变慢,它会按顺序检查每个命令的输入。您也可能会发现它仍然难以阅读,并且包含一些难以简单提取为速记的重复内容。

此时,您可能想查看 lexersparsers ,这个话题太大了,我无法在此处回复。有许多词法分析器和解析器生成器,给定语言的描述,将生成能够解析该语言的词法分析器或解析器;查看链接的文章以获得一些起点。

作为解析器生成器如何工作的示例,我将在 Treetop 中给出一个示例。 ,基于 Ruby 的解析器生成器:

grammar Adventure
rule command
take / drop
end

rule take
('take' / 'pick' space 'up') article? space object {
def command
:take
end
}
end

rule drop
('drop' / 'put' space 'down') article? space object {
def command
:drop
end
}
end

rule space
' '+
end

rule article
space ('a' / 'the')
end

rule object
[a-zA-Z0-9 ]+
end
end

可以如下使用:

require 'treetop'
Treetop.load 'adventure.tt'

parser = AdventureParser.new
tree = parser.parse('take the key')
tree.command # => :take
tree.object.text_value # => "key"

关于interpreter - 基于文本的 RPG 命令解释器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3546044/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com