Спортивное программирование

индекс
148,80

HabraWars — альфа версия

HabraWars

Позавчера я озвучил идею создания игры для программистов и проведения соревнования среди хабражителей. Идея стала популярной, а я, как и обещал, выкладываю первую (очень сырую) версию симулятора.

Для нормальной работы необходима свежая версия Firefox или Google Chrome. Возможно, будет также работать в Сафари, потому что она тоже полностью поддерживает тег canvas из HTML5 (буду рад помощи в тестировании и отладке).

Собственно, вот адрес: habrawars.appspot.com.

Сайт развернут на серверах корпорации Света и Добра, авторизация тоже через них.

Сам симулятор выглядит вот так:


Код роботов можно писать на Javascript прямо на сайте и сохранять на сервере. В разделе «Помощь» описаны основные правила.

Позже будет возможность проводить турниры с другими участниками на сервере, чемпионаты, рейтинги и т. п.

Приглашаю к тестированию и обсуждению.

UPD: может быть кто-нибудь знает хороший WYSIWYG-редактор на JS с подсветкой синтаксиса JS? :)
UPD2: Поставил редактор CodePress — проверяем...
UPD3: CodePress не оправдал надежд — заменен на CodeMirror.
+101
8 ноября 2009, 20:26
49

комментарии (253)

+3
spyfzm #
По-моему — хорошая затравка для игры. Надеюсь, игр будет несколько.
0
P_r_i_m_a_t #
Конечно, можно же каждый месяц, например, менять правила/модель — одна надоест быстро.
0
FTM #
Выглядит забавно.

В Opera, кстати, нереально тупит.
+3
P_r_i_m_a_t #
В Опере поддержка canvas пока неполная и сырая, поэтому в ней нормально работать и не должно.
0
conturov #
В 10 у меня все отлично работает :)
0
P_r_i_m_a_t #
Хм, а версия какая? Наверное допилили уже.
0
conturov #
Один бот бегает.
Должно ведь больше?
0
ramovsky #
:)
Я тоже думал, что работает. Качай Файерфокс. Хром не покатит. Тут дебагер нужен.
0
P_r_i_m_a_t #
Должно быть 5 ботов и статистика в правой колонке.
0
conturov #
Opera не тянет.
Прорисовалось только поле и 1 бот, правой панели нет.
+1
Belidor #
Хром, полет нормальный
+12
cheetah #
А почему у Вас вместо по логике ожидаемого angle, везде angel?
+1
P_r_i_m_a_t #
Блин :) Он был an, я сделал замену всех и опечатался :)
+1
P_r_i_m_a_t #
Исправлю в след. версии.
+1
Goodkat #
оставь так
+1
cheetah #
if (this.targer_id == -1 || !get_enemy_by_id(this.target_id, enemies))

Еще вот тут, s/targer_id/target_id
0
P_r_i_m_a_t #
Спасибо. Хотя ошибку не вызывает get_enemy_by_id все равно false при id=-1 выдаст :)
+4
andreevich #
сначала подумал, что это куча пакманов, и они будут друг за другом бегать в приступе голода, а они ещё и стреляют )))
0
sdvn #
Да, это тяжелее, чем в то что мы рубились на в школе. «Змеиные бои» от Gamos, но идея та же.
+1
ramovsky #
А можно добавить окошко для ввода/вывода? В целях дебага.
Если это можно сделать средствами хрома, то скажите где.
+1
Etherial #
Уже почувствовал, что без отладчика играть будет реально тяжело :)
0
Etherial #
Кстати console.log для Firebug работает… да собственно чего ему не работать.
+1
P_r_i_m_a_t #
Firebug же есть.
+1
ramovsky #
Вот и повод поюзать Лису. Эх опера-опера…
+1
SowingSadness #
Что Опера-Опера… написали на том, чего еще в стандартах нет… что вы хотели?
:)
+2
panandy #
Да кстати. Опера как раз, если мне не изменяет память, наиболее полно поддерживает все стандарты. Подчеркиваю, стандарты, а не черновые спецификации, хотя и там дела не плохи.
0
P_r_i_m_a_t #
Если именно код робота отдалить — поставьте брейкпоинт на eval(code) в 47-й строке.
0
ramovsky #
А как дебажить переменные из подтянутого кода?
0
P_r_i_m_a_t #
Не совсем понял вопрос. Подтянутый, это какой? Firebug позволяет отлаживать весь код, который выполняется. Ставим брейкпоинт и идем по коду, нажимая «Step Into».
+1
ramovsky #
У меня он не входит в этот блок:( Пару раз нажму, никуда не ввойдет и просто продолжит выполнятся.
+2
P_r_i_m_a_t #
Прошу прощения, на 216 строку брейкпоинт и потом несколько раз Step Into.
0
ramovsky #
УРа. Спасибо.
0
ramovsky #
Еще момент. А где можно смотреть как измняются переменные в динамике, не останваливая симуляцию?
НЛО прилетело и опубликовало эту надпись здесь
+1
ramovsky #
enemies[0] за приделами видимости…
+4
nini #
Moжет как-то https://mozillalabs.com/bespin/ прикрутить можно?
+1
P_r_i_m_a_t #
Посмотрю, спасибо.
0
Avart #
А особо проявивших себя не хаброюзеров можно награждать инвайтами :)
0
ramovsky #
Сколько времени на тестирование обсуждение четких правил?
+1
P_r_i_m_a_t #
Давайте — неделю.
0
chuwy #
Один логотип чего стоит. Побежал пробовать.
+4
valyard #
Почему бы не сделать некий сервис, к которому можно будет подключаться с программ на любом языке? Может быть, я не знаю жабаскрипт.
+3
P_r_i_m_a_t #
Тут есть один хабраюзер — он вроде собирается такое делать, но мне кажется, что небольшой алгоритм на JS можно написать потратив на его изучение минут 15 — базовый синтаксис там от C. В эпоху перехода на веб-приложения лишним не будет :)
+2
ramovsky #
Я тоже не знаю. И Файерфокс я никогда не юзал. Меня не останваливает.
+2
Levsha100 #
Мне как-то пофигу на чем писать, главное чтобы на С++ было похоже :))))
0
P_r_i_m_a_t #
Сейчас представил, что бы было с этим сервером при нескольких тысячах одновременно сидящих на нем игроках.
0
darvin #
будет, активно пишем. будет интерфейс на stdin/stdout, рейтинг, несколько видов игр, фреймворки для разных языков. можно будет играть хоть на ассемблере
code.google.com/p/python-robots/wiki/IdeasForSite
примерные правила первой тестовой игры code.google.com/p/python-robots/wiki/RulesForGamers
–1
freeAKK #
Подсветка. Но не редактор
softwaremaniacs.org/soft/highlight/en/
0
Shark #
А можно сделать изменяемый размер поля? А то иногда маленькие экраны бывают, знаете ли :) Заранее спс.
+1
P_r_i_m_a_t #
Сделаю вместе с редактором нормальным.
0
darvin #
под какой лицензией пишите? можно у вас будет украсть редактор? )
0
P_r_i_m_a_t #
Я готовый буду прикручивать, а не свой писать.
0
Levsha100 #
Люди, у меня моник 17", разрешение 1024*768, сделайте, пожалуйста, так, чтобы было одновременно видно и игровое поле и состояние ботов(оно не влезает:( )

