Category: игры

Про счёт в "2048".

Сколько минимально получится набрать очков пока победишь в игре "19842048". Принцип там, суда по яваскриптам, "score += merged;", т.е. какую плитку составил из двух вдвое меньшего значение, столько и прибавляется к счёту. Т.е. чтобы узнать, например, сколько принесеёт плитка в 128, надо взять 128 и прибавить очки за каждую из плиток в 64, из которых она составилась. Плитки в 2 (и иногда в 4) накидываются случайным образом по штуке за ход.

В общем, выводить аналитическую формулу я не захотел, а понял, что рекурсивно посчитать проще. Набросал скриптик с выводом промежуточных значений на своём родном LLCPL:
11{,a!pA 2={4}{A 1-R!+x+ 1 1 A for{-x 2*}*!+}?!+x 13 chr + 10 chr + ' $f;} r!x!
("+x 13 chr + 10 chr + ' $f" и есть этот, в принципе лишний, вывод промежуточных значений). Получаю 20480. Вспоминаю, что в момент выигрыша счёт обычно был меньше, при этом на поле были ещё собранные плитки разного достоинства. Сегодня уточнил - да (после последней выигранной игры я решил закрыть окно и пока больше не играть - затягивает, при этом состояние игры осталось в localStorage), последняя игра была выиграна при меньше счёте. И тут меня осенило - выпадают же не только "2", но и "4", надо бы пересчитать с учётом того, что всё бы начиналось с "4". Переделал скриптик:
11{,a!pA 3={8}{A 1-R!+x+ 1 1 A for{-x 2*}*!+}?!+x 13 chr + 10 chr + ' $f;} r!x!
Получил 18432.

В общем, где-то между ними... у меня в последней игре, например, счёт 20384, из которых на плинку "2048" приходятся от 20184 до 20248 (зависит от того, сколько двоек и четвёрок выпало для составления "лишних" плиток)...

P.S. Я понимаю, что конструкция "1 1 A for{-x 2*}*!" для вычисления A-той степени числа 2 выглядит неэлегантно, надо бы над LLCPL поработать...