我正在使用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)
我在考虑另一种方法是将对象的套装和值设置为变量,但它比使用事件的参数要麻烦得多。
提前致谢:)
答案 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
当然,更详细的细节,但你可能会发现这种方法更清爽,更容易测试。