使用Inform 7编程

1239人浏览 / 0人评论

Inform 7是一种编程语言,旨在开发基于老式解析器的冒险游戏,类似于Infocom在1980年代开发的那些游戏,最著名的是Zork。它是在2000年代中期开发的,用于替代Inform 6,Inform 6具有几乎相同的目的,但对于本博客而言,它是一种相当标准的类似于C的命令式编程语言,因此没有那么有趣。

Inform 7 不是一种类似C的标准命令式编程语言。这是一个正确的可执行程序的示例:1

"The Lady and the Tiger"

The lady is on top of the tiger.
The tiger is in a room.
"This lady hails from Niger
Niamey, I presume."

The lady wears a smile.
Her arm is in a sling.
Riding is an action
applying to one thing.

"The lady on the tiger
Up and down they sped."
After the lady rides the tiger
Now it wears the smile instead.

这段代码被编译成一个小游戏,其中有一个房间,一只老虎和在那只老虎顶上的一位女士。这些事物中的每一个都有在诗歌中定义的各种状态和属性,其中最重要的是它们在引号中的文字描述。

仔细阅读该代码,可以发现Inform 7中有多少种操作与更传统的语言相对应。这段代码:

The lady is on top of the tiger.
The tiger is in a room.

意思是这样的:

lady = Person.new
tiger = Animal.new
room = Room.new

tiger.location = room
tiger.rider = lady

同样,

After the lady rides the tiger
Now it wears the smile instead.

表示类似:

if tiger.rider == lady
  lady.inventory.delete(smile)
  tiger.inventory.push(smile)
end

但是,Inform 7不仅提供了一种冗长/看似非技术的方式来表达这样的简单语句(以诸如SPLChef之类的esolangs之类),还使用了其成语来表达可以用自然语言非常优雅地表达的内容。采取以下几行:

A man can be happy or sad.

该语句以比一堆只能对/错,只能为它们赋予适当关系的变量更简洁和语义上令人愉悦的方式向一类事物(男人)分配新的布尔属性(高兴或悲伤)(man.happy = false等等)。定义完这些东西之后,您可以使用以下结构来测试和声明它们:2

At 00:00:
    if all men are sad,
      now all doors are closed.

无需循环!

Inform 7的主要构造是规则和关系–它不是面向对象的,而是面向规则的。对于设计用于构造基于回合解析器界面的复杂交互的语言,这是非常明智的。对于玩家发出的每一个命令- ,EXAMINE WINDOW,,GO NORTH -笔者可以定义在这个命令发出后,被前评估了大量的规则。这些规则可以检查条件(仅在玩家拿着照相机的情况下才拍照),执行便利动作(解锁玩家拥有钥匙的门),当然也可以定义给定动作的结果,例如老虎诗。TAKE BREATHASK LADY ABOUT TIGER

After the lady rides the tiger:
    now it wears the smile instead.

此规则定义依赖于我们之前对动词“ riding”的定义。

Riding is an action applying to one thing.

我们可以定义玩家和非玩家角色可以执行的任意数量的任意动作,并具有各种条件,例如它应用于多少个对象以及是否需要光照,然后可以在其上附加规则以定义必须执行的操作在执行之前,之后和期间发生。3

Check riding:
    if the player is wearing spurs,
          say "That would be animal cruelty." instead.

关系使我们可以测试条件并声明状态。通过写作The tiger is in the room,我们正在说明老虎和房间之间的关系,我们以后可以对其进行测试。

if the tiger is in the room,
    say "There is a tiger here."

到目前为止,标准。但是,Inform的自然语言语法也为我们提供了一种非常优雅的方法来测试历史条件。

if the tiger was in the room,
    say "A tiger has been here. You can tell by the orange hair in the carpet."

如果你没有注意到,唯一的改变我的第一个块和码第二块之间进行了替代wasis。进行一次紧张的更改(用口头语言来说是微不足道的)对于传统的编程语言来说将是一项艰巨的任务-即使您已经设计了用于记录历史的机制,表达if the tiger was in the room也可能不是那么简短,优美的代码行。

属性,规则和关系之间的相互作用可用于对复杂系统进行建模,其使用的代码看起来像是悬而未决的教科书。这是手册中定义重量的一个简单示例

A length is a kind of value. 10m specifies a length. An area is a kind of value. 10 sq m specifies an area. A length times a length specifies an area.

A weight is a kind of value. 10kg specifies a weight. Everything has a weight.

The verb to weigh means the weight property. A thing usually weighs 1kg.

Definition: A thing is light if its weight is 3kg or less.

Definition: A thing is heavy if its weight is 10kg or more.

Inform的代码最让我想起了数学家在证明中使用的那种写作。这并不奇怪,因为该语言的作者Graham Nelson是一位数学家。这是Inform 7中的斐波那契数列,摘自Inform Recipe Book的§10.11

To decide what list of numbers is the first (F - a number) terms of the Fibonacci sequence:
    let the Fibonacci sequence be {1, 1};
    let N be 3;
    while N < F:
        let the last term be entry (N - 1) of the Fibonacci sequence;
        let the penultimate term be entry (N - 2) of the Fibonacci sequence;
        let the next term be the last term plus the penultimate term;
        add the next term to the Fibonacci sequence;
        increment N;
    decide on the Fibonacci sequence.

我发现自然语言方法的主要缺点是,由于Inform 7是一种富有表现力的语言,因此很容易忘记它仍然是一种编程语言,并尝试只用简单的英语编写要实现的目标。就像任何其他编程语言一样,这会产生编译器错误,并且您还记得您是用自然英语的一个非常特殊且结构精确的子集编写代码的。

尽管我对编写解析器驱动的交互式小说的兴趣很有限,但我还是喜欢玩Inform 7并弄清楚如何在其中建模不同的事物,只是因为它很有趣并且与其他语言不同。正如TRG Green在有关该语言的文章中所说:“有些东西制作得如此精美,令人着迷,以至于我们只想为自己而使用它们。”

全部评论