替代将Code存储在游戏的数据库中

时间:2016-03-16 18:01:33

标签: ruby-on-rails sails.js

是的,这听起来像个坏主意。但我无法想到更好的方式......

我正在写一个纸牌游戏。玩家打牌。每张牌都有一个动作,根据玩法花费的法力值而变化。我试图使用Sails(node.js)或Rails来做到这一点。示例卡片:

卡1

  

对目标造成2 *法力伤害

卡2

  

治疗3 *法力对目标的伤害

我遇到的问题是随机牌可以召唤生物等。

  

用2 * Mana HP召唤怪物。

当模型的每个实例有不同的操作时,如何为Card模型建立数据库?

我的第一个(可怕的)想法:做一个"动作"在DB(sails.js)中存储模型方法的列:

// Card1: 
console.log(card.method);
// prints: 
"function(m, target){ target.hp= target.hp - m*2}"

// Card2: 
console.log(card.method);
// prints: 
"function(m, target){ target.hp= target.hp + m*3}"

这似乎是一个可怕的想法,即使我的数据库有望在外部无法使用。什么是更好的方式?

1 个答案:

答案 0 :(得分:2)

这听起来像是Single Table Inheritance(STI)的情况。您可以拥有cards,除了type之外还有id(字符串)列,该列将自动填写类名称具体的例子。

然后,您将创建一个层次结构Card,每个类都有自己的特定行为,但仍然共享公共代码并仍然存储在单个表中。这实质上就是STI的工作原理。

例如(假设卡片具有type以及例如strength属性):

class Card < ActiveRecord::Base
  # some common methods for all cards
end

class HarmingCard < Card
  def do_action
    puts "harm #{strengh} x mana damage to target"
  end
end

class HealingCard < Card
  def do_action
    puts "heal #{strengh} x mana damage"
  end
end

class SummoningCard < Card
  def do_action
    puts "summon a monster with #{strengh} x mana"
  end
end