如何让RoR中的“行动”在未来发生?

时间:2011-03-16 16:53:06

标签: ruby-on-rails ruby ruby-on-rails-3 timer

好吧,这是一个设计问题。我正在使用Ruby on Rails 3制作基于文本的游戏,我不确定实现我想要做的最好的方法。在游戏中,用户获得了一堆地精,并且可以告诉那些哥布林要做什么。其中一个可用的操作是攻击,你可以认为,这意味着你的部落攻击别的东西,无论是对立的部落,还是NPC的解决方案。

如果你选择攻击一个对立的部落,那么你的哥布林就会进攻。战斗开始时有一个设定点(让我们说,未来10分钟)。这是一个问题,在未来的10(或X)分钟内实现战斗模拟的最佳方法是什么?因为如果模拟运行太快或太晚,那么整个战斗的结果可以通过对手所做的改变。

(我知道这有点模糊,但对于那些已经玩过Ogame的人来说,如果模拟过早或过晚运行,整个战斗结果都会改变。)

我正在寻找实现在未来X时间运行某些东西的方法(this episode和之前的两个),但它似乎没有针对需要精确运行的东西进行调整时间X.我也查看了Ruby计时器,但似乎没有一个一致的,就像在java中一样,也不会自动使数据持久化。我也希望使用低耦合,也许使用观察者模式。

所以你有它。如果我将来发送攻击,或者想要时间X ,那么在Ruby on Rails中执行此操作的最佳方式是什么?

2 个答案:

答案 0 :(得分:2)

简单回答:不要

您应该将时间(现在+ 10分钟)保存在数据库中,然后每分钟运行一次cronjob(或者您喜欢的任何内容)。然后应该评估当时应该进行的所有战斗。 有关此行为的最佳做法,请参阅A cron job for rails: best practices?

你还可以添加一张支票,检查是否可以在每次请求时进行战斗。通过这种方式,当战斗准确开始时,您将获得更多随机性,并且根据您网站的流量,这可能就像每一秒。记得开始一个线程来评估战斗,具体取决于你的计算量。否则一些用户可能会遇到大量滞后。

答案 1 :(得分:0)

如果你希望将来某些事件发生在ruby on rails上,典型的事情就是使用cron从外部触发(如simon建议的那样)或使用delayed_job gem并为将来设置一个工作。你也可以像这样使用rufus-scheduler gem:

scheduler.in '10m' do
    puts "something happening 10 minutes from now"
end