C64 Terrapin徽标的徽标冒险

我17岁那年,Terrapin在他们的C64 Logo实用程序磁盘上发布了我的第一个商业代码:Logo Adventure程序,这是一个简单的非图形游戏,展示了Logo的列表处理和功能编程功能。

可以用这种方式定义单向或弯曲门,但如果要使用普通的双向门,则每个房间都应在相反的方向上来回指向。 但是,如果您真的想制作一段曲折的小迷宫,那就把自己踢出去吧! 但是,请给您的玩家很多东西以供落后,以便他们绘制我们的迷宫。

ITEMS列表包含一堆列表,描述房间号,分数(数字)和每个项目的名称(字符串)。 列表中的第一件事是包含该物品的房间号;如果该物品在玩家的清单中,则为-1;否则为0。 列表中的第二件事是商品得分:将其存入库存可获得多少分。 列表中的第三件事是项目名称。

模型中最重要但最简单的部分是玩家的房间号RNUMNSEW单词通过调用MOVEDIR更改玩家的房间号在一个房间之间移动 (挥动魔杖通过神奇地更改RNUM将您带到秘密的秘密房间)。

从理论上讲,如果房间号为0,则播放器根本不在,而如果房间号为-1,则播放器将自己存放在自己的库存中! 但是请放心:除非您使用魔法或入侵系统,否则这永远不会发生,这很容易,因为系统是顶级徽标解释器。

最后, INIT调用INITITEMS,ITEMS列表传递为:I并将数字1传递给:F 。 这递归地定义了一堆神奇的函数,这些函数按名称引用每个项,这些函数还记住您称为代词IT的最后一个项。

这些神奇的功能完成了两件事:我们可以按名称来引用项目,而无需键入其他引号(通过定义为每个项目命名的函数);它可以通过调用单词自动记住我们在全局变量IT中引用的最后一个项目。 SETIT

 发起:I:F 
如果:I = []停止
测试:F = 1
IFT定义最后一个:I输入LPUT单词“”最后一个:I [OP SETIT] [[]]
IFF最后确定:I []
BF:I:F
ENDTO SETIT:事情
做“它:事
OP:事物
结束

现在,我们正在做一些真正有趣的列表处理和函数定义! :I参数是要递归的项目列表,而:F参数控制是初始化项目(1)还是清理项目(0)。 表达式FIRST :I是当前项,而LAST 第一 :我是当前商品的名称。

递归函数通常应该做的第一件事是检查是否已完成。 所以IF :I = [] STOP表示如果我们在项目列表的末尾,则停止。

接下来要做的是检查:F参数是否等于1。 如果这是正确的( IFT ),则它定义一个神奇的函数,如果不是( IFF ),则它将清理该函数定义。

最后, INITITEMS自行循环处理列表的其余部分BF :I,这意味着(不要笑)“但要优先”,即:: I的所有元素,但要优先。

为了解释神奇的功能,我将举一个例子:当项目的名称为“ SWORD”时,它将定义一个不带参数的名为SWORD的函数,其主体为[ OP SETIT“ SWORD]” ,该函数输出调用结果使用参数“ SWORD”进行SETITSETIT字将全局变量IT设置为“ SWORD”,并返回“ SWORD”。 所以我们可以说GET SWORD ,然后说DROP IT

