Привет, Хабрахабр!

Я хочу сыграть с тобой в игру.


Но если быть точным, то я хочу презентовать вам результат моей работы за последние пару месяцев. Кодовое название — песочница.

Что это?


Суть данной системы проста: это песочница для программистов. Здесь можно и нужно писать исскуственный интеллект для своих ботов и играть с ботами других участников. Во что играть? Все просто — в дурака. Да-да, в карточную игру.

Данная система выросла из небольшого проекта по изучению пермишенов в 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) — подскажите, я перенесу.
Появилось ли желание поучаствовать?

Проголосовало 313 человек. Воздержался 241 человек.

Нужна ли статья про саму систему, как она построена, как работает, на каких технологиях и тп?

Проголосовало 363 человека. Воздержалось 185 человек.

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

Комментарии (71)


  1. wOvAN
    05.04.2016 01:36
    +18

    | каждый человек любит соревноваться и доказывать свое первенство
    Я не человек (


    1. icepro
      05.04.2016 01:37
      -7

      Не поверю если скажете что любите проигрывать или быть аутсайдером.


      1. wOvAN
        05.04.2016 01:39
        +12

        Быть в чем то и кого то лучше, не означает движения к собственной цели.


        1. icepro
          05.04.2016 01:43
          -1

          У Вас слишком абстрактная формулировка. А на самом деле это весьма связанные вещи.
          Вот взять к примеру open source, это движение само по себе уже говорит что ради признания, уважения или первенства люди готовы даже денег не брать.


          1. jcmvbkbc
            05.04.2016 10:04
            +2

            взять к примеру open source, это движение само по себе уже говорит что ради признания, уважения или первенства люди готовы даже денег не брать.

            open source энтузиасты пилят, чтобы у себя работало, а отдают — чтобы не протухло со временем. Если тебе самому не надо — фиг ты что толковое напишешь.


          1. Jesus05
            05.04.2016 10:18
            +2

            Не все пытаются быть именно лучше других, именно соревноваться, кто-то просто творит без привязки лучше\хуже.


          1. Charg
            05.04.2016 10:38
            +3

            Вот взять к примеру open source, это движение само по себе уже говорит что ради признания, уважения или первенства люди готовы даже денег не брать.
            Или ради проверки на вшивость кода (конечно редко но возможность то есть).
            Или ради доработки софта, который собираешься использовать.
            Или ради обретения навыков командной разработки.
            Или… или…
            Нельзя так просто взять и отождествить open source с глобальной фаллометрией.


      1. ragimovich
        05.04.2016 03:04
        +19

        Отсутствие желания соревноваться не означает проигрыш. Иногда проще съесть корешок, а не гоняться за мамонтом, рискуя быть сожранным саблезубым тигром.

        Ну и, чтобы два раза не «вставать», движение Open Source держится не только и не столько на «признании, уважении и первенстве», сколько на простой невозможности некоторых людей не писать код. Скольких контрибюторов ядра Линукс вы знаете? Я — ни одного, кроме самого Линуса. О какой популярности тут может идти речь, если о них не знает никто, кроме тех, кто с ними же работает? Широко известные в узких кругах? Ну, ок. Только это скорее повторяет мою мысль — они занимаются этим либо за деньги (сколько там процентов коммитов в ядро идет от корпораций вроде Google и Intel?), либо из любви к искусству.

        Соревновательный элемент в IT представлен исключительно спортивным программирование, успехи в котором, по слухам (https://geektimes.ru/post/248580/), имеют скорее обратную корреляцию со способностью работать в команде среднестатистических людей. Проводя аналогию — да, ты можешь догнать мамонта быстрее остальных охотников, но что ты будешь с ним делать один? Ты можешь «запилить» крутой коммит в любимый OS проект, но если его сможет понять 1-2 человека из команды, кому он нужен в таком виде? Кто будет его поддерживать потом?


        1. zirf
          05.04.2016 08:54

          Насчет контрибуторов ядра линукса, вообще их много, более того они за зарплату работают. Окуда RHEL берется неужто кучка энтузиастов? Которые потом организованно берут деньги за поддержку. Плюс к этому Red Hat имеет кучу проектов "просто-бесплатно", "круто-дорого". И все доступно, пилите Шура.


        1. qrKot
          05.04.2016 09:38

          Ну и, чтобы два раза не «вставать», движение Open Source держится не только и не столько на «признании, уважении и первенстве», сколько на простой невозможности некоторых людей не писать код. Скольких контрибюторов ядра Линукс вы знаете? Я — ни одного, кроме самого Линуса. О какой популярности тут может идти речь, если о них не знает никто, кроме тех, кто с ними же работает?
          И даже тут «признание, уважение и первенство», таки имеет место быть. Просто признание не со стороны «ширнармасс», а конкретно со стороны «уважаемого человека Линуса», например. Признание от коллег и т.д. и т.п. Конечно, мировая слава не всех манит, но признание от людей, которых человек сам уважает (что важно), значит, причем значит многое.


          1. icepro
            05.04.2016 10:20

            Да, вот эту часть я и пытался донести.


    1. MAXHO
      05.04.2016 08:25
      +2

      Тем не менее свой первонах под постом вы вбили…
      Чем доказали свое первенство в этом скромном соревновании...
      Может вы просто вытесняете мысль о желании быть первым из сознания, а подсознание грезит господством над МИРОМ!


    1. ivanbolhovitinov
      05.04.2016 16:38

      каждый человек любит соревноваться и доказывать свое первенство
      Я не человек (
      Человек. Как говорит старинная народная мудрость: мир движут вперёд две вещи — лень и пиписькомерение.


  1. prefrontalCortex
    05.04.2016 08:38
    +6

    Для написание нужны: java
    Вы добавили бы поддержку более других языков :)


    1. icepro
      05.04.2016 09:24
      -1

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


      1. Fedcomp
        05.04.2016 09:59

        Или запуск бинарников (в докере(небезопасно?) или в виртуалке(ресурсоемко)) и игра с ними используя сетевой протокол.


        1. icepro
          05.04.2016 10:23

          Да, оба варианта были на примете. И все это я назвал одним термином — многоязычная среда исполнения (в детали реализации я не вдавался). Но все же это требует времени на реализацию, а я пока решил держать концентрацию функциональной составляющей.


      1. hurricup
        05.04.2016 11:15
        -1

        Можно просто паблик апи. Я даю вам ссылку где слушает мой бот, вы посылаете ему исходные данные и получаете ответ.


        1. icepro
          05.04.2016 11:26
          -1

          А это облегчит вам работу? Скомпилировать и залить ведь "piece of cake" а поднимать инрфаструктуру для доступа из-вне, уже чуть заморочнее.


          1. hurricup
            05.04.2016 11:28
            +1

            Это облегчит мне возможность написать на чем я хочу и высунуть вам данные в JSON, например.
            Под апи подразумевается не какой-то Java-RPC, а что-то простенькое.


            1. icepro
              05.04.2016 11:38
              +1

              Да, это полезное замечание, добавлю себе в TODO список.


            1. Mingun
              05.04.2016 20:47

              А также арендовать облачную ферму.


      1. pftbest
        05.04.2016 23:27

        Если на вход поступает .jar, то значит, в теории, jvm based языки должны работать?


    1. Source
      05.04.2016 15:53
      -1

      Развлекайтесь на JS и Python: codecombat.com/play/ladder


  1. leoismyname
    05.04.2016 08:41

    Не из мира Java, но идея мне понравилась, да и выглядит хорошо. Думаю, желающие сразиться найдутся.


  1. alkaruno
    05.04.2016 08:56
    +1

    Идея замечательная! Но использование Lombok может отпугнуть потенциальных участников, не знакомых с ним. Тем более даже плагин Lombok для Intellij IDEA "подсвечивает" некоторые ошибки.


    1. icepro
      05.04.2016 09:30
      +2

      Спасибо. И я действительно старался использовать 3rd party по минимуму, но именно тут не удержался. Надеюсь что заинтересовавшиеся все же найдут время что бы познакомиться с данной библиотекой. Тем более что такое знакомство может быть полезно и для личных целей.


  1. prostofilya
    05.04.2016 09:30

    Всё же в «дураке» слишком много зависит от взятой карты, то есть от случайного хода. Думаю, было бы лучше взять игру с большим количеством личных ходов.


    1. icepro
      05.04.2016 09:32

      Система расширяема. Так что не стесняйтесь. Какую игру предложите?


      1. facha
        05.04.2016 09:58
        -2

        Покер. Дурак — слишком прямолинейная игра. Да и знают о нем только на просторах бывшего СССР.


        1. defaultvoice
          05.04.2016 10:23
          +4

          То есть, вы предлагаете создать платформу для обкатки покерных ботов и тем самым, впоследствие, наводнить ими все онлайн-покер ресурсы? :)


          1. facha
            05.04.2016 10:57
            -1

            нет


        1. thepry
          05.04.2016 14:23

          +1 к Покеру. Сам участвовал в Lean Poker хакатонах, де нужно кодить покерных ботов — было весьма интересно.


      1. prostofilya
        05.04.2016 10:07
        +1

        рэндзю


      1. Mart_Slaaf
        05.04.2016 10:37

        Преферанс. И профурсеток
        Но он гемморойнее на этапе реализации + требование наличия трех ботов. (Зато нематчевая система учета очков. =) )


      1. makedonsky94
        05.04.2016 11:23

        Можно взять те же шашки. Довольно простая игра


    1. icepro
      05.04.2016 14:25

      Я буду следить за этой веткой и по результатам обсуждения глянем кто наберет побольше плюсов.
      Если вариант окажется стоящим — возьму в разработку.


  1. Per_Ardua
    05.04.2016 09:32
    +3

    Прикольно) Еще бы была возможность играть с собственным ботом, то есть нечто вроде пользовательского тестирования. А так — идея очень хорошая, да и реализовано на уровне.


    1. icepro
      05.04.2016 09:37

      Да, весьма разумное замечание, для отладки это очень полезная вещь.
      Добавил в список фич для релиза, спасибо.


  1. pro_co_ru
    05.04.2016 11:09

    Интересно, дойдёт ли до того, что боты начнут объединяться друг с другом против более сильных ботов, или обойдётся тем, что каждый будет сам за себя…


  1. hdfan2
    05.04.2016 11:11

    Есть ли возможность узнать некий ID противника и сохранять какие-то данные между играми? Тогда можно было бы писать ботов, подбирающих стратегию против конкретных противников. Или всё полностью анонимно?


    1. icepro
      05.04.2016 11:12
      +1

      Пока что все анонимно. Считаете имеет смысл "раскрыть карты"?


      1. makedonsky94
        05.04.2016 11:28

        Как мне кажется это позволит расширить возможности ботов. Учить бота подстраиваться под конкретного соперника — довольно интересная функция


  1. e_Hector
    05.04.2016 11:12

    правильно ли я понимаю, что бота можно написать на любом jvm-based языке (Scala, Kotlin), главное чтоб на выходе jar для загрузки получился?


    1. icepro
      05.04.2016 11:13

      … главное что бы на выходе был jar в котором есть класс AiImpl реализующий интерфейс Ai


  1. ZOXEXIVO
    05.04.2016 12:07

    Как-то фильтруется время выполнения?
    Если while(true){} будет в боте или еще что-то подобное?


    1. icepro
      05.04.2016 12:14

      Да, это оговорено в правилах, 10 секунд таймаут бота.
      Реализовано с помощью ExecutorService который умеет ограничивать время выполнения.


      1. Artyomcool
        05.04.2016 13:34

        А можно чуть подробнее? Если делается Thread.stop(), то получим неконсистентность, если interrupt, то

        while(true) {
          try {
             ...
          } catch (InterrruptedException ignored) {
          }
        }


        1. Artyomcool
          05.04.2016 13:35

          Да и InterruptedException скорее всего даже не возникнет, если не будет блокирующих операций, а будет просто тупой while (true)


        1. 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));
          


          1. Artyomcool
            05.04.2016 16:16

            Потоки потекут. Future.get не прерывает исполнение внутри executor'а, только возобновляет работу текущего потока. В потоке Executor'а будет всего лишь вызван Thread.interrupt(). Это нормально?


            1. Artyomcool
              05.04.2016 16:20

              Просто в Java многозадачность кооперативная. Нельзя (насколько мне известно) кого-то принудить завершиться за определенный промежуток времени. Возможно, конкретно в вашем случае это вполне ок. Но выглядит так, что будет не очень хорошо.


            1. icepro
              05.04.2016 17:28

              Что бы держать потоки под контролем нужно их прерывать, тут я согласен. Делать это можно в 2 этапа. Первое, Future.cancel, второе, обрабатывать interrupt внутри задачи.
              Так я думаю будет корректно.


              1. Artyomcool
                05.04.2016 17:29

                Да, но timeout же для того и нужен, чтобы нехорошие пользователи не отжирали все время под себя? Или я не правильно понял? А если пользователь нехороший, то странно ожидать от него, что он обработает interrupt корректно.


                1. icepro
                  05.04.2016 18:16

                  Да, поняли все правильно. Но тут дело в том что Callable для ExecutorService'а умеет отличать ситуацию когда Future.cancel.

                  Вот примерно так stackoverflow.com/a/16277241/1239020


                  1. dougrinch
                    05.04.2016 22:10

                    Что значит «Callable для ExecutorService'а умеет отличать ситуацию когда Future.cancel»? Все, что делает future.cancel(true) — выкидывает задачу из очереди, если она еще не запустилась, или говорит Thread.interrupt, если задача уже работает.


                    1. icepro
                      05.04.2016 23:37

                      При future.cancel тред выполняющий задачу помечается как interrupted. Тут то и можно внутри таски проверить Thread.currentThread().isInterrupted() и сделать необходимые действия.


                  1. dougrinch
                    05.04.2016 22:24

                    Вообще, корректно сделать песочницу — довольно сложная задача. Да и все равно найдется способ все сломать. С другой стороны, песочница у нас уже есть — jvm. Соответственно, я у себя в конечном счете пришел к решению запускать jvm со включенным SecurityManager и ограниченным хипом на каждую игру. А время работы мониторить снаружи и слать sigterm если зависло.


                    1. icepro
                      05.04.2016 23:20

                      Тут сделано аналогично, и квалификация и игры турнира запускаются в отдельной jvm.
                      Так что даже если все свалится, урона будет не много.


                    1. icepro
                      05.04.2016 23:32

                      время работы мониторить снаружи и слать sigterm если зависло.

                      в моем случае это не подходит, мне нужно знать виновника


            1. dougrinch
              05.04.2016 22:07

              Future.get никаких интераптов не делает. Все, что вы получите — TimeoutException вместо результата. На сколько я понимаю, там дальше стоит catch на него и future.cancel.


              1. icepro
                05.04.2016 23:29

                Да, все верно.


        1. dougrinch
          05.04.2016 22:19

          На самом деле, если очень аккуратно, то Thread.stop() можно. Главное, о чем предупреждают — отпускание мониторов. Но в данном случае их и так не будет.


  1. GlukKazan
    05.04.2016 13:36

    Я правильно понимаю, что игра более чем двух игроков не поддерживается?


    1. icepro
      05.04.2016 14:23

      Да, все так. Но в списке фич есть поддержка игры для более 2-х игроков.


      1. GlukKazan
        05.04.2016 14:52

        Под фичами имеются в виду планируемые доработки? Почин интересный, но «Дурак» из двух игроков довольно примитивная игра (особенно если ещё и не переводной). Ещё вопрос: интерфейс AI выглядит как-то куце, непонятно, как бот узнаёт о том, какие карты на руках? Или всё это включается в Table? Может ли бот хранить какое-то своё состояние? По интерфейсу не помешало бы более подробное описание. Я немного думал об этой игре (и возможно вернусь к этому). Тема мне интересна и хочется больше технических подробностей.


        1. icepro
          05.04.2016 15:37

          Под фичами имеются в виду планируемые доработки?
          Да

          Или всё это включается в Table?
          Да

          Может ли бот хранить какое-то своё состояние?
          На всю сессию игры используется один инстанс, так что можете создать поля класса и хранить там доп информацию

          По интерфейсу не помешало бы более подробное описание.
          Большая часть описана в Dev Guide секции на Intro странице. Если чего не хватает — пишите, добавлю

          хочется больше технических подробностей.
          Судя по результатам голосования мне придется раскрыть карты.


  1. Pr0per
    05.04.2016 14:11

    После прочтения в «Битву умом» желания включаться не появилось, но интерес пройти по ссылке появился. На первый взгляд все достаточно культурно оформлено, смутило лишь то что дизайн сайта не адаптивный.


    1. icepro
      05.04.2016 14:28

      Серверная часть весьма независима от клиентской. Это было сделано для того что бы можно было поддержать в будущем другие платформы. Адаптировать сам сайт я не стал, так как для того же андроида весь функционал не нужен, но вот сделать легкий клиент будет довольно просто.


  1. Wanderer12
    05.04.2016 15:02
    +1

    О, лишний повод таки начать учить java


  1. jkeee
    05.04.2016 15:21
    +1

    в университете мы делали студенческий проект с похожей идеей, но за основу взяли чуть более сложную вселенную, чем Дурак
    warspot.cloudapp.net/Document/About
    warspot.cloudapp.net/Document/SmallGuide