И еще хорошо бы явно показывать где свой бот(например, стрелкой)
0
P_r_i_m_a_t #
Там же подписано справа «Your robot».
+3
Levsha100 #
Я имею ввиду на арене, короче показывать стрелочкой на кружок :)
0
Quadrix #
Согласен с Levsha100 насчет выделения своего робота. У меня, например, свой робот и второй по списку несильно отличаются по цвету: зелено-желтый и желтый.

Наверно будет удобна возможность кастомизации своего робота. Чтобы можно было задать цвет заливки (красный, зеленый, ...) и тип заливки (решетка, полоски, ...).
+1
P_r_i_m_a_t #
Пока сделал зеленый цвет темнее, вроде отличается. Потом будут вместе запускаться роботы разных участников — могут быть коллизии, если разрешить выбирать окраску.
0
Quadrix #
О, другое дело =)
0
Quadrix #
Насчет коллизий думал. Почему бы их не позволить — встречаются же одинаковые аватары, одинаковая рубашка на людях. Просто надо уменьшить вероятность их возникновения, введя несколько варьируемых параметров. Необязательно два как я указал, а можно несколько: цвет заливки, тип заливки, цвет границы, толщина границы и т.д.
0
Levsha100 #
На крайняк- можно сделать выбор геометрических фигур.
+2
Quadrix #
Танчики?
0
Levsha100 #
А если бы можно было бы еще свой скин сделать было бы вообще круто!
+2
P_r_i_m_a_t #
А это мысль! Canvas позволяет подгружать картинки и поворачивать их…
0
ramovsky #
Я так понимаю все это будет подтормаживать…
Нужно установить предел ботов на одну арену.
0
P_r_i_m_a_t #
Предел будет, конечно. Если ботов будет слишком много — там уже никакой тактики, просто мясо.
0
Quadrix #
А что делать с искажениями при повороте картинок?

Если на картинке нечто вроде аватара, а не скина, то можно картинку не поворачивать и для указания направления движения рисовать «нос».
0
Levsha100 #
А как на счет процедурной графики?
Я мог бы сочинить редактор.
0
Levsha100 #
(в полярных координатах)
0
Quadrix #
Как вариант вполне и меньше будет грузить процессор по сравнению с картинками. Особенно при тысячах игроков.
+1
P_r_i_m_a_t #
Вот на Canvas сделано:
www.lo2k.net/v7/lab/flickr/index/flickr_id/28791827@N00
0
Quadrix #
Красиво, но здесь картинки были повернуты заранее с антиалиасингом. Надо проверить как HTML5 будет поворачивать картинки и насколько существенны будут искажения при поворотах.
0
P_r_i_m_a_t #
Нет, картинки повернуты именно HTML5. Если присмотреться, они справа вылетают и поворачиваются.
0
Quadrix #
Да, точно. Специально сегодня утром всматривался, но не смог заметить. Казалось, оптический эффект. А сейчас явно все вижу.
+1
homm #
Этот редактор не плох.
+2
P_r_i_m_a_t #
Спасибо.
0
Shark #
codepress.sourceforge.net/ — вот еще, абсолютно никаких лишних кнопок. Поле для текста + возможность добавлять кое-какие кнопочки.
0
MYPABEU #
И глючит в некоторых браузерах.
EditArea получше будет в этом плане, хотя CodePress тоже по-своему хорош.
+2
P_r_i_m_a_t #
Он не перехватывает нажатие tab.
0
dmgorsky #
На главной опечатка — «аккаут»… Надеюсь, в JS-коде примера опечаток нет? ;)
0
P_r_i_m_a_t #
Есть одна :) Но на исполнение не влияет.
0
Levsha100 #
Лабиринты будут?
0
P_r_i_m_a_t #
В след. версиях — будут. Я в первом топике писал, что лабиринты приводят к необходимости всем реализовывать A*. Получается много рутинного кода.
0
kurokikaze #
Тогда почему бы не реализовать A* как часть стандартной библиотеки?
0
P_r_i_m_a_t #
А тогда смысл лабиринтов не особо понятен.
0
kurokikaze #
Ну разве что для зрелищности :)
0
Levsha100 #
Было бы неплохо сделать красивое окончание турнира, а то просто робот остановился и все (
//Знаю что это будет в следующих версиях :)))
+2
P_r_i_m_a_t #
Fatality?
0
Goodkat #
Как в C&C — солдатики кричат «Ура!» и воздух чепчики бросают
0
ramovsky #
А зачем параметр «дальность огня»?
+2
Quadrix #
Видимо заряд летит не по поверхности, а над ней. Надеюсь, я понятно объяснил ;)
0
P_r_i_m_a_t #
Верно.
0
lashtal #
В хроме работает.

