Ruby on rails 如何拥有一个;行动“;将来会在RoR中爆炸吗?

Ruby on rails 如何拥有一个;行动“;将来会在RoR中爆炸吗?,ruby-on-rails,ruby,ruby-on-rails-3,timer,Ruby On Rails,Ruby,Ruby On Rails 3,Timer,好吧,这是一个设计问题。我正在使用RubyonRails3制作一个基于文本的游戏,我不确定实现我想要做的事情的最佳方式。在游戏中,用户得到一堆地精,并可以告诉这些地精做什么。其中一个可用的动作是攻击,你可以假设,这意味着你的部落攻击其他东西,无论是敌对部落还是NPC定居点 如果你选择攻击一个敌对部落,那么你的地精就会去攻击。战斗开始时有一个设定点(比如说,未来10分钟)。现在的问题是,在未来10(或X)分钟内实现作战模拟的最佳方式是什么?因为如果模拟运行得太早或太迟,那么整个战斗结果可能会因对手

好吧,这是一个设计问题。我正在使用RubyonRails3制作一个基于文本的游戏,我不确定实现我想要做的事情的最佳方式。在游戏中,用户得到一堆地精,并可以告诉这些地精做什么。其中一个可用的动作是攻击,你可以假设,这意味着你的部落攻击其他东西,无论是敌对部落还是NPC定居点

如果你选择攻击一个敌对部落,那么你的地精就会去攻击。战斗开始时有一个设定点(比如说,未来10分钟)。现在的问题是,在未来10(或X)分钟内实现作战模拟的最佳方式是什么?因为如果模拟运行得太早或太迟,那么整个战斗结果可能会因对手的行为而改变

(我知道这有点模糊,但对于你们这些已经玩过游戏的人来说,如果模拟太早或太迟运行一秒钟,整个战斗结果可能会改变。)

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

好了。如果我发送了我的攻击,或者想在未来的某个时间做任何事情,那么在Ruby on Rails中做这件事的最佳方法是什么?

简单回答:不要

您应该在数据库中节省时间(现在+10分钟),然后每分钟运行一次cronjob(或者您喜欢的任何操作)。然后,应评估当时应进行的所有战斗。 有关此行为的最佳实践,请参阅


您还可以添加一个检查,检查您收到的每个请求是否都可以进行战斗。这样,当战斗开始时,你会得到更多的随机性,这取决于你网站的流量,这可能是每一秒。记住开始一个线程来评估战斗,这取决于你的计算量。否则,一些用户可能会经历巨大的延迟。

如果您希望ruby on rails在将来发生一些事件,典型的做法是使用cron从外部启动(如simon所建议的),或者使用延迟的作业gem为将来设置作业。您也可以像这样使用rufus scheduler gem:

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