如何重构涉及连续集的棘手逻辑?

时间:2010-05-27 12:23:38

标签: ruby logic

这里的规则是用户可以获得10,20和30连胜的徽章。但是用户不能为同一连胜授予多个徽章。我正在跟踪用户模型中的consec wins。

例如,如果用户点击10条纹,则用户将获得10条纹徽章。如果用户处于20连胜,他/她将获得20条纹徽章。如果用户正在进行30连胜,则该用户将获得30条纹徽章。用户不应该获得三个10连胜徽章 - 只有一个10连胜,一个20连胜和一个30连胜。

此外,如果用户达到40连胜,那么用户应该获得10条纹徽章。如果用户击中50,那么他/她应该被授予20条纹徽章。如果用户点击60,则用户应该奖励30条纹徽章。如果用户点击70,则应该向用户授予10条连线。我想你在这里得到的模式。 30条纹奖杯是用户可以获得的最大值。但是用户可以获得无限连胜。

  def check_win_streak(streak)
    badge = 10
    while badge < BADGE::MAX_STREAK_BADGE_SIZE do # MAX_STREAK_BADGE_SIZE = 30

       if streak < badge then
         break
       end

       if (streak % badge == 0) then
         award_streak_badge(badge)
       end

       badge += 10
    end
  end

3 个答案:

答案 0 :(得分:1)

唐和兰迪提出了一般性的想法。这是完整的代码:

def check_win_streak(streak)
  if streak % 10 == 0
    award_streak_badge(streak % badge::MAX_STREAK_BADGE_SIZE)
  end
end

答案 1 :(得分:0)

尝试MOD算术。

将条纹修改为30 - 您将获得在30 ...

的每个波段重复的结果

答案 2 :(得分:0)

摆脱休息的模数,即62 % 30 = 2。然后有划分来获得30个条纹的数量。

Starting with 74
74 % 30 = 14
(74 - 14) / 30 = 2
14 - (14 % 10) = 10
Result: 2x30 streaks and 1x10 streak