2010-05-27 1 views
1

Правило на работе заключается в том, что пользователям могут быть присвоены значки для полосы 10, 20 и 30. Но пользователь не может быть награжден несколькими значками за ту же полосу. Я отслеживаю достижения consec в пользовательской модели.Как реорганизовать сложную логику с последовательными наборами?

Например, если пользователь попадает в 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 

ответ

0

попытка MOD арифметика.

моды полосы на 30 - и вы получите результаты, которые повторяются в каждой полосе 30 ...

0

Modulus, чтобы избавиться от остатков т.е. 62 % 30 = 2. Затем есть деление, чтобы получить количество 30 полос.

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

Дон и Рэнди дали общую идею. Вот полный код:

def check_win_streak(streak) 
    if streak % 10 == 0 
    award_streak_badge(streak % badge::MAX_STREAK_BADGE_SIZE) 
    end 
end 
Смежные вопросы