了解LPUT的定义会很有帮助,该定义接受两个参数“ thing”和“ list”,并返回“ list”的副本, 后跟 “ thing”。 还有WORD ,它需要两件事并将它们连接成一个单词,在这种情况下,该单词仅用于将字符串转换成单词(例如LISP符号)。 并且DEFINE接受两个参数:函数的名称和列表。 列表的第一个元素是参数列表(在本例中为空列表)。 后续元素是要评估的列表表达式(在我们的示例中为[ OP SETIT“ SWORD” )。

让我们在IFT子句中解压缩这些表达式,方法是插入一些缩进,括号和注释以使其看起来像LISP(因为Logo本质上是LISP,没有parens,其解析器必须知道每个函数需要的参数数量),然后链接到Logo函数文档。

  (IFT 
(限定
(最后(第一:I)); 要定义的功能名称是项目名称
(LPUT;功能主体是列表的列表
(LPUT;表达式是类似[OP SETIT“ SWORD]的列表
(WORD;将两个参数连接起来得到单词“ SWORD
“”; 这只是将字符串转换为单词
(最后(第一:I))); 这个词是项目名称
[OP SETIT]); SETIT的输出结果,并附加项目名称
[[]]))); 带零参数的空函数附加到

啊! 但是,如果您认为这很难理解,请查看我当时编写的一些FORTH代码!

最后,如果INITITEMS:F参数不为1,则执行DEFINE来删除将函数定义删除的IFF子句。 持续 第一 :我[] 。 显然,这实际上从未被调用,但是您就可以了。

将游戏与徽标顶级解释程序集成在一起的最后一个sneak俩,是CMD字,该字会打印“ COMMAND”提示,然后跳转到徽标TOPLEVEL以读取和解释玩家的命令。 每个冒险单词最终都可以在末尾调用CMD ,以向玩家显示提示。

 到CMD 
公关[]
PRINT1“命令
顶层
结束

我的咖啡现在快要用完了,所以我暂时要解释一下事情,但是您可以在此处阅读程序的其余部分:

 到N 
电影1
结束

到E
电影2
恩多
电影3
恩多
电影4
ENDTO MOVEDIR:DIR
制作“ TRYMOVE项目:DIR项目:RNUM:RMOVES
测试:TRYMOVE = 0
IFT公关[您无法做到这一点。]
IFT CMD
公关“好。
制作“ RNUM:TRYMOVE

ENDTO INVENT
项目-1
CMD
结束

寻找
PRTEM:RNUM:RNAMES
项目:RNUM
CMD
ENDTO项目:LOC
PITEMS2:LOC:ITEMS
ENDTO PITEMS2:LOC:I
如果:I = []停止
如果是第一:I =:LOC打印最后是:I
PITEMS2:LOC BF:I
ENDTO IT
OP:IT
结束

一切
OP“一切
ENDTO GET:ITEM
TEST:ITEM =“一切
IFT GETALLITEMS:项目
如果我有? :ITEM(PR [您已拥有]期间:ITEM)CMD
如果不在这里? :ITEM西野:ITEM
题名:ITEM(-1)
PR SE:ITEM“接过。
CMD
ENDTO TAKE:事情
GET:东西
ENDTO GETALL
GETALLITEMS:项目
ENDTO GETALLITEMS:我
如果:I = [] CMD
测试:RNUM = ITEMLOC最后第一:I
IFT上次使用权:I(-1)
IFT PR SE最后一战:我“接过。
GETALLITEMS BF:I
ENDTO DROP:项目
TEST:ITEM =“一切
IFT DROPALLITEMS:项目
如果没有? :ITEM PR SE [您未携带]单词:ITEM“!CMD
PUTITEM:ITEM:RNUM PR SE:ITEM“已删除。
CMD
ENDTO滴滴
DROPALLITEMS:项目
结束

降落物品:我
如果:I = [] CMD
测试ITEMLOC最后:I =(-1)
IFT上次使用权:I:RNUM
IFT PR SE最后一战:我“被删除。
BFBF:I
在这里结束吗? :项目
本地“ LOC
制作“ LOC ITEMLOC:ITEM
OP ANYOF-1 =:LOC:RNUM =:LOC
ENDTO ITEMLOC:项目
OP ITEMLOC2:ITEM:ITEMS
ENDTO ITEMLOC2:ITEM:I
如果:I = [] OP 0
如果最后第一:I =:项目第一优先:I
OP ITEMLOC2:ITEM BF:I
结束

标题:ITEM:LOC
进行“项目PUTITEM2:项目:LOC:项目
ENDTO PUTITEM2:项目:LOC:列表
如果:LIST = [] OP []
如果LAST FIRST:LIST =:ITEM OP FPUT FPUT:LOC BF FIRST:LIST BF:LIST
OP FPUT FIRST:LIST PUTITEM2:ITEM:LOC BF:LIST
ENDTO SEENO:我
PR SE [我看不见] SE:我“这里!
CMD
结束

要吗? :项目
OP-1 = ITEMLOC:ITEM
结束

到期限:WORD
OP WORD:WORD“。
ENDTO WAVE:ITEM
如果没有? :ITEM PR SE [您没有持有]期:ITEM CMD
如果不是:ITEM =“不需要的东西
如果ALLOF NOT:RNUM = 4 NOT:RNUM = 5 PR [未发生。] CMD
公关[POOF! 场景发生了变化!]
如果:RNUM = 4使“ RNUM 5否则使” RNUM 4

结束

修复:项目
如果我有? :ITEM PR [您必须删除它才能修复它!] CMD
如果不在这里? :ITEM西野:ITEM
如果不是:ITEM =“ MACHINE PR [您无法解决该问题!] CMD
如果不是ITEMLOC,则“ WAND = 0 PR [机器未损坏!] CMD
如果没有? “螺丝刀公关[您没有合适的工具]公关[修复] CMD
PR [您可以放心地修理机器]
PR [螺丝刀。 修复后,[]
PR [机器启动并产生鞭子!]
任务“ WAND 4
CMD
结束

检查:项目
如果不在这里? :ITEM(PR [I SEE NO]:ITEM [HERE!])CMD
如果:ITEM =“ WAN PR [它带有淡入淡出的指示:] PR [”让我和你感到高兴。“] CMD
如果不是:ITEM =“ MACHINE PR SE [我没看到特别的]期间:ITEM CMD
如果不是0 = ITEMLOC“需要公关[需要承担快速标记的问题]公关[修复工作。] CMD
公关[坏了! 您可以通过以下方式修复它:
公关[正确的工具。]
CMD
结束

得分
PR(SE [您的得分是] SCORE2:项目[要点。]
CMD
ENDTO SCORE2:清单
如果:LIST = [] OP 0
如果不是第一优先:LIST =-1 OP SCORE2 BF:LIST
OP(项目2第一:清单)+ SCORE2 BF:清单
无所事事
公关[没事。]
CMD
结束

游戏
OP“ ADVSAVE
ENDTO完成
如果不是:RNUM = 5没有
本地“计分”计分2:项目
如果:SCORE = 0没有
PR SE [您的得分是]:得分
如果:SCORE = 550 PR [完美!]其他打印[还有更多宝藏,想想。]完成
结束