代码之家  ›  专栏  ›  技术社区  ›  Liggi

存储区域数据的最佳方式是什么?

  •  5
  • Liggi  · 技术社区  · 15 年前

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

    它将包括:

    • 默认情况下存在项
    8 回复  |  直到 15 年前
        1
  •  7
  •   Kirk Broadhurst    15 年前

    将所有数据序列化到文件。当用户安装游戏时,它将确保最小的占地面积,没有任何真正的缺点。当你有很多数据的时候,数据库是很好的,但是你谈论的是一个文本冒险,你将把整个游戏内容加载到内存中。一个简单的文件可以很好地解决这个问题。

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

        2
  •  13
  •   Eric Lippert    15 年前

    我可以通过放弃C#并用C语言编写程序来解决你的问题 Inform7 . 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代码,或者如何构建解析器,那么一定要自己动手。如果你的目标是写一个文本冒险,那么我会用一种专门为此设计的语言。

        3
  •  2
  •   Bryan Legend    14 年前

    现在已经有很多交互式小说引擎了。我会看看他们的数据格式,这样你就可以重用现有的内容和工具来编辑内容。

    目前最流行的发动机是Glulx http://eblong.com/zarf/glulx/ http://en.wikipedia.org/wiki/Z-machine

    以下是Glulx格式的技术参考: http://eblong.com/zarf/glulx/technical.txt

        4
  •  1
  •   spender    15 年前

    SQL Server Compact Edition ? 它可能只是做你想做的。

        5
  •  0
  •   Rushyo    15 年前

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

        6
  •  0
  •   El Ronnoco    15 年前

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

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

    更新:

    或者你考虑过XML,例如。。。

    <area id="DarkRoom1">
      <description>Dark Room</description>
      <item>Bucket</item>
      <item>Spade</item>
    </area>
    

        7
  •  0
  •   Szymon Kuzniak    15 年前

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

    例子:

    是否要:

    • 离开

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

    赞成的意见:

    • 易于添加新的冒险

    欺骗:

    • 回滚决策问题(返回到起始点或绘图中的某个点)
        8
  •  0
  •   tdammers    15 年前

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

    有几个原因:

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