首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文字冒险游戏:是否有更优雅的方式存储数据和控制逻辑?

文字冒险游戏:是否有更优雅的方式存储数据和控制逻辑?
EN

Software Engineering用户
提问于 2021-08-25 06:24:00
回答 1查看 742关注 0票数 4

所以在过去的几个月里,我一直在做一个个人项目。这是一个大型的,高度开放的,手工制作的文字冒险游戏,里面充满了笑话和有趣的小惊喜,供我的朋友玩和体验。我有几个基本的原型工作,他们得到了很多“哦酷”和笑声。

我一直在用Python编写代码。我认识到,使用一些引擎,框架或语言专门为这一目的将是容易得多,但我是死心塌地在家里烘焙这件事。这主要是为了学习的目的,但也是为了让我可以做越来越酷的事情,没有人期望一个简单的文本冒险游戏能够做到(比如发送桌面通知,或者读取当前的OS用户名,播放音乐,或者理解命令中的同义词,或者像人类一样逐渐地把东西输入控制台)。

最近,我放弃了Python版本,开始用C#重写它,因为它作为学习工具的用途已经用完了,也因为我对它进行了可怕的编码。我一直在使用巨大的JSON字典,基本上是美化了大量的全局变量,存储了玩家进入的门以及他们所做的选择,这样主脚本(以及我为一些涉及打字和提问的快捷键创建的模块)可以访问它们。

更重要的是,主文件是一个巨大的混乱分支if语句,其中包含的场景,所有可能的方式,故事可能已经展开。这很快就变得不可读和无法维护,而且它完全扼杀了我长期从事这个项目的动力。

我的问题是:一般说来,有什么更优雅、更有条理的方式来做这些事情,尤其是if语句部分?这样做,我现在感觉就像一个天真和原始的解决办法,我觉得必须有一个更明智和可伸缩的方式来组织这类项目。

编辑:一些代码示例来演示这个问题。警告一下,这很糟糕!

代码语言:javascript
复制
while True:
  choices.askchoice("1-entrance", ["yes=enteredCave","go=enteredCave"], speed = 3)
  if save["enteredCave"]:
        break
  else:
        choices.askchoice("2-rejectCave", ["yes=ending-abandonment", "no=enteredCave"])
        ..etc

如您所见,我使用了一个"askchoice“方法(文件开头创建的”选择“自定义对象的静态)来清理漂亮地打印提示符文本、等待输入、然后将适当的布尔值存储到JSON字典的过程。*如果您好奇的话,第一个参数是问题提示符的键(存储在另一个JSON字典中),字符串列表是所有可能的结果。它用那个=符号来解析它。例如,"yes=enteredCave"意味着定义为"yes“同义词的任何输入都会将JSON中的enteredCave布尔值设置为true。然后在我的if森林中再次访问这些布尔人:

代码语言:javascript
复制
while True:
        choices.askchoice("2-interiordescription", ["go&1=gotoDoor1","go&2=gotoSpirits","go&3=gotoDoor3","go&4=gotoDoor4","go&5=gotoDoor5","exit=hasLeftCave"], speed=3)
        if save["gotoDoor1"]:
            doStuff()
        elif save["gotoDoor2"]:
            doStuff()# and then more branching if statements inside this one!
        ...etc

正如您可能知道的那样,...Which造成了完全的混乱。

EN

回答 1

Software Engineering用户

发布于 2021-08-25 10:14:02

你不是第一个写冒险游戏的人;它们是一个非常古老的游戏类别,有很多例子。虽然1983年年起出版的“占卜书”可能有点过时,但它确实有一些伟大的艺术。巨大洞穴的原始FORTRAN也在附近。然后有一个社区建设游戏,主要是以信息语言。

可能采取的办法概述:

  • 桌子驱动的。你在N房间,你往北走,所以你在房间的表格N中找“北”值M,然后把当前的房间设置为M。可以是大数组的文本,或者,在更现代的程序中,是一个数据库。
  • 面向对象的。您可以将动词直接映射到名词上的方法。因此,"READ“变成了查找具有名称"BOOK”的对象,并调用其"READ“方法。
  • 以实体为基础。某种混合:对象不仅有很多方法,而且还附加了“行为”。因此,如果一个对象具有“可读”行为,则可以读取它(调用它的可读行为对象,该对象可能与其他对象共享)。如果没有,则会得到一个通用的“无法执行”错误。
  • 元语言。信息是一种专门为编写冒险游戏而设计的语言,它在许多平台上都有实现。
票数 9
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/431348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档