基于ruby语言的游戏文本 - OOP

时间:2015-04-15 17:46:37

标签: ruby oop

我试图整合文本,用于用Ruby编写的游戏。为此,我想我可以将文本本身保存在哈希中。 我希望用户选择要播放的语言。 (两种语言)。

我已经编写了游戏代码,字典和我已经分开了在另一个文件中打印文本的调用。通过这种方式,我保持代码清洁。

我打算保留哈希值,只包含不同语言的文本。

从控制台运行主文件(my_game.rb)时出现以下错误。

my_game.rb:62:in `enter': undefined local variable or method `eng' for
#<CentralCorridor:0xb7d73d74> (NameError)
           from my_game.rb:35:in `play'
           from my_game.rb:257:in `<main>' code here

我修改了原始代码,可以看作是注释块中的第一段。第一行注释掉的块相当于文本,写在另一个文件中。

class CentralCorridor < Scene

def enter()
    puts "#{Language.get(eng, 'sc_enter')}"
=begin
    puts "The Gothons of Planet Percal #25 have invaded your ship and destroyed"
    puts "your entire crew. You are the last survivieng member and your last"
    puts "mission is to get the neutron destruct bomb from the Weapon Armory,"
    puts "put it in the bridge, and blow the ship up after getting into an "
    puts "escape pod."
    puts "\n"
=end

这是一个似乎是返回错误的方法。我不确定是否应修改它以接受模块中的书面参数。 它在my_game.rb

内实施
def play()
    current_scene = @scene_map.opening_scene()
    last_scene = @scene_map.next_scene('finished')

    while current_scene != last_scene
      next_scene_name = current_scene.enter()
      current_scene = @scene_map.next_scene(next_scene_name)
    end

    # be sure to print out the last scene
    current_scene.enter()
  end
end

我已经在模块中编写了哈希的代码,我在my_game.rb中引用了

require "./hash_compos"
require "./language.rb"

class Scene
  def enter()
    puts "This scene is not yet configured. Subclass it and implement enter."
    exit(1)
  end
end
...

以下代码是我在模块中实现的Dictionary的一部分。该文件名为language.rb。该模块具有相同的名称Language

...
      def Language.get(miDict, key, default=nil)
        # Gets the value in a container for the given key, or the default.
        i, k, v = Language.get_slot(miDict, key, default=default)
        return v
      end

      def Language.set(miDict, key, value)
        # Sets the key to the value, replacing any existing value.
        container = Language.get_container(miDict, key)
        i, k, v = Language.get_slot(miDict, key)

        if i >=0
          container[i] = [key, value]
        else
          container.push([key, value])
        end
      end
...

这是哈希。写在hash_compos.rb。通过在Language.rb中创建的函数,我实现了一个字典,试图包含最小代码。

require './language.rb'

# create a mapping of a scene to text
eng = Language.new()
Language.set(eng, 'The Gothons of Planet Percal #25 have invaded your ship
and destroyed\nyour entire crew. You are the last survivieng member and your
last\nmission is to get the neutron destruct bomb from the Weapon Armory,\nput 
it in the bridge, and blow the ship up after getting into an 
\nescape pod.\n', 'sc_enter')
Language.set(eng, 'txt', 'sc_cc')
...

3 个答案:

答案 0 :(得分:1)

问题来自于您在eng中将hash_compos.rb定义为本地变量

正如this answer中对相关问题所述

  

您无法访问所需文件中定义的局部变量

对此范围问题的快速解决方法是在eng中将hash_compos.rb定义为常量。要实现这一点,只需将变量重命名为ENG并更新引用它的所有文件。

这将使变量可以从需要hash_compos.rb的文件中访问。

答案 1 :(得分:0)

好的,解决方案比起初想象的要简单得多。 我选择遵循两者都提出的标志,所以首先要做的事情。谢谢你们两个。

问题是我正在使用为解决特定问题而构建的严格方法。 我创建了一个新的哈希,我已经把它放到了需要的文本中。 然后我在“主”.rb文件名中指出。 我会写字典的命名法,万一有人关心。填充总是可选的!!!

#!/path/to/your_bin

在文件中指明不是打印文本的最佳方式。所以我建议, 对文件进行编码,好像我们要为帖子应用降价。 一个简单的:

# Encoding: utf-8

我实现了哈希,声明了一个常量变量,如图所示。

VARIABLE = {"key" => "value"}

然后你只需要按名称调用变量。直。 Ruby负责在散列键时提取指示的值。

VARIABLE["key"]

文本格式,适合编码到文件中。逃避序列不是必需的。

问题解决了。

答案 2 :(得分:-1)

问题是,在以下行中您尝试使用eng,但该变量不存在:

puts "#{Language.get(eng, 'sc_enter')}"

因此,根据您在其他地方使用的代码,看起来您可以在该行之前分配到eng

eng = Language.new
puts "#{Language.get(eng, 'sc_enter')}"