Ф-я get_angel_control, видимо, работает неверно, разворачивая робота только в одном направлении, хотя это удалось обойти, провяряя, увеличился ли угол, на который надо повернуть, по сравнению с предыдущим фреймом )

Было бы удобно окошко для дебага, к которому можно обращаться из кода и выводить произвольные данные.
0
P_r_i_m_a_t #
Спасибо, пофиксил.
0
step307 #
get_angel_control не возвращает отрицательного значения
0
P_r_i_m_a_t #
Уже исправлено.
+5
Quadrix #
Прощай ночь. Здравствуйте красные глаза.
0
KEPZ #
у меня все друг друга убили)
0
P_r_i_m_a_t #
Ага, я специально сделал так, чтобы симулятор останавливался после того, как долетит последний снаряд :)
0
KEPZ #
мне пора спать или только что в меня в упор выстрелил вражина и сам себя убил (волной чтоли взрывной :))
+1
P_r_i_m_a_t #
Ага, урон на всех распространяется. Рядом с собой стрелять опасно.
0
ramovsky #
Елси я стрелять в одного, а на пути попадется друго, то его пролетит? Это благодаря target?
0
homm #
Это благодаря дальности. Если в радиус взрыва попадут двое, видимо урон нанесется обоим.
+2
P_r_i_m_a_t #
Снаряды летят по параболе. Просто из-за 2д этого не видно. Пролетает благодаря range.
–1
Levsha100 #
Тогда можно еще сделать лазеры, лучи которых не летят по параболе :)
–1
Quadrix #
И ковровое бомбометание, пожалуйста :)
0
Levsha100 #
Справка:
Ковровое бомбометание — бомбометание большим количеством бомб,
большим кол-вом самолётов с горизонтального полёта.
0
pxx #
Тогда понадобятся еще системы ПВО. :)
Скорее всего Quadrix имел в виду установку «Град».
0
Quadrix #
Да, да… Именно системы залпового огня ;)
0
kurokikaze #
Функция «вызвать авиаудар»? :)
+1
hyborg #
Немного сумбурного фидбека:
* Было бы здорово иметь какой-нибудь валидатор скрипта в редакторе, хотя бы кнопку запуска eval.
* Подчеркивания в методах API убивают (субъективное мнение).
* Планируется ли сделать опен-сорс?
* Если реализовать для бота более-менее ресурсоёмкий алгорит, то арена начинает тормозить. Может стоит сделать расчет боя на сервере, а на клиент отдавать флешку с результатом? Это может решить проблемы с браузерами, перфомансом, и подглядываением в чужие алгоритмы? А так же, можно будет сохранять ход боя на века.
ps. спать-спать-спать… :)
+1
P_r_i_m_a_t #
Было бы здорово иметь какой-нибудь валидатор скрипта в редакторе, хотя бы кнопку запуска eval.

Сделаю.
Планируется ли сделать опен-сорс?

Учитывая, что кроме html-кода той страницы больше ничего, относящегося к игре и нет, оно уже опен-сорс :)
Если реализовать для бота более-менее ресурсоёмкий алгорит, то арена начинает тормозить.

Вот сейчас на сервер за последние 2 часа зашло несколько тысяч человек. Если ваш компьютер не будет справляться с обработкой одной арены, как сервер будет одновременно выполнять несколько сотен ресурсоемких алгоритмов? На сервере будут обрабатываться только турнирные матчи.
0
ramovsky #
а можно режим где два моих бота, без никого? Или жизней по 10000. А то ничего толком нельзя потестить? Быстро все заканчивается
0
P_r_i_m_a_t #
Уменьшил демаг в 2 раза.
0
ramovsky #
А можно GOD-MODE галочку? Что бы все бессмертные были.
+1
P_r_i_m_a_t #
Сделал (чекбокс в Арене).
0
ramovsky #
Спасибо.
–2
Traveler #
Мой фидбек:

