Вадим Темкин (vmtcom) wrote,
Вадим Темкин
vmtcom

Раскрутка geoguessr.

Я уже несколько недель убиваю по пару часов в день на 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 очков. ????

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

Tags: бродилка
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 2 comments