所以在过去的几个月里,我一直在做一个个人项目。这是一个大型的,高度开放的,手工制作的文字冒险游戏,里面充满了笑话和有趣的小惊喜,供我的朋友玩和体验。我有几个基本的原型工作,他们得到了很多“哦酷”和笑声。
我一直在用Python编写代码。我认识到,使用一些引擎,框架或语言专门为这一目的将是容易得多,但我是死心塌地在家里烘焙这件事。这主要是为了学习的目的,但也是为了让我可以做越来越酷的事情,没有人期望一个简单的文本冒险游戏能够做到(比如发送桌面通知,或者读取当前的OS用户名,播放音乐,或者理解命令中的同义词,或者像人类一样逐渐地把东西输入控制台)。
最近,我放弃了Python版本,开始用C#重写它,因为它作为学习工具的用途已经用完了,也因为我对它进行了可怕的编码。我一直在使用巨大的JSON字典,基本上是美化了大量的全局变量,存储了玩家进入的门以及他们所做的选择,这样主脚本(以及我为一些涉及打字和提问的快捷键创建的模块)可以访问它们。
更重要的是,主文件是一个巨大的混乱分支if语句,其中包含的场景,所有可能的方式,故事可能已经展开。这很快就变得不可读和无法维护,而且它完全扼杀了我长期从事这个项目的动力。
我的问题是:一般说来,有什么更优雅、更有条理的方式来做这些事情,尤其是if语句部分?这样做,我现在感觉就像一个天真和原始的解决办法,我觉得必须有一个更明智和可伸缩的方式来组织这类项目。
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森林中再次访问这些布尔人:
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造成了完全的混乱。
发布于 2021-08-25 10:14:02
你不是第一个写冒险游戏的人;它们是一个非常古老的游戏类别,有很多例子。虽然1983年年起出版的“占卜书”可能有点过时,但它确实有一些伟大的艺术。巨大洞穴的原始FORTRAN也在附近。然后有一个社区建设游戏,主要是以信息语言。
可能采取的办法概述:
https://softwareengineering.stackexchange.com/questions/431348
复制相似问题