1

假设我正在开发一款游戏,并且存在重生之类的东西。用户可能会在 15 分钟后重生。有什么常见的做法可以避免时间作弊吗?我的意思是,没有什么可以阻止用户更改系统时间并将其设置为未来。我知道,这可以通过使用服务器端部分解决,但没有什么可以阻止用户完全禁用网络。PS。该游戏是跨平台的,因此该解决方案对于 antroid 和 iOS 都很有趣。PS2。我知道一些有解决方案的游戏。

4

3 回答 3

1

对于这样的事情,您可以简单地启动自己的计时器,与系统时间完全分开。如果您在玩家死亡时开始 15 分钟倒计时,他们将无法修改您的内部计时器。我对 iOS 开发人员不太熟悉(NSTimer 看起来很有可能),但我知道在 Android 中它很简单:

// create 30 second internal countdown timer
new CountDownTimer(30000, 3000) {

 public void onTick(long millisUntilFinished) {
     // store time remaining in database every 3 seconds in case user exits the game
     dbHelper.updateDeathTimer(millisUntilFinished);
 }

 public void onFinish() {
     // player respawns now
 }
}.start();

为了解决玩家关闭游戏的问题,我建议您还设置内部计时器以定期将其当前状态缓存在数据库中,如果您要坚持使用 15 分钟计时器,请说每 30 秒左右.

下面是一些伪代码,说明当玩家在死亡时退出游戏并且我们的重生计时器仍在进行中时的样子。

// When game resumes check database and begin updated death timer if necessary
onGameResume() {
    if(dbHelper.isUserDead()) {
        // resume respawn timer 
        new CountDownTimer(dbHelper.getRespawnTime(), 15000) {

          public void onTick(long millisUntilFinished) {
            // store time remaining in database every 15 seconds in case user exits the game
            dbHelper.updateDeathTimer(millisUntilFinished);
          }

          public void onFinish() {
            // player respawns now
          }
        }.start();
    }
}
于 2016-07-01T15:44:14.753 回答
0

您可以存储事件的时间(在您的情况下生成),然后对其运行 timeIntervalSinceReferenceDate 并查看它是否超过您的限制(15 分钟)。

iOS 端的风险是应用程序进入后台并且计时器停止。

于 2016-07-01T15:46:15.600 回答
-1

这实际上不是答案,而只是一个想法。如果我们使用 tickCount 会怎样?每个操作系统都有这个属性。例如,Android 中的 android.os.SystemClock.elapsedRealtime()和 iOS 中的[NSProcessInfo processInfo].systemUptime它们应该给出所需的值。

于 2016-08-30T13:16:54.633 回答