Rails - 如何模拟玩家的能力

时间:2015-12-31 17:19:39

标签: ruby-on-rails ruby

我正在使用RoR制作基于文本的游戏。但是,我不确定如何在不为每种不同的能力创建类或功能的情况下实现玩家所具有的不同能力。

例如,在Java中,我很可能实现接口或抽象类来提供功能,而不必一次又一次地重复相同的代码,如果它是某种类型的能力(例如攻击,buff,状态效果等) 。)

虽然我已经看到强迫Ruby / Rails拥有抽象类的事情,而不是这样做,但我知道必须有一些方法可以做到这一点,而不必强迫Ruby进入类似Java的语法。

我自己发现的最接近的答案是使用元编程实质上实现构建器设计模式,这将允许代码从数据库中的值列表中动态构建功能。

有没有更简单的方法来动态生成类似于Java或C#抽象的能力?

2 个答案:

答案 0 :(得分:0)

最好的方法是参加一些很好的导轨教程。

要有耐心,并学习基础知识,然后你就能完成你的项目。 Ruby on rails将是您项目的一个很好的框架

您不需要任何元编程。

模型,特别是活动记录模型,是添加标准功能的类,可以更轻松地构建复杂的站点。

活动记录模型还会将数据备份到数据库中。

仅供参考我假设您希望游戏在浏览器中运行,并且可能是多人游戏。否则,你真的不需要铁轨,但我仍然建议你使用它。

关于抽象类。别担心。您将声明您的Character类,并为其提供所有玩家类型共有的方法建模功能。

您还关注实施100个课程。您需要区分的是状态和行为。您的许多角色将具有相同的行为,只是不同的初始状态。您只需要子类来创建特殊行为。

class Character
  DEFAULTS = {strength: 10, sex: :male} # etc
  def initialize(opts = {})
    opts = DEFAULTS.merge(opts)
    @strength = opts[:strength]
  end
  def strength
    # compute and return the strength common to all player types
    # for now:
    @strength
  end
  def wound(level)
    # update player state based on player getting wounded
    # for example:
    @strength = [0, @strength-level].max
  end

  # etc
end

现在,您只需要在计算字符行为的方式时进行子类更改,否则初始化程序将提供不同的字符状态。例如,上面的基类已经可以仅基于强度和性别产生无数种字符。

但是说你有一个僵尸角色

class Zombie < Character
  def wound(level)
    super if level > 10
  end
end

现在&#34;行为发生变化&#34;所以你需要子类化并修改当僵尸受伤时会发生什么事情(除非你真的打击他,否则没有任何反应。)

正如您所看到的,子类不需要包含重新定义所需行为所需的代码。

Java的抽象类所给你的所有内容都是&#34;声明&#34;子类必须实现的其他方法。您可以通过在父类中创建这些方法并在引发错误的情况下在ruby中执行此操作&#34;必须实现&#34;。

答案 1 :(得分:0)

对于玩家的能力,一种方法是命名它们(例如使用实现该行为的方法的名称),并将它们存储在模型中的数组中,例如:使用serializeHow can I persist an array to the database in Ruby on Rails?

对于行政权力,我建议在https://railscasts.com/上查看一些教程。

搜索authorization

最简单的方法是使用CanCan gem: http://railscasts.com/episodes/192-authorization-with-cancan

更精细的授权规则的另一个宝石是声明授权: http://railscasts.com/episodes/188-declarative-authorization