Есть один баг. Если выстрел сделан в одного робота, а на пути заряда попадается другой робот, то его даже не задевает.

И есть одно пожелание. Можно вывести мини индикаторы здоровья и заряда роботов над ними на поле.
+1
P_r_i_m_a_t #
Это не баг — это фича :) Снаряды летят по параболической траектории.

С индикатором хорошая идея.
0
Levsha100 #
В целях отладки можно рисовать траектории ботов.
0
Levsha100 #
И точками отмечать место выстрела(можно было бы даже восстановить положение других ботов в этот момент).
+1
Quadrix #
А не слишком ли много логов будет? Роботы за минуту такого Пикассо нарисуют…
0
kurokikaze #
Можно сделать функцию ставящую флаги на поле + запись в лог. Это для отладки бы очень пригодилось.
0
ramovsky #
Можно еще сделать летящий заряд потолще. Видно слабо…
0
LoveSan #
Количество противников всегда 4?? Если нет, то необходимо функцию подcчета живых противников ввести.
Например:

function GetAlivesCount(enemies)
{
var count;
for (var i=0;i<enemies.lenght;i++)
if (enemies[i].Helth>0) count
}
0
P_r_i_m_a_t #
Противников может быть сколько угодно (в разумных пределах). Мертвые противники в массиве ememies не передаются.
0
LoveSan #
тоесть алгоритм «не должны знать» сколько противников
0
P_r_i_m_a_t #
Алгоритм знает сколько живых. Общее количество можно запомнить при первом вызове, хотя зачем они нужны?
–2
LoveSan #
Извини, промахнулся.
function GetAlivesCount(enemies)
{
var count;
for (var i=0;i<enemies.lenght;i++)
if (enemies[i].Helth>0) count++;
return count;
}

это если противник не удаляется из массива, когда его убили

0
Levsha100 #
Почему нельзя тратить часть энергии на ускорение(например, до 1)?
+1
P_r_i_m_a_t #
У меня была идея восполнение энергии увязать со скоростью — чем выше скорость, тем медленнее восстанавливается. Наверное, так и сделаю.
0
vectoroc #
тогда все будут отсиживаться по углам
+1
P_r_i_m_a_t #
По стоячему роботу гораздо проще попасть.
0
vectoroc #
врядли кто будет искать специально неподвижных. Попадание «в яблочко» больше наносит урона, чем попадание рядом? Если нет, то в этом еще меньше смысла.
+1
P_r_i_m_a_t #
Да, урон рассчитывается пропорционально точности попадания.
НЛО прилетело и опубликовало эту надпись здесь
0
nayjest #
Зачет! Очень понравилось, даже не думал, что вы так быстро сделаете это + все просто, удобно, авторизация через гуглоаккаунт (извините что лень гуглить, но ее можно прикрутить к своим проектам на php например? Или сугубо GoogleAppEngine?)
Ждем развития проекта :)
0
ramovsky #
Эта фича есть практически в любой CMS. Значит есть нормальный API
0
P_r_i_m_a_t #
Спасибо.
авторизация через гуглоаккаунт (извините что лень гуглить, но ее можно прикрутить к своим проектам на php например?

code.google.com/apis/accounts/docs/OpenID.html
0
vectoroc #
Еще бы сделать таблицу рейтингов и возможность выбора чужих роботов в качестве соперников
+2
P_r_i_m_a_t #
Это будет, но чуть позже. Сейчас нужно оттестировать модель игры и все основные баги выявить.
+1
z0rg #
уже накляпал стратегию выбора противника по наименьшему расстоянию и здоровью)
0
Forastero #
Вот это феерично! А для дизайнеров игр?
0
korchasa #
Эх, ну почему не в пятницу, завтра же на работу.

Какая скорость полета снаряда и скорость восстановления энергии?
+2
P_r_i_m_a_t #
Снаряд — 15 единиц/фрейм, энергия — 0.3/фрейм.
+1
korchasa #
В общем пока скучно. Попытки увернуться не имеют смылса, ибо снижают частоту выстрелов. Хочется:
— маневрирование отдельно от наведения
— типы роботов: обычный, быстрый, мощьный
— возможность как-то одназначно определить каждый танк из программы. Полезно при отладке писать логи, типа — «зеленый танк кажеться в нас стреляет»
— собственное тулзы для отладки, с возможностью поставить на паузу, например
0
kurokikaze #
Какова скорость робота? 1 единица за 1 фрейм?
+1
kurokikaze #
Ой туплю :)
0
Irker #
было бы еще интересней получать информацию о снарядах летящих в данный момент. ибо возможность только нападать зачастую приводит к случайному исходу битвы.если же роботы получат возможность попытаться уйти от снаряда, то исход сражения гораздо больше будет зависить от алгоритма.
0
P_r_i_m_a_t #
Это будет обязательно. Хотя, даже сейчас можно эту информацию иметь, наблюдая изменение энергии других роботов и их углы поворота.
0
nehxby #
Не знаю, может быть уже исправлено.
Хорошо бы научить функцию get_angel_control принимать параметры меньше 0 и больше 360
0
P_r_i_m_a_t #
Так она и так принимает.
0
nehxby #
ок, хорошо. значит, проблема была в моем коде.
0
lashtal #
Если еще не упоминалось — в старом сотовом Alcatel OT 715 была игрушка botwar — она была построена по такому же принципу: перед матчем для робота указываются правила (не программирование, конечно, но близко), количество возможных правил определялось уровнем бота. Поле представляло собой сетку (размеры не помню), бот мог перемещаться на одну клетку, сканировать клетки перед собой на наличие противника, поворачивать, реагировать на попадание и т.д. Как источник для вдохновения было бы самое то.

