【问题标题】:Saving data in a command-line game, no database [Ruby]在命令行游戏中保存数据,没有数据库 [Ruby]
【发布时间】:2015-09-03 20:32:09
【问题描述】:

我正在使用 Ruby 制作一个简单的命令行游戏,但在没有数据库/HTTP 动态的情况下无法保存一些信息。

例如,假设我要做一个三明治(在游戏中)。我看到了一系列可供选择的成分,如下所示:

[1] Carrot
[2] Banana
[3] Cheese
[4] Tomato

我无法硬编码数字和成分之间的直接对应关系,因为在此之前,我被禁止随机使用几种成分(因此完整的成分数组长了两个项目)。而且我不想提供一个编号为[1] [2] [4] [6] 的列表,因为它会让人感到困惑。

我现在正在做的是硬编码一个字母和一个项目之间的直接对应关系,所以BananaBCheeseC 等等。但这并不理想,特别是因为这是整个游戏中使用的模式,并且在某些情况下它会变得非常不方便,对我和玩家来说都是如此。

那么,我有没有更好的方法来做到这一点?如何将输入与随机生成的列表项相关联,并保存该信息以供以后使用)?

【问题讨论】:

  • 游戏开始时的硬编码哈希...? IE。 {'B' => '香蕉', 'C' => '奶酪'}
  • 但是那样的话,就会有key冲突。例如C 胡萝卜和奶酪。
  • 这就是我现在正在做的事情,使用哈希对输入和数据之间的直接对应关系进行硬编码。我希望能够首先呈现数据并创建对应关系,保存数据,一旦输入发生,通常在网络环境中完成的方式。
  • 为什么不能使用数据库? SQLite 是用于游戏的小型、快速数据库的绝佳候选者。这也有助于避免有人弄乱输入数据。您可以轻松地使用 ORM(如 Sequel)与它对话。否则使用 YAML 文件。
  • 因此您将菜单作为一个数组,您可以使用每个成分旁边的数字(实际上是数字 - 1)作为索引来访问数组中的成分。我没有看到问题。我错过了什么?

标签: ruby command-line saving-data state-saving


【解决方案1】:

我是这样解决的:

Mario Zannone's comment 让我意识到我可以将数组元素的index 用作id,而我一直在看整个事情,就好像它只是文本一样。

所以这是我想出的利用它的代码:

(0...@ingredients.length).each do |i|
    puts "[#{i+1}] #{@ingredients[i]}"
end

这样我现在可以在元素和输入之间直接对应:

choice = gets.chomp.to_i - 1
@selected_ingredient = @ingredients[choice]

【讨论】:

    猜你喜欢
    • 2012-12-02
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多