正如其他答案所提到的那样,24小时方法对多个时区更友好,并且就像为每个用户存储最后一个成功的时间戳一样,其编码也很容易。
它还具有实际要求用户每天与应用进行交互以获取所有日常操作的“好处”。如果说要进行午夜重置,则用户可以在11:59 PM,然后在12:00 AM再次执行操作。他们可以隔天这样做,但仍然可以执行所有操作。对于某些应用程序,日常操作的目的是使用户每天与应用程序进行交互,因此不太理想。
还有第三种选择可以避免两者的UI陷阱,但是很难编码。
3)在(n-0.75)* 24小时内没有超过n个动作的条纹
它确实需要存储两个变量,但是它允许不试图滥用系统的人在一天中的任何时间都可以使用其一项操作,而不必担心时区和重置。
它还可以防止任何人使用多个“额外”操作。
因此,实际实施算法需要存储连胜的开始时间,最后一次播放时间以及连胜中的动作数。
跟踪上一个动作时间可以使您拒绝两个过于靠近的动作。您可以将限制设置为少于24小时,因为条纹可以防止在一天中的早些时候爬行。
只要您每天采取行动,条纹就会持续不断。如果采取某项措施意味着您在连胜中要采取的行动多于几天,那么它将被拒绝。这样可以防止缓慢向前爬行,并打包“额外”动作,因为条纹的开始时间不会改变。
一些伪代码来实现检查和跟踪时间:
//precondition: streakStart and lastAction are initialized as in the far past
// streakCount is initialized as 0
graceHours=18;
checkAllowed(currentTime,&streakStart,&streakCount, &lastAction){
diffhours=hoursDifferent(lastAction,currentTime);
if(diffhours< 24 - graceHours){
return false;
}
diffhours=hoursDifferent(streakStart,currentTime);
if(diffhours <= 24*streakCount - graceHours){
return false;
}
if(diffhours > 24*(streakCount+2)-graceHours){
streakStart=currentTime;
streakCount=0;
}
streakCount++;
lastActionTime=currentTime;
return true;
}
作为额外的奖励,如果您需要的话,您还会获得连胜柜台。