Чего сразу не хватает: нет шансов уклониться от пущенного снаряда. Скорость движения слишком мала, поэтому снаряд задевает всегда, а скорости поворота все равно не хватит чтобы изменить направление. Два стреляющих по игроку бота всегда его убьют. Нужен механизм определения запущенных снарядов и уклонения от них (я бы предложил «прыжок» вправо или влево на расстояние, равное радиусу взрыва, за, например, 30 ед. энергии). И событие при получении повреждений было бы неплохо.
+1
P_r_i_m_a_t #
нет шансов уклониться от пущенного снаряда. Скорость движения слишком мала, поэтому снаряд задевает всегда, а скорости поворота все равно не хватит чтобы изменить направление. Два стреляющих по игроку бота всегда его убьют. Нужен механизм определения запущенных снарядов и уклонения от них (я бы предложил «прыжок» вправо или влево на расстояние, равное радиусу взрыва, за, например, 30 ед. энергии).

Согласен. Я сделаю просто ускорение больше, но с затратами энергии. Летящие снаряды тоже будут передаваться.
И событие при получении повреждений было бы неплохо.

Это просто — записывайте в переменную предыдущее состояние здоровья и, если уменьшилось, обрабатывайте.
0
lashtal #
сорри, не до конца изложил мысль: при получении повреждения хорошо бы узнавать владельца снаряда для последующего принятия мер.
0
darvin #
Как будут проводится чемпионаты/высчитываться рейтинги, если игра идет в браузере?
+1
P_r_i_m_a_t #
Никто не мешает на сервере обрабатывать Javascript. Гугловский V8, например, вполне для этого подходит.
+1
rubyrabbit #
Спасибо за хорошее настроение.

Когда-то лет 6-7 назад, когда только появился .NET (боже, какой я старый )), MS продвигала игру с названием типа «Creatures» (не помню точно). В общую «вселенную» запускались травоядные и хищники, поведением которых можно было управлять, подключив свою DLL. Предлагалось написать на C# свою модель поведения и соревноваться на их сайте. Некоторое время инициатива бурно развивалась, но потом по непонятным мне причинам тихо умерла.

Увидел этот пост и опробовал движок на ночь глядя, «переспал» с мыслью о подобной игре, и меня посетили новые идеи :-)
Игра в браузере — это, конечно, не вариант. Думаю, было бы интересно сделать такую асинхронную игру: на сервере с максимально доступной скоростью обсчитывается мир, а по HTTP-протоколу ботам отдаются команды. Разумеется, будут лаги из-за разной ширины и надёжности канала связи участников, но тем интереснее: надо отдавать команды «с запасом» — до следующего «сеанса связи». Что делает задачу похожей на реальную — по управлению роверами где-нибудь на луне, например :-)
0
rubyrabbit #
Да, в дополнение к моей идее: при этом платформа реализации логики бота значения не имеет — весь обмен данными асинхронный через HTTP. Таким образом можно ещё и хвастаться лаконичностью кода любимого языка или изощрённостью логики, которую он позволяет реализовать.

Ну и ещё: эта «вселенная» может жить непрерывно, а участники могут запускать туда ботов по мере наличия желания и возможности.
0
rubyrabbit #
Как писали выше, оптимальной представляется такая архитектура.
1. Серверная часть, обсчитывающая игровую вселенную.
2. Управляющая часть отдаётся на откуп участникам, команды и обратная связь — через HTTP.
3. Визуализация состояния вселенной через Flash. Причём реализаций может быть несколько на любой вкус (на разных сайтах) — был бы доступ к параметрам состояния вселенной. (Данные для визуализации надо отдавать с задержкой порядка нескольких секунд, чтобы информация уже потеряла актуальность для нечестного обсчёта ботов.)
0
P_r_i_m_a_t #
Во-первых, все турниры будут обрабатываться на сервере (и арена и клиентский код), а на сайте можно будет посмотреть повторы боев и турнирную таблицу. Во-вторых, архитектура, требующая постоянного наличия игрока в онлайне, крайне неудобная — не все смогут в нужное время быть на месте.
+2
namata #
Можно оставить angel вместо angle. Это как-то даже интересно, своеобразная фишка
–1
sfghelios #
// Этот код будут обрабатываться внутри класса

