Как стать автором
Обновить

Web Worker Wars

Время на прочтение3 мин
Количество просмотров1.4K
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
Теги:
Хабы:
+34
Комментарии27

Публикации

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн