Как предотвратить обман на флеш игре, замедляя процессор?

Я разработал флеш-игру для AS3, похожую на Music Challenge на Facebook, в которой вам нужно угадать из выбора песен, из которых играет одна, оценка основана на том, сколько вы догадались за 30 секунд, этот тайм-аут обрабатывается экземпляром Timer.

Все работает хорошо, но кто-то отметил, что, уменьшая производительность процессора, таймер работает медленнее, позволяя пользователям играть дольше, угадывать больше песен и, в конечном итоге, получать более высокий балл, а затем я провел некоторое исследование и прочитал, что для предотвращения этого мне нужно использовать системное время, проблема в том, что я не знаю, как это сделать.

Любая помощь очень ценится.

1 ответ

Решение

Вы можете иметь повторяющийся таймер с коротким интервалом, 100 мс или около того, и проверить new Date().getTime() на каждом тике. По умолчанию новый Date имеет текущее системное время, и getTime() дает вам время в миллисекундах для более простого сравнения. Сравните это со временем начала и окончания игры, если прошло не менее 30 секунд. Что-то вроде:

import flash.utils.Timer;
import flash.events.TimerEvent;

var ticker:Timer = new Timer(100, 0);
ticker.addEventListener(TimerEvent.TIMER, checkElapsedTime);

var startTime:Number = new Date().getTime();
ticker.start();

function checkElapsedTime(e:TimerEvent):void {

    var now:Number = new Date().getTime();

    if (now - startTime >= 30 * 1000) {

        // End the game and stop the ticker.

        ticker.stop();
        ticker.removeEventListener(TimerEvent.TIMER, checkElapsedTime);
    }

}

Очевидно, что при очень медленном таймере все еще есть небольшое отставание, так что на всякий случай я бы запустил ту же самую проверку при отправке ответа и проигнорировал бы ее, если бы это было после установленного срока.

Наконец, чтобы проверить, изменил ли пользователь свои системные часы, вы можете сохранить предыдущие now и убедитесь, что новый now всегда больше.

Другие вопросы по тегам