Используя state_machine, как я могу получить доступ к аргументам события изнутри: если лямбда - PullRequest
4 голосов
/ 08 марта 2012

Я использую камень state_machine для моделирования карточной игры, и у меня есть условие перехода, которое требует знания аргументов события при рисовании карты.Вот пример кода.

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 Ответ

2 голосов
/ 09 марта 2012

Основная проблема заключается в том, что конечный автомат, вероятно, не принадлежит вашему классу CardGame.Состояние игры лежит в другом месте.Я вижу четыре модели основных доменов:

  • Card
  • Deck
  • Hand
  • Game

A Game будет иметь один или несколько Decks (каждый из 52 Cards) и один или несколько Hands.(Возможно, вы даже захотите иметь класс Player, где у игрока есть -1023 *, ваш звонок).

Например, Deck, вероятно, будет иметь shuffle! иdeal метод.Hand будет иметь метод play.Вот где могла бы жить логика правила.

Класс Game в основном будет состоять из цикла, такого как:

def run
  deal               
  do 
    play_hands       
    check_for_winner 
  while(playing)
end

Более детально в деталях, конечно, но вы можетепосчитайте этот подход более освежающим и более легким для тестирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...