C# 为文本冒险存储区域数据的最佳方式是什么?

C# 为文本冒险存储区域数据的最佳方式是什么?,c#,.net,C#,.net,我正在用C#开发一个“Zork”风格的文本冒险,它将有大量不同的区域,包括描述和环境修改器。理想情况下,我不想拥有一个数据库,除非它真的是最好的方法 我需要关于存储/加载此数据的最佳方法的建议 它将包括: 区域描述 环境修改器(窗户打开/损坏,门关闭) 默认情况下显示的项目 我知道你不想要分贝,但你看过了吗?它可能只是做你想做的事。我认为C#为你提供了正确的工具。只需将结构封装到类中。我们在大学的第一个OOP项目就是这个问题!这是OOP的完美案例研究 然后,您可以使用C#的许多序列化方法以您认

我正在用C#开发一个“Zork”风格的文本冒险,它将有大量不同的区域,包括描述和环境修改器。理想情况下,我不想拥有一个数据库,除非它真的是最好的方法

我需要关于存储/加载此数据的最佳方法的建议

它将包括:

  • 区域描述
  • 环境修改器(窗户打开/损坏,门关闭)
  • 默认情况下显示的项目

    • 我知道你不想要分贝,但你看过了吗?它可能只是做你想做的事。

      我认为C#为你提供了正确的工具。只需将结构封装到类中。我们在大学的第一个OOP项目就是这个问题!这是OOP的完美案例研究


      然后,您可以使用C#的许多序列化方法以您认为合适的方式持久存储(加载/保存)。

      将您的冒险“脚本化”为一个大文本文件听起来如何?然后让你的应用程序解析这个文件,在类中构建冒险并从那里运行

      这意味着您可以使用一个简单的文本编辑器编辑冒险。我可以想象,当多个决策可以从一个单一的来源,它可能会成为棘手的可视化链接。然而,在没有专业前端的数据库中,这也很棘手

      更新:

      或者您是否考虑过XML,例如

      <area id="DarkRoom1">
        <description>Dark Room</description>
        <item>Bucket</item>
        <item>Spade</item>
      </area>
      
      
      暗室
      水桶
      铁锹
      

      然后使用它在内存中填充类。

      您可以将数据存储在文件系统(zip文件或文件夹)中

      每个选项都可以存储为文件夹,而所有描述、修改器和其他数据都可以存储为文本文件(xml?)。当用户做出决定时,请转到相应的文件夹并按照绘图进行操作

      例如:

      您想:

      • 开门
      • 请假
      如果用户选择打开门,则转到文件夹门并从此文件夹中的数据文件读取数据

      优点:

      • 简单的
      • 不需要数据库
      • 易于添加新的冒险
      缺点:

      • 回滚决策问题(返回到开始或绘图中的某个点)

      就我个人而言,在这种情况下,我会避免使用数据库,而是使用基于文本的文件格式(可能有两个不同的文件,一个用于初始状态(如地形等),永远不会被修改,另一个用于在游戏过程中要修改的状态(破碎的窗口等);或将整个内容拆分为每个区域的一对静态/动态数据

      有几个原因:

      • 文本文件是人类可读的;因此,您可以在不使用专用编辑器的情况下创建内容,而使用数据库方法,您必须通过查询输入数据,或者编写一个级别编辑器
      • 假设是单人场景,并发性不是问题
      • savegame是将修改后的状态文件复制到savegame文件夹中,或将其打包到单个文件中
      • 您可以轻松地嵌入脚本
      • 您正在处理的数据结构可能足够简单,因此数据完整性不会成为一个严重的问题

      将所有数据序列化到文件中。这将确保用户安装游戏时占用的空间最小,没有任何真正的缺点。当您拥有大量数据时,数据库非常有用,但您正在谈论的是一种文本冒险,您可以将整个游戏内容加载到内存中。一个简单的文件可以很好地实现这一点


      注意,我说的不是xml,而是二进制序列化。任何类型的文本序列化都允许用户偷看您的数据,欺骗或破坏游戏。您也可以轻松地交换序列化数据文件,无论是文本还是二进制。请记住,您的整个“文本”最多可能只有几百KB。

      我会通过放弃C#并用它编写程序来解决您的问题。Inform7是我见过的最棒的编程语言,它是专门为解决您的问题而设计的

      Inform7最棒的一点是,您用一种类似于文本冒险的语言编写文本冒险

      The iron-barred gate is a door. 
      "An iron-barred gate leads [gate direction]." 
      It is north of the Drawbridge and south of the Entrance Hall. 
      It is closed and openable. 
      Before entering the castle, try entering the gate instead. 
      Before going inside in the Drawbridge, try going north instead. 
      Understand "door" as the gate.
      
      这将在游戏中添加一个对象-该对象是一扇门,称为“铁栅栏门”。门被理解为位于两个房间之间,在本例中为吊桥和门厅。如果玩家试图“进入吊桥”,则游戏逻辑将知道这与“向北走”相同,然后门逻辑将决定门是否关闭。等等。这使得编写文本冒险非常容易


      你想使用C而不是像Inform7这样的领域特定语言,有什么特别的原因吗?如果你的目标是学习如何编写C代码或如何构建解析器或其他什么,那就自己动手吧。如果你的目标是编写文本冒险,那么我会使用专门为此设计的语言。

      有很多交互式的我会看看他们的数据格式,这样你就可以重复使用现有的内容和工具来编辑内容

      目前最流行的引擎是Glulx和Z-Machine


      以下是Glulx格式的技术参考:

      [删除-因为这是对另一条被删除评论的回复],但问题也是“在哪里存储它”将结构封装在类中并不能说明在实例化对象之前将填充对象的数据存储在何处。好吧,我想这完全是主观的-不是一个真正有效的问题。一个平面文本文件?这根本不重要。它不会成为瓶颈,没有正确的答案。只需存储它即可任何你认为合适的方式。就我个人而言,我倾向于为我用合适的语义开发的每一款游戏发明一种新的格式