Мы клонировали 2048, анализировали 2048, но почему мы еще не сыграли? Напишите 555-байтовый фрагмент javascript для автоматического воспроизведения 2048, при этом будет учитываться лучший результат через час (см. Оценку ниже).
Настроить:
Перейти к 2048 и запустить:
a = new GameManager(4, KeyboardInputManager, HTMLActuator, LocalStorageManager);
a
это объект для управления игрой.
Правила:
После настройки вы можете запустить 555 байт javascript из консоли для управления игрой. Исходный код игры можно найти здесь (включая комментарии).
- Он может делать только то, что возможно для пользователя:
a.move(n)
вызвать ключевое действие в любом из 4 направлений.- 0: вверх, 1: вправо, 2: вниз, 3: слева
a.restart()
перезапустить игру. Перезапуск разрешен в середине игры.
- Информация о состоянии игры может быть найдена в
a.grid.cells
. Эта информация только для чтения - Разрешено использование любой из функций, изменение их поведения любым способом (или изменение любых других данных)
- Перемещение разрешено только один раз каждые 250 мс
пример
Просто очень простой пример для начала. Без комментариев и вводит 181 байт .
//bind into new tile function and change m(ove) variable when a tile was moved
b = a.addRandomTile.bind(a);
m = !1;
a.addRandomTile = function() { m = !0; b(); };
//number of move fails
mfs = 0;
setInterval(function() {
//set global moved tracking variable to false
m = !1;
a.move(Math.floor(4 * Math.random()));
m || mfs++;
//restart after 10 moves failed
10 < mfs && (mfs = 0, a.restart());
}, 250);
Оценка и результаты
Я буду бегать отрывки в течение одного часа подряд, и лучший счет будет засчитан. В самом деле, есть шанс, что randombot
выше, победит таким образом, но 1 часа должно быть достаточно, чтобы победить:
- Король
Bottomstacker VII
: 9912 - Королева
Bottomstacker V
: 9216 - Принц
Bottomstacker II
: 7520 - Господь
Bottom and Right
: 6308 - Крестьянин
Randombot
: 1413 Дисквалифицировано за два хода за один интервал (в течение 250 мс)Bottomstacker IV
: 12320
Вопросы-Ответы
- Почему этот вызов не зависит от языка через терминал?
- По той простой причине, что так веселее. Наблюдение за игрой в графическом виде просто намного более завораживающе, чем наблюдение, когда консоль выплевывает цифры. Даже не зная javascript, вы сможете присоединиться к этой задаче, поскольку речь идет не только о языковых возможностях (просто используйте этот инструмент для минимизации кода)
code-challenge
game
javascript
ai-player
sliding-puzzle
Дэвид Малдер
источник
источник
...best score after an hour will count...
чего всего час?Ответы:
Я не могу кодировать JavaScript, поэтому я украл ваш ответ.
Он использует стратегию, которую я также использую.
РЕДАКТИРОВАТЬ: Хорошо, это просто побить ваш счет примерно через 5 минут на моей машине: D
РЕДАКТИРОВАТЬ: Забыл перейти вниз два раза, а не один раз, это код, который вы должны использовать:
Кроме того, в нем есть ошибка, которая перезапускается, когда она не нужна, но я не уверен, как это исправить. РЕДАКТИРОВАТЬ: он в настоящее время имеет рекорд 3116 (через 3 минуты). Я думаю, можно с уверенностью сказать, что этот алгоритм лучше, чем просто делать случайные шаги.
РЕДАКТИРОВАТЬ Более новая версия:
РЕДАКТИРОВАТЬ: еще одна новая версия, эта движется вниз сразу после движения вверх.
РЕДАКТИРОВАТЬ: Обновление: это просто побило мой личный рекорд с довольно сумасшедшим счетом 12596.
РЕДАКТИРОВАТЬ: Эй, я нижний укладчик: D Также:
(На самом деле не изменение, просто сжато.)
5-й раз это очарование? Точно сказать не могу. В любом случае:
и:
Еще одна новая версия:
и:
(Я надеюсь, что это не слишком большая проблема, что это продолжается за экраном игры? Я думаю, что вы могли бы добавить место,
a.over=0
которое часто выполняется. Я когда-нибудь это выясню.)РЕДАКТИРОВАТЬ (снова): я отказался от стандартного режима игры и вернулся к старому способу ведения дел. Сейчас я тестирую дополнение, которое будет всегда объединяться, если есть 2 плитки по 16 или более:
источник
mfs=0
внутрьaddRandomTile
, таким образом он возобновит счет после успешного хода.Правый и нижний бот: 345 байт
Укороченная версия
Длинная версия
В словах
Двигайтесь вниз, затем вправо, если вы не можете двигаться, двигайтесь вверх (или, если вы не можете, двигайтесь влево), если верхний правый и нижний правый угол заполнены, двигайтесь вправо, иначе начните сначала.
Текущий рекорд
Мой лучший результат был 7668, но он был запущен на гораздо большей скорости, чем
t=250
(и, следовательно, косвенно дольше часа).источник
Каким-то образом я натолкнулся на это старое соревнование этим утром, и так как я люблю 2048, я люблю ИИ, и JS - один из немногих языков, которые я в настоящее время хорошо знаю, я решил попробовать.
GreedyBot (
607536 байт)Укороченная версия:
Длинная версия (устаревшая):
Более длинная версия вообще не игралась в гольф (кроме сокращения имен переменных), поэтому ее можно было немного сократить, оставаясь читаемой. Более короткая версия была создана с использованием Closure Compiler (спасибо за ссылку!), Которая в итоге оказалась на уровне 650. С некоторыми пользовательскими изменениями с моей стороны я смог сбрить еще
43114 бит.По сути, он ищет в таблице возможные ходы и всякий раз, когда находит, добавляет свое значение к горизонтальной или вертикальной сумме. После поиска каждого возможного движения он определяет, в каком направлении он должен двигаться, основываясь на том, больше ли сумма H или V, и направлениях, которые он уже пробовал. Вправо и Вниз - первый выбор.
Оглядываясь назад на это, я теперь понимаю, что, если любое из значений не равно нулю, первая попытка сдвинуть плитки в этом направлении гарантированно будет успешной. Возможно, я мог бы упростить раздел решения о переходе к концу, основываясь на этом.
Я оставил эту программу запущенной в течение часа и получил высокий балл
6080
. Тем не менее, в одном из пробных заездов (предминификация) он набрал высокий балл6492
, всего 128 из моих личных лучших6620
. Его логика может быть значительно улучшена, если время от времени перемещать его влево, так как числа накапливаются следующим образом:( РЕДАКТИРОВАТЬ: я оставил его работать немного дольше, и он справился с некоторыми
7532
пунктами. Черт, моя программа умнее меня ....)Еще один интересный момент: в одной из моих неудачных попыток создать что-то полезное, каким-то образом это закончилось так, что в любое время любые две плитки были в одной строке или столбце, они были объединены. Это привело к интересным событиям, так как случайные 2 или 4 неоднократно объединялись с самой высокой плиткой, удваивая ее каждый раз. Однажды он каким-то образом сумел набрать более 11 000 за 15 секунд, прежде чем я его отключил .... XD
Любые предложения по улучшению приветствуются!
источник
Стеклоочистители: 454 байта
Просто идет вправо, вверх, влево, вверх ... повторяя (точно так же, как дворники на автомобиле), если только он не заклинило. Если он застрянет, он попытается выключить дворники и снова включить их. Наивысший результат, который я получил за час, составил 12 156 - однако, большинство из них находятся где-то между 3k и 7k.
Он будет выводить счет в консоль после каждой попытки.
источник
UpAndLeftBot
Как следует из названия, поднимается и уходит, крадя работу Дэвида Малдера и меняя некоторые цифры (я не знаю, Джек, о Javascript, поэтому лучше всего я могу это сделать).
источник