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