Первая строчка — и сразу ошибка… тем более — комментарий )))
0
lamooof #
Я предлагаю увеличить маневренность юнитов. Увеличить скорость разворота и сделать возможность заднего хода. С одной атакой и не очень обширными возможностями защиты не очень круто. Можно сделать голосование, за то какие возможности хабраюзеры хотели бы видеть в игре=)
0
Quadrix #
Обратный ход — это хорошо. Есть такой шведский танк, который не может башню поворачивать, но может ездить туда-сюда, крутиться на месте. Все как у нас, кроме заднего хода.
0
ramovsky #
Предлагаю открыть новую тему, где соберать предложения, а эту оставить только для багрепортов.
0
P_r_i_m_a_t #
Попозже будет, когда новую версию сделаю.
0
pxx #
Чувствую себя тупым. Не могу придумать нормальную стратегию ведения боевых действий. :(
0
P_r_i_m_a_t #
Пока это просто прототип, тут возможностей немного. Но как вариант: добивать самого слабого — чем меньше роботов, тем меньше стреляют в тебя. Ездить перпендикулярно противника и подальше — ему сложнее попасть.
0
pxx #
Спорный вопрос. Если выбор цели ботами случайный, то чем больше противников, тем больше вероятность, что по тебе никто не палит.
0
lamooof #
Насколько я понимаю вероятность не измениться, выбор из большего количества целей, большим количеством противников. Тут полная группа событий. А на данном этапе стратегии в общем нет.
+1
pxx #
Если я не ошибаюсь, то при рандомном выборе противника вероятность, что по тебе никто не палит S(n), где n — кол-во противников:
S(4) = (3/4)^4 ~ 0.31
S(3) = (2/3)^3 ~ 0.29
S(2) = (1/2)^2 = 0.25
S(1) = 1

Хотя это лирическое отступление. Все равно я что-то торможу с выдумыванием алгоритма.
+1
stab #
На сколько я понял, роботы воюют с себе поднобными, программа у них одна на всех. Это не интересно, т.к. при одинаковом алгоритме и прочих равных всё зависит от случая.

Было бы хорошо иметь возможность присаживать в «ктлетку» чужих роботов и вести постоянный рейтинг. Только вот как обеспечить изоляцию кода, чтобы не было «вирусных» заболеваний? Cross-document messaging + субдомены + ыфреймы?
0
stab #
Хотя… один фик, кому надо сломают.
0
kurokikaze #
Изоляция closure'ами + перекрытие стандартных объектов. Попробуйте в соседнее замыкание достучаться тогда :)
0
stab #
Да не, я не об этом, а о том, что с помощью Фаербага можно править всё как душе угодно. Поэтому рейтинг считать не надо.
0
kurokikaze #
Полагаю, турнирные бои на рейтинг будут проходить на сервере внутри Rhino.
0
stab #
Дык, я не про сервер, а про клиента.
0
kurokikaze #
На клиенте рейтинг можно вести чтобы видеть динамику развития робота. Сделал изменения — увидел лучше ли справляется робот — изменил ещё. В глобальный ростер эти рейтинги совать незачем.
+1
P_r_i_m_a_t #
Сейчас ваш робот, воюет с 4-я стандартными роботами. Т.е. если вы что-то в коде меняли — алгоритмы отличаются.

Насчет вирусной активности — там сейчас простенькая защита есть, хотя, наверное, обойти можно.

Когда игровая модель сформируется — будут проводиться регулярные турниры (на сервере) и выкладываться код роботов, проверенный мною.
0
stab #
Может всё-таки внедрить возможность с подсаживанием, но без рейтинга. Будет не так скучно.

Для скрытных можно сделать галочку, которая полностью отключает такую возможность, т.е. своего робота не показывает, чужих тоже не видит.
0
P_r_i_m_a_t #
Да она будет, чуть попозже — сейчас постоянно в симуляторе что-то меняется, код будет просто несовместим. Да и как вы сейчас будете выбирать противника при > 10000 записях в базе.
0
stab #
> Да и как вы сейчас будете выбирать противника при > 10000 записях в базе.

0
stab #
> Да и как вы сейчас будете выбирать противника при > 10000 записях в базе.

Либо случайно, либо придумать какую-нибудь метрику различия (длина кода, кол-во различных кейвордов яваскрипта, diff :) и выбирать каждый раз случайных из 100 самых непохожих, либо наоборот похожих.
0
P_r_i_m_a_t #
Проще будет, мне кажется, провести первый турнир и потом уже расшаривать роботов с рейтингом.
–2
stab #
Не понимаю в чём заключается простота такого подхода, но скука жуткая с тем что там сейчас бегает. Дело ваше.
0
P_r_i_m_a_t #
Смысл в том, чтобы сейчас определиться с моделью и отладить её. Если вы заметили, в комментария очень много разрных идей предложили по доработке, если сейчас сразу сделать возможность расшаривать код, то менять модель будет уже нельзя.
0
stab #
Дык, в будущем всё равно правила будут изменяться, доработки будут, и после первого турнира и после 10-го. Тем более что нерабочие роботы всегда будут, достаточно забыть где-нибудь скобочку закрыть, таких надо просто игнорировать.

Опять же не ясно каким таким магическим образом во время турнира вы будете отличать читерских роботов от остальных, все 10 000 исходников просматривать? Система изоляции кода всё равно нужна.
0
P_r_i_m_a_t #
Турнир будет на сервере проходить на гугловском движке V8 — он может каждый скрипт в отдельном контексте запускать.
0
stab #
Его и у клиента можно запускать изолировано, я уже говорил: Cross-document messaging + субдомены + ыфреймы, без рейтинга. Для канваса HTML5 как ни крути нужен, следовательно и cross-document messaging будет. На счёт 100%-ой поддержки его браузерами не уверен.

Сломать в такой системе может что-то только сам пользователь, но т.к. рейтинг не считается в этом нет смысла.

Может быть вам помочь? :)
0
P_r_i_m_a_t #
Я не знаю точно, но попробуйте сейчас что-то вредоносное написать. Мне ещё в прошлый раз предлагали вариант с замыканиями, он тоже интересен.
0
stab #
> Я не знаю точно, но попробуйте сейчас что-то вредоносное написать.

