我正在使用
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)
我在想另一种方法是将对象的套装和值设置为变量,但它比使用事件的参数要麻烦得多.
提前致谢 :)
最佳答案 这里的主要问题是状态机可能不属于您的CardGame类.游戏状态位于别处.我可以看到四种主要的域模型:
>卡
>甲板
>手
>游戏
游戏将有一个或多个甲板(每个52卡)和一个或多个手. (你甚至可能想要一个Player类,玩家有一个Hand,你的通话).
举个例子,甲板可能会有一个洗牌!和交易方法.一只手将有一个游戏方法.这是规则逻辑可能存在的地方.
Game类主要包含一个循环,如下所示:
def run
deal
do
play_hands
check_for_winner
while(playing)
end
当然,更详细的细节,但你可能会发现这种方法更清爽,更容易测试.