Раскрутка geoguessr.

Jun 01, 2013 15:58

Я уже несколько недель убиваю по пару часов в день на geoguessr, дошел уже до абсолютного результа 32395. Пока не надоело. Хотя уже начал подумывать, а вот если бы надо было бы балансировать точность со временем, да если бы можно было бы сравнивать свои результаты с другими игроками на тех же данных - как игра это было бы интереснее. С такими мыслями полез в исходный JS код.

Для себя записал свои находки и непонятки.

1. Выбор места.

Области игры ограничиваются набором Antarctica, Australia, Brazil, Canary Islands, Chile, East Russia, Europe, Hawaii/Midway, Israel, Japan/Korea, North Russia, North America, Singapore, Southern Africa, Svalbard, Thailand/Laos, West Russia, каждая из которых задается более или менее подробным многоугольником прямо в тексте. Желание избежать океаны и непокрытые Гуглом участки суши совершенно понятно. Ограничивающие многоугольники наверняка взяты из каких-то общедоступных ресурсов.

Дальше генерируется случайная точка, но каким-то диковатым способом:
getLat: function () {
                    var a = d.randomBetween(-90, 90),
                        f = d.randomBetween(0, 60),
                        c = d.randomBetween(0, 60),
                        h = d.randomBetween(0, 60);
                    return a + "." + f + c + h}
Т.е. в какой-то момент автор думал про градусы/минуты/секунды, но потом все ушло в градусы с десятичными дробями (как просит гугловский интерфейс) и, в результате, в покрытие карты каким-то интересным тартаном.

Затем программа проверяет попали ли мы в наш набор областей, и, если да, запрашивает у Гугла есть ли у него панорама в радиусе 1км от этой точки. Если нет, то радиус увеличивается в десять раз, пока не найдется. Гугл обещает, что если радиус запроса до 50м, то он вернет ближайшую к запрашиваемой точку. Если радиус больше 50м (как в нашем случае), то он возвращает какую-нибудь точку с панорамой.

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

2. Подсчет очков.

Здесь логика от меня полностью ускользает. Сначала программа запрашивает у Гугла расстояние между показанной точкой и угаданной (все правильно, Гугл делает вычисления по геодезической линии, без проблем) - округляется до метра и показывается в километрах. (0.001км я получаю регулярно, нуля пока ни разу не было).

А вот формула для вычисления очков:

calculatePoints: function (a) {
                    a = (earthHalfCircumference - a) / 1E7;
                    return round(2100 * (1 / (1 + exp(-4 * a + 5.2)) + 1 / exp(-8 * a + 17.5) + 1 / exp(-30 * a + 61.2) + 500 / exp(-250 * a + 506.7))) }

Что это может означать? Во-первых у них earthHalfCircumference почему то равна 20037580, хотя радиус Земли у Гугла 6378137м, и соглано Гуглу же  6378137 * π =20037508.3428. Ладно, транспонировали две последние цифры при копировании. Почему-то они пишут 1/exp(-x) вместо того, чтобы писать exp(x). Простим. Но чего они хотели добиться?

Максимальное значение этой функции как есть - 2479, (при правильном значении полуокружности - 6473), при 100м отклонения - 6476, при километре - 6395, при 10км - 5722, при 100км - 3218, при 500км - 2438, 1000км - 2180, 10000км - 492, и если ткнуть в антиподов (забыв о транспонированных цифрах) - 12 очков. ????

Может мне бросить все, и сделать правильную версию игры?

бродилка

Previous post Next post
Up