Objective-C中的对数计算

时间:2014-02-19 18:43:17

标签: ios objective-c logarithm

我正在使用Sprite Kit构建游戏,我希望根据自开始游戏以来的时间逐渐增加难度(从1.0开始)。

有人建议我应该使用对数计算,但我不确定如何在Objective-C中实现它。

- (float)difficulty
{
  timeSinceStart = ???; // I don't what kind of object this should be to make it play nice w/ `log`
  return log(???);
}

更新#1

我知道我需要使用log方法,但我不确定需要传递给它的值。

3 个答案:

答案 0 :(得分:1)

Objective C是C语言的超集,因此您可以使用“math.h”。

从“math.h”计算自然对数的函数是double log(double x);

修改

由于您希望难度随时间而增加,您可以将时间作为参数传递给log(double x)。如何使用它来计算和改变“难度”是一个完全不同的问题。

如果要更改曲线的形状,请将表达式乘以常量,如2*log(x)中所示,或将参数乘以常量,如log(2*x)中所示。您必须查看各个曲线,以了解哪种曲线最适合您的特定应用。

答案 1 :(得分:0)

log(1.0) == 0开始,您可能需要进行一些缩放和翻译。使用类似1.0 + log(1.0 + c * time)的内容。在零时刻,这将给出1.0的难度,并且随着时间的推移,难度将以逐渐减慢的速度增加,其速率由c确定。像c = 0.01这样的小值会缓慢上升,较大的值会更快上升。

答案 2 :(得分:0)

@pjs给出了一个非常明确的答案。至于如何计算时间:你可能想要实际玩的时间,而不是自启动游戏以来经过的时间。

所以你需要跟踪比赛后的总比赛时间。

我建议你在NSUserDefaults中创建一个条目。您可以使用NSUserDefaults方法setDouble:forKey:doubleForKey:

将双值保存并加载到用户默认值

我会创建一个实例变量startPlayingTime,输入double

当您开始运行游戏动作时,使用

捕获开始时间
startPlayingTime = [NSDate timeIntervalSinceReferenceDate];

当用户将游戏/退出传递到后台时,请使用

NSTimeInterval currentPlayTime =  [NSDate timeIntervalSinceReferenceDate] - startPlayingTime;

然后读取用户默认值播放的总时间,向其添加currentPlayTime,并将其保存回用户默认值。

然后您可以根据

制作游戏难度
difficulty = log(1+ c * totalPlayTime);

(如上面的pjs所解释)并为C选择一些合适的值。