Я бы с радостью, но там всё задисаблено сейчас :)
0
P_r_i_m_a_t #
Браузер какой?
0
P_r_i_m_a_t #
Из-за нового редактора был глюк в Хроме. Пока отключил его. Проверяйте.
0
stab #
Угу, заработало.
0
stab #
Да, с замыканиями гораздо проще. Тогда я совсем не понимаю что вас останавливает от подсаживания чужих роботов.
0
stab #
И кстати где гарантия, что тот же код, но уже в браузере, не будет делать нехороших вещей? Завернуть в try...catch и всё.
+1
stab #
Господа минусующие, объясните в чём же простота? Фреймворк для запуска сторонних роботов писать всё равно придётся, видимо сложность для вас заключается в выборе нескольких случайных записей из базы, так?
0
P_r_i_m_a_t #
Сейчас я вношу изменения постоянно, потом это будет раз в неделю или ещё реже. Это просто тестирование.
0
ramovsky #
Турнир лучеше проводить в формате 5игр-5игроков, групировка рандомная. Подебдитель выходит в следующий тур и там по той же системе.
Чем меньше будет демедж, тем дольше будет длится тур, тем меньше влияние случайных факторов, больше будет зависить от алгоритма. Предлагаю макс демедж на уровне 5%.
0
buriy #
отличный редактор codemirror (http://marijn.haverbeke.nl/codemirror/),
который ещё google использует для своего google api playground (http://code.google.com/apis/ajax/playground/)
–2
buriy #
Щас скучно, поэтому свой код писать пока не буду.
Прятаться практически некуда, т.к. все всех видят и всё обо всех знают.
Оптимального алгоритма не существует, действует правило «на каждую хитрую ж… найдётся х… с винтом».
К тому же, если с одного выстрела противника не убить, то когда >2 одинаковых достаточно хороших ботов, тот, кто начинает убийства, проигрывает, а самый трусливый/ленивый убийца выигрывает (первый соперник обязательно ослабит наиболее яростного убийцу).

Поэтому один из субоптимальных алгоритмов, не требующих памяти, щас такой:
— Всегда выбирай противника, в которого стрелять начнёшь раньше всего.
— Поворачивайся в сторону противника, и двигайся в его сторону, если он удаляется от тебя.
— Стреляй всегда, когда есть в кого. Если можно в нескольких, стреляй в ближайшего.
— Если ты в пределах зоны попадания лазера, и нет энергии для выстрела, всё равно будь нацеленным на противника, т.к. если он в пределах зоны попадания, то не убежишь — дистанция не станет увеличиваться, скорости роботов одинаковые, а до угла добежать как нефиг делать.
— Если ты за пределами зоны попадания, то лучше забиться в угол и там ждать, пока остальные друг друга перебьют.
Короче, ковбойщина полнейшая. (Разве что, вместо доставания пистолета из кармана, ковбоям нужно разворачиваться)

Для более точного тактического просчета нужно запускать поиск в глубину, насколько хватит процессора. Хорошый тактический процессор учтёт, что лазерный снаряд не пролетает через трупы, и сможет ли противник в тебя выстрелить вперёд или ты. Штрафы за свою смерть, небольшой бонус за убийство (я правильно понял, что неважно, кто сколько убил, важно, кто выжил последний?).

Кстати, на какой угол робот поворачивается, сказав «1» или "-1" мотору поворота? Это важно. Аналогичный вопрос про движение. Какие размеры экрана и как соотносится скорость с размерами экрана?
И пиши где-нибудь fps, тики или что у тебя там, чтобы понятно было, сколько раз за секунду кто подумал, и кто сколько думал.
–1
ramovsky #
А гда вы лазер нашли?:)
Там все снарядами на дальность стреляют. Может подумаете еще раз?
–1
buriy #
Уж не считай меня глупее, чем я есть)
И тогда я не скажу, куда тебе идти с твоей нескромной фразой «Может подумаете еще раз?».
Таких длинных и тонких снарядов не бывает, а лазерные выстрелы в игрушках частенько рисуют именно так.
И вообще, это что, принципиальный вопрос или просто тебе делать нечего?
–2
ramovsky #
Красиво излагаете… Ругаться не буду.
На лазер действительно похоже. Просто для точного попадания нужно знать направление и дальность до цели. В расчете этих параметров на данный момент весь интерес альфа версии. Если не нравится — не участвуй.
–2
aktuba #
>корпорации Света и Добра

