Я хочу сыграть с тобой в игру.
Но если быть точным, то я хочу презентовать вам результат моей работы за последние пару месяцев. Кодовое название — песочница.
Что это?
Суть данной системы проста: это песочница для программистов. Здесь можно и нужно писать исскуственный интеллект для своих ботов и играть с ботами других участников. Во что играть? Все просто — в дурака. Да-да, в карточную игру.
Данная система выросла из небольшого проекта по изучению пермишенов в Java. Изначально мне было просто интересно как работают разграничения выполняемого кода, как строится плагинная архитектура и т.д. Но в итоге захотелось обернуть все это в законченный продукт — вот как все вышло.
Кому интересно, давайте взглянем поближе на саму систему.
Прежде всего хочу сказать что все нижеизложенное вы можете найти на Intro странице в самой системе. Там же есть более-менее полное руководство, оно позволит преодолеть и без того низкий порог вхождения. Так же хочу заметить что стадия проекта — ОБТ, но это никоим образом не отражается на функциональности. Все запланированное для релиза уже на борту. Впереди лишь допиливание хотелок и полировка.
Как работает система?
Жизненный цикл игрока весьма прост. После регистрации и активации аккаунта* у Вас появляется доступ ко всем функциям системы. И теперь Вы, как игрок, можете писать, компилировать и загружать вашего бота.
После загрузки происходит раунд против самой системы. Это называется — квалификация. Цель лишь одна — проверить на вшивость код бота. Если бот играет не честно или играть не умеет, а может даже пытается мухлевать, он автоматом получает штраф и дальше играть не может. Для продолженния его нужно исправить и залить повторно.
Следом за квалификацией бот уже может участвовать в турнире. Игроки для турнира подбираются по Швейцарской системе. Игры проводятся каждый час. Турнир же длится неделю. Итоги подводятся каждое воскресенье. Очки распределяются по формуле рейтинга Эло. И первая тройка попадает в Историю Турниров. По всем победителям есть сводка — Зал Славы.
* тут прошу заметить что письма активации гугл может помечать как спам. Эту проблему, к сожалению, побороть не удалось. DNS настроил по полной, но все же, по непонятным мне причинам, доверие не на высоте.
Как пользоваться?
Интерфейс
Комментировать скрины я думаю будет лишним, поэтому постараюсь привлечь внимание картинками.
Зал Славы
История турниров
Статистика игрока
Лог игры (начало)
Форма загрузки бота (запомните ее, это входная точка в турнир)
Бот
Код который требуется написать зависит целиком от вас. Можно реализовать простую стратегию, как у противника в квалификационном раунде, а можно разработать и свою. Для написание нужны: java + maven + редактор.
Сам интерфейс бота содержит всего два метода, которые система дергает поочередно в течении игры в зависимости от роли игрока. Объект который поступает на вход каждому из методов содержит всю необходимую информацию о текущем состоянии игры, на ее основе и нужно делать выводы и совершать ходы.
public interface Ai {
/**
* Called by executor every move when your role is Attacker
* @param table cards on the table
* @return attacking card
*/
Card onAttack(Table table);
/**
* Called by executor every move when your role is Defender
* @param table cards on the table
* @return defending card
*/
Card onDefence(Table table);
}
Зачем?
Для вас это способ посоревноваться. Ведь не то что каждый программист, а даже каждый человек любит соревноваться и доказывать свое первенство.
Для меня это опыт поддержки системы в продакшене. Надеюсь полученные знания позволят и дальше развивать начатое (если конечно это будет интересно).
Где играть?
Ссылочка вот — sandbox.x-lab.space
Хостинг не навороченный, так что заодно и провайдера проверю, выдержит ли он явление именуемое хабраэффектом.
Всем спасибо за внимание. Жду ваши вопросы, отзывы и конструктивную критику, для меня это важно.
P.S.
Если ошибся хабом или ресурсом (сам думал куда лучше, сюда или на geektimes) — подскажите, я перенесу.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Комментарии (71)
prefrontalCortex
05.04.2016 08:38+6Для написание нужны: java
Вы добавили бы поддержку более других языков :)icepro
05.04.2016 09:24-1В данной ситуации это было для меня затратно по времени, поэтому я решил отказаться от этой идеи.
Сейчас система в ран тайм подключает ботов как плагины и выполняет их код.
Для поддержки же многих языков нужен иной подход. Или многоязычная среда исполнения, или та же java но которая будет выполнять роль интерпретатора.Fedcomp
05.04.2016 09:59Или запуск бинарников (в докере(небезопасно?) или в виртуалке(ресурсоемко)) и игра с ними используя сетевой протокол.
icepro
05.04.2016 10:23Да, оба варианта были на примете. И все это я назвал одним термином — многоязычная среда исполнения (в детали реализации я не вдавался). Но все же это требует времени на реализацию, а я пока решил держать концентрацию функциональной составляющей.
hurricup
05.04.2016 11:15-1Можно просто паблик апи. Я даю вам ссылку где слушает мой бот, вы посылаете ему исходные данные и получаете ответ.
icepro
05.04.2016 11:26-1А это облегчит вам работу? Скомпилировать и залить ведь "piece of cake" а поднимать инрфаструктуру для доступа из-вне, уже чуть заморочнее.
hurricup
05.04.2016 11:28+1Это облегчит мне возможность написать на чем я хочу и высунуть вам данные в JSON, например.
Под апи подразумевается не какой-то Java-RPC, а что-то простенькое.
pftbest
05.04.2016 23:27Если на вход поступает .jar, то значит, в теории, jvm based языки должны работать?
leoismyname
05.04.2016 08:41Не из мира Java, но идея мне понравилась, да и выглядит хорошо. Думаю, желающие сразиться найдутся.
alkaruno
05.04.2016 08:56+1Идея замечательная! Но использование Lombok может отпугнуть потенциальных участников, не знакомых с ним. Тем более даже плагин Lombok для Intellij IDEA "подсвечивает" некоторые ошибки.
icepro
05.04.2016 09:30+2Спасибо. И я действительно старался использовать 3rd party по минимуму, но именно тут не удержался. Надеюсь что заинтересовавшиеся все же найдут время что бы познакомиться с данной библиотекой. Тем более что такое знакомство может быть полезно и для личных целей.
prostofilya
05.04.2016 09:30Всё же в «дураке» слишком много зависит от взятой карты, то есть от случайного хода. Думаю, было бы лучше взять игру с большим количеством личных ходов.
icepro
05.04.2016 09:32Система расширяема. Так что не стесняйтесь. Какую игру предложите?
facha
05.04.2016 09:58-2Покер. Дурак — слишком прямолинейная игра. Да и знают о нем только на просторах бывшего СССР.
defaultvoice
05.04.2016 10:23+4То есть, вы предлагаете создать платформу для обкатки покерных ботов и тем самым, впоследствие, наводнить ими все онлайн-покер ресурсы? :)
thepry
05.04.2016 14:23+1 к Покеру. Сам участвовал в Lean Poker хакатонах, де нужно кодить покерных ботов — было весьма интересно.
Mart_Slaaf
05.04.2016 10:37Преферанс.
И профурсеток
Но он гемморойнее на этапе реализации + требование наличия трех ботов. (Зато нематчевая система учета очков. =) )
icepro
05.04.2016 14:25Я буду следить за этой веткой и по результатам обсуждения глянем кто наберет побольше плюсов.
Если вариант окажется стоящим — возьму в разработку.
Per_Ardua
05.04.2016 09:32+3Прикольно) Еще бы была возможность играть с собственным ботом, то есть нечто вроде пользовательского тестирования. А так — идея очень хорошая, да и реализовано на уровне.
icepro
05.04.2016 09:37Да, весьма разумное замечание, для отладки это очень полезная вещь.
Добавил в список фич для релиза, спасибо.
pro_co_ru
05.04.2016 11:09Интересно, дойдёт ли до того, что боты начнут объединяться друг с другом против более сильных ботов, или обойдётся тем, что каждый будет сам за себя…
hdfan2
05.04.2016 11:11Есть ли возможность узнать некий ID противника и сохранять какие-то данные между играми? Тогда можно было бы писать ботов, подбирающих стратегию против конкретных противников. Или всё полностью анонимно?
icepro
05.04.2016 11:12+1Пока что все анонимно. Считаете имеет смысл "раскрыть карты"?
makedonsky94
05.04.2016 11:28Как мне кажется это позволит расширить возможности ботов. Учить бота подстраиваться под конкретного соперника — довольно интересная функция
ZOXEXIVO
05.04.2016 12:07Как-то фильтруется время выполнения?
Если while(true){} будет в боте или еще что-то подобное?icepro
05.04.2016 12:14Да, это оговорено в правилах, 10 секунд таймаут бота.
Реализовано с помощью ExecutorService который умеет ограничивать время выполнения.Artyomcool
05.04.2016 13:34А можно чуть подробнее? Если делается Thread.stop(), то получим неконсистентность, если interrupt, то
while(true) { try { ... } catch (InterrruptedException ignored) { } }
Artyomcool
05.04.2016 13:35Да и InterruptedException скорее всего даже не возникнет, если не будет блокирующих операций, а будет просто тупой while (true)
icepro
05.04.2016 14:39Вот как это выглядит:
ExecutorService executor = Executors.newSingleThreadExecutor(); Future<GameResults> futureResult = executor.submit(new GameTask(player1, player2)); results.add(futureResult.get(Constants.GAME_TIMEOUT, TimeUnit.MILLISECONDS));
Artyomcool
05.04.2016 16:16Потоки потекут. Future.get не прерывает исполнение внутри executor'а, только возобновляет работу текущего потока. В потоке Executor'а будет всего лишь вызван Thread.interrupt(). Это нормально?
Artyomcool
05.04.2016 16:20Просто в Java многозадачность кооперативная. Нельзя (насколько мне известно) кого-то принудить завершиться за определенный промежуток времени. Возможно, конкретно в вашем случае это вполне ок. Но выглядит так, что будет не очень хорошо.
icepro
05.04.2016 17:28Что бы держать потоки под контролем нужно их прерывать, тут я согласен. Делать это можно в 2 этапа. Первое, Future.cancel, второе, обрабатывать interrupt внутри задачи.
Так я думаю будет корректно.Artyomcool
05.04.2016 17:29Да, но timeout же для того и нужен, чтобы нехорошие пользователи не отжирали все время под себя? Или я не правильно понял? А если пользователь нехороший, то странно ожидать от него, что он обработает interrupt корректно.
icepro
05.04.2016 18:16Да, поняли все правильно. Но тут дело в том что Callable для ExecutorService'а умеет отличать ситуацию когда Future.cancel.
Вот примерно так stackoverflow.com/a/16277241/1239020dougrinch
05.04.2016 22:10Что значит «Callable для ExecutorService'а умеет отличать ситуацию когда Future.cancel»? Все, что делает future.cancel(true) — выкидывает задачу из очереди, если она еще не запустилась, или говорит Thread.interrupt, если задача уже работает.
icepro
05.04.2016 23:37При future.cancel тред выполняющий задачу помечается как interrupted. Тут то и можно внутри таски проверить Thread.currentThread().isInterrupted() и сделать необходимые действия.
dougrinch
05.04.2016 22:24Вообще, корректно сделать песочницу — довольно сложная задача. Да и все равно найдется способ все сломать. С другой стороны, песочница у нас уже есть — jvm. Соответственно, я у себя в конечном счете пришел к решению запускать jvm со включенным SecurityManager и ограниченным хипом на каждую игру. А время работы мониторить снаружи и слать sigterm если зависло.
icepro
05.04.2016 23:20Тут сделано аналогично, и квалификация и игры турнира запускаются в отдельной jvm.
Так что даже если все свалится, урона будет не много.
icepro
05.04.2016 23:32время работы мониторить снаружи и слать sigterm если зависло.
в моем случае это не подходит, мне нужно знать виновника
dougrinch
05.04.2016 22:19На самом деле, если очень аккуратно, то Thread.stop() можно. Главное, о чем предупреждают — отпускание мониторов. Но в данном случае их и так не будет.
GlukKazan
05.04.2016 13:36Я правильно понимаю, что игра более чем двух игроков не поддерживается?
icepro
05.04.2016 14:23Да, все так. Но в списке фич есть поддержка игры для более 2-х игроков.
GlukKazan
05.04.2016 14:52Под фичами имеются в виду планируемые доработки? Почин интересный, но «Дурак» из двух игроков довольно примитивная игра (особенно если ещё и не переводной). Ещё вопрос: интерфейс AI выглядит как-то куце, непонятно, как бот узнаёт о том, какие карты на руках? Или всё это включается в Table? Может ли бот хранить какое-то своё состояние? По интерфейсу не помешало бы более подробное описание. Я немного думал об этой игре (и возможно вернусь к этому). Тема мне интересна и хочется больше технических подробностей.
icepro
05.04.2016 15:37Под фичами имеются в виду планируемые доработки?
Да
Или всё это включается в Table?
Да
Может ли бот хранить какое-то своё состояние?
На всю сессию игры используется один инстанс, так что можете создать поля класса и хранить там доп информацию
По интерфейсу не помешало бы более подробное описание.
Большая часть описана в Dev Guide секции на Intro странице. Если чего не хватает — пишите, добавлю
хочется больше технических подробностей.
Судя по результатам голосования мне придется раскрыть карты.
Pr0per
05.04.2016 14:11После прочтения в «Битву умом» желания включаться не появилось, но интерес пройти по ссылке появился. На первый взгляд все достаточно культурно оформлено, смутило лишь то что дизайн сайта не адаптивный.
icepro
05.04.2016 14:28Серверная часть весьма независима от клиентской. Это было сделано для того что бы можно было поддержать в будущем другие платформы. Адаптировать сам сайт я не стал, так как для того же андроида весь функционал не нужен, но вот сделать легкий клиент будет довольно просто.
jkeee
05.04.2016 15:21+1в университете мы делали студенческий проект с похожей идеей, но за основу взяли чуть более сложную вселенную, чем Дурак
warspot.cloudapp.net/Document/About
warspot.cloudapp.net/Document/SmallGuide
wOvAN
| каждый человек любит соревноваться и доказывать свое первенство
Я не человек (
icepro
Не поверю если скажете что любите проигрывать или быть аутсайдером.
wOvAN
Быть в чем то и кого то лучше, не означает движения к собственной цели.
icepro
У Вас слишком абстрактная формулировка. А на самом деле это весьма связанные вещи.
Вот взять к примеру open source, это движение само по себе уже говорит что ради признания, уважения или первенства люди готовы даже денег не брать.
jcmvbkbc
open source энтузиасты пилят, чтобы у себя работало, а отдают — чтобы не протухло со временем. Если тебе самому не надо — фиг ты что толковое напишешь.
Jesus05
Не все пытаются быть именно лучше других, именно соревноваться, кто-то просто творит без привязки лучше\хуже.
Charg
Вот взять к примеру open source, это движение само по себе уже говорит что ради признания, уважения или первенства люди готовы даже денег не брать.
Или ради проверки на вшивость кода (конечно редко но возможность то есть).
Или ради доработки софта, который собираешься использовать.
Или ради обретения навыков командной разработки.
Или… или…
Нельзя так просто взять и отождествить open source с глобальной фаллометрией.
ragimovich
Отсутствие желания соревноваться не означает проигрыш. Иногда проще съесть корешок, а не гоняться за мамонтом, рискуя быть сожранным саблезубым тигром.
Ну и, чтобы два раза не «вставать», движение Open Source держится не только и не столько на «признании, уважении и первенстве», сколько на простой невозможности некоторых людей не писать код. Скольких контрибюторов ядра Линукс вы знаете? Я — ни одного, кроме самого Линуса. О какой популярности тут может идти речь, если о них не знает никто, кроме тех, кто с ними же работает? Широко известные в узких кругах? Ну, ок. Только это скорее повторяет мою мысль — они занимаются этим либо за деньги (сколько там процентов коммитов в ядро идет от корпораций вроде Google и Intel?), либо из любви к искусству.
Соревновательный элемент в IT представлен исключительно спортивным программирование, успехи в котором, по слухам (https://geektimes.ru/post/248580/), имеют скорее обратную корреляцию со способностью работать в команде среднестатистических людей. Проводя аналогию — да, ты можешь догнать мамонта быстрее остальных охотников, но что ты будешь с ним делать один? Ты можешь «запилить» крутой коммит в любимый OS проект, но если его сможет понять 1-2 человека из команды, кому он нужен в таком виде? Кто будет его поддерживать потом?
zirf
Насчет контрибуторов ядра линукса, вообще их много, более того они за зарплату работают. Окуда RHEL берется неужто кучка энтузиастов? Которые потом организованно берут деньги за поддержку. Плюс к этому Red Hat имеет кучу проектов "просто-бесплатно", "круто-дорого". И все доступно, пилите Шура.
qrKot
Ну и, чтобы два раза не «вставать», движение Open Source держится не только и не столько на «признании, уважении и первенстве», сколько на простой невозможности некоторых людей не писать код. Скольких контрибюторов ядра Линукс вы знаете? Я — ни одного, кроме самого Линуса. О какой популярности тут может идти речь, если о них не знает никто, кроме тех, кто с ними же работает?
И даже тут «признание, уважение и первенство», таки имеет место быть. Просто признание не со стороны «ширнармасс», а конкретно со стороны «уважаемого человека Линуса», например. Признание от коллег и т.д. и т.п. Конечно, мировая слава не всех манит, но признание от людей, которых человек сам уважает (что важно), значит, причем значит многое.
icepro
Да, вот эту часть я и пытался донести.
MAXHO
Тем не менее свой первонах под постом вы вбили…
Чем доказали свое первенство в этом скромном соревновании...
Может вы просто вытесняете мысль о желании быть первым из сознания, а подсознание грезит господством над МИРОМ!
ivanbolhovitinov