Как сделать так, чтобы в будущем «действие» прошло в RoR? - PullRequest
0 голосов
/ 16 марта 2011

Хорошо, это вопрос дизайна больше всего на свете.Я делаю текстовую игру с использованием Ruby on Rails 3, и я не уверен, что это лучший способ реализовать то, что я хочу сделать.В игре пользователь получает кучу гоблинов и может сказать этим гоблинам, что делать.Одним из доступных действий является атака , что, как вы можете предположить, означает, что ваше племя атакует что-то еще, будь то вражеское племя или поселение NPC.

Если вы решите атаковатьпротивоборствующее племя, тогда ваши гоблины отправляются в атаку.Есть время, когда битва начнется (скажем, через 10 минут).Вот вопрос, каков наилучший способ реализовать симуляцию битвы ровно через 10 (или Х) минут в будущем? Потому что, если симуляция будет запущена слишком рано или слишком поздно, тогда весь результатбитвы могут быть изменены тем, что делает противник.

(я знаю, что это немного расплывчато, но для тех из вас, кто играл в Ogame , результаты битвы могут измениться, если симуляциявыполняется секунда слишком рано или поздно.)

Я искал способы реализовать запуск чего-либо в X раз в будущем ( этот эпизод и два предыдущих), но этоне похоже, что он настроен на что-то, что должно быть запущено точно во время X. Я также обратил внимание на таймеры Ruby, но, похоже, нет последовательного, как в java, и они не делают автоматическиданные постоянные.Я тоже надеялся на слабую связь, возможно, используя паттерн наблюдателя.

Итак, у вас это есть.Если я отправлю свою атаку или захочу сделать что-нибудь ровно в время X в будущем, каков наилучший способ сделать это в Ruby on Rails?

Ответы [ 2 ]

2 голосов
/ 16 марта 2011

Простой ответ: не

Вы должны сэкономить время (сейчас + 10 минут) в базе данных, а затем запускать cronjob каждую минуту (или что вы предпочитаете). Затем следует оценить все бои, которые должны быть проведены в то время. Лучшие практики по этому поведению смотрите в Задание cron для рельсов: лучшие практики?

Вы также можете добавить проверку, можно ли бороться с каждым полученным вами запросом. Таким образом, вы получите чуть больше случайности , когда бой начнется точно, и в зависимости от трафика вашего сайта, это может быть похоже на каждую секунду. Не забудьте запустить поток, чтобы оценить бой, в зависимости от объема ваших расчетов. В противном случае некоторые пользователи могут испытывать большие лаги.

0 голосов
/ 16 марта 2011

Типичная вещь, которую нужно сделать, если вы хотите, чтобы какое-то событие произошло в будущем с ruby ​​на рельсах, - это использовать cron для внешнего запуска (как предложил Саймон) или использовать гем delayed_job и установить работу на будущее.Вы также можете использовать гем rufus-scheduler следующим образом:

scheduler.in '10m' do
    puts "something happening 10 minutes from now"
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...