使用state_machine,我如何从:if lambda中访问事件参数

时间:2012-03-08 16:23:56

标签: ruby state-machine

我正在使用state_machine gem来模拟纸牌游戏,我有一个转换条件,需要在绘制卡片时知道事件参数。这是一些示例代码。

class CardGame
  state_machine do
    before_transition :drawing_card => any, :do => :drawn_card
    event :draw_card
      transition :drawing_card => :end_of_round, :if => lambda {|game|
        # Check goes here, I require knowing which card was taken
        # which is passed as arguments to the event (:ace, :spaces)
      }
    end
  end

  def drawn_card(value, suit)
    # I can access the event arguments in the transition callbacks
  end
end

game = CardGame.new
game.draw_card(:ace, :spades)

我在考虑另一种方法是将对象的套装和值设置为变量,但它比使用事件的参数要麻烦得多。

提前致谢:)

1 个答案:

答案 0 :(得分:2)

这里的主要问题是状态机可能不属于您的CardGame类。游戏状态位于别处。我可以看到四种主要的域模型:

  • Card
  • Deck
  • Hand
  • Game

Game将有一个或多个Decks(每个Cards}和一个或多个Hands。 (你甚至可能想要一个Player课程,其中一个玩家有一个Hand你的电话。

例如,Deck可能会有shuffle!deal方法。 Hand将采用play方法。这是规则逻辑可能存在的地方。

Game类主要由以下循环组成:

def run
  deal               
  do 
    play_hands       
    check_for_winner 
  while(playing)
end

当然,更详细的细节,但你可能会发现这种方法更清爽,更容易测试。