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

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...)
— Пока их число ограничено
Пока игра в режиме пробы, любое правило может измениться.
Логика его проста: воркер хаотично ходит и хаотично поворачивается, разыскивая врага, как только враг попадает в его поле видимости он начинает стрелять до последнего (из примера в статье убраны почти все комментарии, полный вариант либо в демке, либо в архиве).
Инициализатор битв: 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
Разновидность игр Бой в памяти. Чем-то похожая на Google AI Challenge или HabraWars.

Особенности и правила
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