Web Worker Wars

    Web Worker Wars это разработанная мною игра для программистов JavaScript написанная, конечно же, на JavaScript.
    Разновидность игр Бой в памяти. Чем-то похожая на Google AI Challenge или HabraWars.

    Web Worker Wars

    Особенности и правила


    1. Игра представляет собой пошаговую стратегию для 2х и более ботов
    2. Каждый игрок пишет свой Web Worker, который принимает особые команды от движка игры и может возвращать действие
    3. На каждый ход бот имеет 4 очка действия и может распределять их на свои действия.
    4. Бот имеет ограниченное поле зрения (пример подсвечен синим на логотипе).
    — Все объекты, попавшие в поле зрения, передаются в callback действия и могут быть использованы в расчетах
    5. Пока бот может выполнять 2 действия:
    — передвижение на 1 клетку влево, вправо, вверх, вниз, стоимостью 1 ОД
    — прицельный выстрел(бьёт по клетке) на расстояние до 5 клеток, стоимостью 2 ОД, снимает 2 очка жизни или щита у врага или себя

    Далее подробные правила, пример воркера и демка.

    6. Пока у бота не закончились ОД Движок будет запрашивать действия у бота.
    — Если бот не ответил через 2 секунды после запроса действия, его ход завершается, ОД сгорают
    — Если не хватает ОД на действие, то действие не выполняется, ход бота завершается, ОД сгорают
    — Как только выполнилось действие у бота снимается определенное количество ОД
    — Если бот отправил несуществующую команду снимается 1 ОД
    — Бот не может ходить по стенам или по другим игрокам
    — После каждого действия бот может повернуться в любую сторону
    7. Первым ходит тот Воркер, который первый был инициализирован
    — В будущем предполагается переделать: будет ходить первым воркер минимального объема.
    8. Каждый бот имеет 10 Очков Жизни и 2 Очка щита
    — Щит регенерируется на +1 в конце каждой фазы(когда все отходили), но не может быть более 2
    9. Игровое поле имеет размер 10 на 10 клеток стенки поля — стены (поле фактически 8 на 8).
    10. В начале боты размещаются по углам: первый бот в клетке 1,1 второй — 8,8
    11. Игра имеет ограничение — 500 ходов (2000 ОД на всех ботов)
    12. Каждый бот может принимать различные события: (onDamage, onHit, onAfterMove...)
    — Пока их число ограничено

    Пока игра в режиме пробы, любое правило может измениться.

    Пример воркера


    Логика его проста: воркер хаотично ходит и хаотично поворачивается, разыскивая врага, как только враг попадает в его поле видимости он начинает стрелять до последнего (из примера в статье убраны почти все комментарии, полный вариант либо в демке, либо в архиве).
    /**#nocode+*/
    (function (global) {
    /**#nocode-*/
    
        /**
         * Callbacks
         *
         * @namespace Callbacks
         */
        var Callbacks = {
            callback: function (state) {
    
                // its own id
                var id = state.player.name,
                    target,
                    i, c, ok = false, fow = [];
    
                // looking for enemy in fow
                for (i = 0, c = state.fow.length; i < c; i += 1) {
    
                    // push fow elements to 2d array, required for movements
                    if (!fow[state.fow[i].y]) {
                        fow[state.fow[i].y] = [];
                    }
                    fow[state.fow[i].y][state.fow[i].x] = state.fow[i].object;
    
                    if (typeof state.fow[i].object === 'object' && state.fow[i].object.name !== id) {
                        // found!
                        target = {
                            x: state.fow[i].x,
                            y: state.fow[i].y
                        };
                    }
                }
                if (target) { //  target - shoot!
                    Player.post({
                        action: 'shoot', // shoot action
                        options: target, // enemy x y
                        direction: state.player.direction // do not change direction
                    });
                } else { // no target - seeking for target
                    // make random moves
                    if (Math.random() > 0.5) { // move to x
                        while (!ok) { // check if cell not occupied
                            target = {
                                x: state.player.x + (~~(Math.random() * 3) - 1),
                                y: state.player.y
                            };
                            if (typeof fow[target.y] === 'undefined' || typeof fow[target.y][target.x] === 'undefined' ) {
                                ok = true; // cell is free
                            }
                        }
                    } else { // or move to y
                        while (!ok) { // check if cell not occupied
                            target = {
                                x: state.player.x,
                                y: state.player.y + (~~(Math.random() * 3) - 1)
                            };
                            if (typeof fow[target.y] === 'undefined' || typeof fow[target.y][target.x] === 'undefined' ) {
                                ok = true; // cell is free
                            }
                        }
                    }
                    Player.post({
                        action: 'move', // move action
                        options: target,
                        direction: ~~(Math.random() * 5) // random direction
                    });
                }
            },
    
            onHit: function (param) {
    
            },
    
            onDamage: function (param) {
    
            },
    
            onKill: function (param) {
    
            },
    
            onDead: function () {
    
            }
        };
    
        /**
         * Player
         * @namespace Player
         */
        var Player = {
            post: function (data) {
                global.postMessage(JSON.stringify(data));
            }
        };
    
        /**
         * Message listener
         */
        global.onmessage = function (e) {
            var data = JSON.parse(e.data);
            if (data.call && typeof Callbacks[data.call] === 'function') {
                Callbacks[data.call](data.arguments);
            }
        };
    
    /**#nocode+*/
    }(this));
    /**#nocode-*/

    Инициализатор битв: azproduction.ru/web_worker_wars
    Демка 2 бота: azproduction.ru/web_worker_wars/arena.html#ZRV1vYGY&ZRV1vYGY
    4 бота azproduction.ru/web_worker_wars/arena.html#ZRV1vYGY&ZRV1vYGY&ZRV1vYGY&ZRV1vYGY

    Визуализация в демке — запись предыдущего боя воркеров т.е. не realtime.

    Архив со всеми файлами (старая версия): narod.ru/disk/1947680001/web_worker_wars.rar.html
    Проект на гуглокоде code.google.com/p/web-worker-wars

    Интересно ваше мнение насчет игры, предложения по улучшению.

    UPD Теперь можно заливать своих ботов на pastebin.com и использовать id скрипта из pastebin (http://pastebin.com/ZRV1vYGY) для запуска ботов в инициализаторе битв azproduction.ru/web_worker_wars
    Метки:
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 27
    • +1
      это играть как бы в слепую надо… запрограммировать бота и смотреть что получится?
      • +3
        Я к тому, что Ваша разработка интересная, но только это игра, как если и кроссворд тоже игра… Если всё правильно понимаю… Интересно, но долго:) Желаю Вам Удачи!
        • +1
          «Я безумный» или экстремальное программирование :)
          • 0
            если интересует тема, и хочется больше хардкора то вам в CoreWars
          • +1
            Да, так и есть. В эту игру сразу и не поиграть, нужно сперва разобраться, да и найти соперника, который будет тоже писать бота, что наверно сложнее чем разобраться самому.
            • +1
              ZPG — Zero Player Game
            • +1
              «Следует ли перекинуть в «Я безумный»?»
              Определённо =)

              Сама игра чрезвычайно мозговскрывательная.
              • +1
                А по мне очень занимательная идея. Сама идея программирования бота. Был бы интересный проект, где программируешь бота по определенным правилам, и смотришь на сколько он силен. Вроде битва роботов, а тут битва алгоритмов.
                • 0
                  • +1
                    Идея далеко не нова, аналогов море особенно Google AI Challenge, который имеет дюжину языков в арсенале и регулярно проводит бои.
                    • 0
                      Спасибо, я не знал. Вещи очень интересные.
                    • 0
                      Класс! Во всех RTS меня больше всего раздражает необходимость неистово дергать мышкой и заниматься управлением на уровне юнитов. Мне идея подобных скриптов уже давно приходила в голову. Но этот вариант на javascript, и corewars тоже — не совсем то. Это скорее, головоломка для гиков, скрипты весьма и весьма низкоуровневые. Как было бы классно поиграть во что-нибудь вроде старой доброй Total Annihilation, но с возможностью не просто комбинировать несколько шагов с нажатым Shift, но писать небольшие скриптики на высокоуровневом DSL. Что-то вроде: «Взвод №1 обходит территорию по маршруту Х, если обнаружен противник, и количество враждебных юнитов < Y, то атаковать немедленно, иначе послать взводу №2 сигнал о помощи». Может кто-нибудь знает такую игрушку? Чтобы и графика красивая, и геймплей интересный, и вот такие вот скриптики можно было писать в процессе игры и сохранять на потом?
                      • 0
                        Думаю что такого нет, а было бы интересно.

                        Но вот о чем я вспомнил. Давно натолкнулся на игру «Вирус», сделана любителем, сейчас найти не могу. Программирования там не было, но давалось определенное количество очков, и некоторое количество параметров, по которым эти очки можно было распределить(сила вируса, защита, скорость распространения и т.д.).
                        Игра представляла собой поле заполненное клетками, на котором 2 или более вирусов, которые представлялись разными цветами, заполняли по заданным параметрам клети своим сцетом и соприкасаясь взаимодействовали между собой. Довольна забавно.
                        Ещё есть игра «Жизнь».
                        Но все это уже не программирование.
                        • 0
                          Вы ограничены только протоколом, в остальном безграничны (вы вольны писать что угодно в вашем воркере). Тот воркар, который представлен у меня не умнее пылесоса.
                          Вот кусок данных, который вам приходи в callback:
                                   * {
                                   *  "fow":[ // player's field of view: array of items (man or wall)
                                   *      {"object":{"name":0},"x":2,"y":3}, // man item (self or enemy, depend on name)
                                   *      {"object":0,"x":0,"y":3}, // wall item
                                   *      {"object":0,"x":0,"y":2}, // wall item
                                   *      {"object":0,"x":0,"y":4}  // wall item
                                   *      ],
                                   *  "apLeft":1, // action points left
                                   *  "player": // current player info
                                   *      {
                                   *          "x":2, // x
                                   *          "y":3, // y
                                   *          "name":0, // name
                                   *          "direction":3, // direction 0 - top 1 - right 2 - bottom 3 - left
                                   *          "health":10, // hp
                                   *          "shield":2 // sh
                                   *      }
                                   * }
                          
                          Некоторые данные поступают в события: ранение (передается координата откуда стреляли и имя бота), попадание (передается координата цели)

                          Можно запрограммировать так, чтобы бот запоминал карту, стрелял в туман войны, выполнял высокоуровневые команды: moveTo(x, y), moveLeft(), followRoute() и т.п.

                          Я ещё думаю добавить команду разведки. Бот отправляет команду разведка (в точку x,y + её окрестности) за 3 ОД на следующий ход(через ход врага если кончились ОД или на свой ход) ему приходит свое поле видимости плюс то, что было разведано на момент отправки команды.
                          • +1
                            Я вот что прежде всего имею в виду: есть два полюса, первый — это проекты вроде вашего, где нужно знать JavaScript или вообще ассемблер, с неприемлемо высоким порогом вхождения (допустим, я пишу на С++ и никак не связан с вебом. Не учить же мне JS, только чтобы поиграться в танчики. Для не гика это вообще непреодолимый барьер). Второй полюс — обычные стратегии, где максимум можно назначить номер группе юнитов и проложить маршрут движения, щелкнув несколько раз по карте с шифтом. Я мечтаю о варианте, более близком ко второму полюсу, чтобы в обычную стратегию добавить консоль, возможность давать произвольные имена юнитам и точкам на карте, и реализовать самые примитивные конструкции вроде условных операторов и сообщений (приказов? донесений?) между юнитами. Так чтобы мог разобраться даже не программист (писали же геймеры всякие хитрые конфиги к квейку), а уж если ты хоть один язык программирования хоть немного знаешь, то это вообще вопрос 5-и минут. Это могло бы дать проекту широкую аудиторию.

                            А еще вот в голову пришло, на базе такой стратегии можно прививать школьникам интерес к прогаммированию.
                          • 0
                            Единственная игра такого рода с каким-никаким балансом скриптинга и игры — Colobot, графика и язык не ахти, но в своё время было интересно, жаль нет новых аналогов.

                            Прочие, типа Robocode в принципе тоже игры, но они скорее как шахматы, то есть оттачивать мастерство можно бесконечно, но сюжета нет, поэтому быстро надоедает. Стимулом к дальнейшей игре могло бы быть соревнование между игроками, но нет желания тратить много времени на повышение навыков, которые будут применимы только к какой-то конкретной игре.
                            • 0
                              Забыл приложить ссылку на обзор колобота: habrahabr.ru/blogs/programmers_games/59708/

                              P.S. — и когда уже можно будет загружать и хранить изображения вместе с текстом? Постоянно натыкаюсь на старые статьи, изображения в которых уже не работают. А всё потому что статья на одном ресурсе, изображение на другом, и их времена жизни никак не связаны.
                          • 0
                            Мысли приходя постепенно, пока читал про Google AI Challenge, вспомнил.
                            Можно писать советников для торговли на бирже, например для Forex. Тоже очень увлекательно )))
                            • +1
                              Блог «Игры для программистов» наверно более уместен
                              • 0
                                Вы правы, переместил. Не знал, что такой блог есть.
                              • 0
                                А где вообще поиграть в это можно? Или его локально ставить надо?
                                • 0
                                  Поиграть только локально, никакой платформы/сайта нет.

                                  Рецепт:
                                  1. Качайте архив пишите своего воркера можно на основе simpleWorker, регистрируйте его в index.html. И запускаете index.html
                                  Sandbox.registerPlayer('js/yourSuperWorker.js');
                                  Sandbox.registerPlayer('js/simpleWorker.js');

                                  2. Если нужно включить отладку(лог подробный и не избыточный для фаербага), удаляете return; в фукнции log в файле Game.js
                                  log: function (data, groupName) {
                                  return;

                                  В хроме локально не запустится он не разрешает запуск воркеров по протоколу file:// Идеально для теста — FireFox
                                  • 0
                                    А в опере будет работать?
                                    • 0
                                      Да, без лога (или с логом если добавить микрофаербаг).
                                  • 0
                                    Если бы не было воркеров, то игра была бы на много гибче(можно было бы загружать ботов с разных сайтов, а не хостить на одном).
                                    Я ввел воркеров восновном из-за 2х секундного ограничения на ответ(и для исключения утечки данных). Без воркеров это ограничение сделать невозможно, если бот войдет в бесконечный цикл, то все окружение зависнет и игра встанет.
                                  • 0
                                    Еще одна игра «запрограммируй робота». Уже была HabraWars — она отличается, но смысл тот же.
                                    • 0
                                      Проект теперь на гуглокоде code.google.com/p/web-worker-wars/

                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.