после этого даже смотреть не хочется. делать идола из компании — верх идиотизма.
+2
panandy #
Вы уверены, что автор не написал это шутя? Ну забыл смайлик поставить, подумаешь… :)
+1
kurokikaze #
Кстати, для любителей отладки: console.log() не закрыта.
0
g3ar #
в коментариях, в функциях не angel, a angle :)
–2
Baofy #
А в вашем коментарии повтор, это уже писали здесь:)
+1
hyborg #
Новый текстовый редактор ведёт себя неадекватно: он дублирует код, когда я вставляю его из буфера обмена. (Chrome 4.0.223.16)
0
P_r_i_m_a_t #
Сейчас буду разбираться.
0
P_r_i_m_a_t #
Починил. Только заставьте Хром обновить этот скрипт.
0
Quadrix #
Может для полноты описания объекта в игровом мире добавить поле direction в my_state, указывающий на текущее направление движения. Аналогично и для enemies.
+1
P_r_i_m_a_t #
Оно там есть, называется angel (должно было быть angle, но опечатку сейчас исправлять нельзя из-за совместимости).
0
Quadrix #
Извините, видимо заработался.
+1
ramovsky #
майкрософт с 85го года неможет из-за совместимости некоторые баги закрыть:)
+2
Alert #
Блин! Спасибо тебе огромное за эту игру!!!
Давно с таким удовольствием не программил :)
С нетерпением жду развития игрушки.
0
ramovsky #
На кокой строке сейчас нужно ставить брейкпоинт что бы дебажить свой код?
А в своем коде нельзя поставить брейкпоинт. В Файербаге.
+2
P_r_i_m_a_t #
На 217-ой строке общего кода.
0
ramovsky #
Можно как то сделать, что бы код отображался в дебагере не в одну строчку?
0
ramovsky #
я о том коде, который мой…
0
P_r_i_m_a_t #
У меня в firebug код робота выглядит так:
img137.imageshack.us/img137/1179/screenshotkx.png
0
ramovsky #
Спасибо. Баг был в галочке «Декомпилить eval()». Нормально показывает когда галочка снята:)
0
kurokikaze #
Уже написал своего, сейчас переписываю игру чтобы проводила серию матчей и выдавала статистику.
0
kurokikaze #
Готово, мой побеждает дефолтных в 50% случаев. Делаю счётчики полученного и нанесённого урона.
0
kurokikaze #
Вообще сейчас действительно места для тактики там немного. Роботы поворачивают медленно, «соскочить» с прицела противника можно только если его кто нибудь убьёт раньше. Очень «случайная» игра.
+1
P_r_i_m_a_t #
К концу недели будет новая версия, в которой будет больше простора для тактических действий.
0
kurokikaze #
Я думал к ним «вагоны» прицепить, чтобы усложнить маневрирование, но тогда дефолтные боты начнут сосать болт.
0
kurokikaze #
Кстати, если не секрет, сколько человек в первом варианте поучаствовали? :)
+1
P_r_i_m_a_t #
Всего зарегистрировалось 12К. Примерно четверть из них что-то меняли в коде.
0
kurokikaze #
Ничего себе, я думал — гораздо меньше :)
0
P_r_i_m_a_t #
Ну, я не знаю, сколько из них серьезно настроены на участие в турнире — может просто поигрались и забыли. Посмотрим.
0
ramovsky #
О каком коде речь?
0
P_r_i_m_a_t #
Коде робота.
0
kurokikaze #
Переписал трансплантацию мозга в робота без eval'а, через context switch. На домашнем компе скорость матчей уже приемлимая. Дальше уже скучно копаться.
0
kurokikaze #
Короче вот он, если кому будет интересно.
+1
vectoroc #
добавьте возможность указать линк на свой js с роботом. Мне кажется, многим такой вариант будет удобнее, чем писать в textarea
+1
hyborg #
А ещё здорово было иметь закачку js-файла на сервер и возможность создавать/редактировать нескольких роботов.
0
ramovsky #
Может ли мое значение угла поворота выходить за диапазон 0:360?
0
kurokikaze #
Может, оно автоматически приведётся к нужному.
+1
ramovsky #
Так когда соревнования? В воскресение или понедельник?
+1
P_r_i_m_a_t #
Соревнование будет не один день — я в воскресенье, скорее всего, выложу новую версию. И несколько дней отведем на написание новых ботов, после чего пройдет турнир. Т.е. начнется в воскресенье.
0
ramovsky #
А можно ознакомится со списком фьючерсов, что потом меньше писать?
+1
P_r_i_m_a_t #
В функцию теперь будут передаваться массив с летящими снарядами и массив с параметрами среды (константами). Первый должен повлиять на геймплей, второй — просто для удобства. Также в плане геймплея будет важное изменение — все действия робота будут тратить энергию (чем дальше выстрел, тем больше расход энергии; чем выше скорость, тем больше расход и т. п.). Ещё кое-что будет, но я пока ещё обдумываю.
0
ramovsky #
А зачем за дальность снимать энергию? не логично как-то?
0
P_r_i_m_a_t #
Если с точки зрения физики — считайте, что снаряды разгоняются электромагнитной пушкой :)
0
ramovsky #
С точки зрения стратегии. Без этого тактик может быть две: кемперить с далека, или максимально сближаться. А так будет одна.
Назовите хоть один плюс такого правела.
0
P_r_i_m_a_t #
Разница в затратах энергии будет небольшая.
0
ramovsky #
А причина? Можете сказать для чего это делается?
0
P_r_i_m_a_t #
Если этого не делать, как раз выгоднее будет кемперить издалека.
0
ramovsky #
А что в этом плохого? Или вы сторонник единой тактики — рукопашная?
+1
P_r_i_m_a_t #
Нет, в случае с зависимостью энергии от расстояния, обе тактики будут вполне жизнеспособны: при стрельбе с близкого расстояния больше шансов получить выстрел в ответ (точность выше), зато расходуется меньше энергии и можно стрелять чаще, а при стрельбе издалека выстрелы будут реже, зато уворачиваться проще. Ещё раз — разница будет незначительная.

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