Дворовой бридж — соревнование ИИ (libcanvas)


    Предлагаю устроить спортивное программирование — написание ИИ на Javascript для игры в дворовой бридж. Предоставляю уже готовую игру на libcanvas и изящный интерфейс для создания AI. Все, что вам надо — браузер, немного азарта и знание JavaScript. Первый этап — вы программируете свой ИИ, играя против него. Второй этап — вы программируете свой ИИ и он играет против лучших из первого этапа. После второго этапа проводим турнир и объявляем итоги. Уверен, что получим много фана и удовольствия. Победителям — слава и почет. Если победят не зарегистрированные на Хабре — готов предоставить инвайты.



    Бридж


    Уверен, многие играли в эту игру. У неё много имен и еще больше правил. Мы будем использовать следующие:
    1. Цель — скинуть побыстрее все карты, оставив противников с максимальным количеством карт
    2. За каждую карту в конце игры начисляются очки — 10 за десятку, даму, короля, 15 за туза, 20 за вальта.
    3. Первый, кто перескочил планку 125 очей — проигрывает. У того, кто наберет ровно 125 очей — они сгорают и он начинает с нуля (повезло)
    4. Игрок должен ложить карту (или несколького) того же значения, или той же масти (кроме исключений)
    5. Шестерку надо обязательно накрыть — берем карты из колоды, пока не накроем
    6. Семерка заставляет следующего взять карту
    7. Восьмерка — две карты и пропустить ход (две восьмерки — двоих, три — троих)
    8. Валет — может ложится на любую масть и можно заказать любую масть
    9. Туз — следующий игрок пропускает ход

    Условия конкурса


    Играем в два тура. Первый тур(одна неделя) — мы играем против своего же ИИ. Второй — я выберу несколько лучших ИИ, обфусцирую их и будем играть против них. Таким образом надо будет делать разнообразный, подстраивающийся под разные стили ИИ для победы. Ко второму туру я подгоню еще пару интересных моментов в игре (но интерфейс останется обратносовместимым).
    ИИ должен быть понятно написан. Я буду проводить визуальную инспекцию кода. Все непонтные участки буду браковать. Если получилось сумбурно — лучше прокомментируйте или в коде или в отдельном поле.
    Цель ИИ — заработать минимальное количество очков за игру, при этом загрузив картами врагов.
    Ваш скрипт не должен выбрасывать expetion'ов и обращатся в запретные зоны (представте, что ИИ — это человек и подумайте, что ему доступно).
    Тем не менее, доступ к таким зонам я оставил для дебага.
    Код ИИ должен быть кроссбраузерным (последние Хром, Опера, Фокс, ИЕ9)
    Вы можете обращаться к методам, которые предоставляет MooTools Core.
    Допускается легкий ненавязчивый редкий юмор в консоль игры.

    Пример нюансов игры, которые стоит обработать


    В игре Бридж много нюансов — стоит учитывать, например, количество игроков, а оно может быть любое от 2 до 6. Если играть вдвоем или вчетвером, то выгодно заваливать ближайшего противника. При игре же втроем если завалим ближайшего, то следующий ход будет на нас, потому лучше подкинуть ему карт семерками.
    При определенных расскладах можно загрузить противника и закончить игру за один ход.
    При игре с напарником 2х2 (хотя это не предусмотренно правилами, но часто так случается) — можно практически не давать хода врагам.
    Учтите, возможно я добавлю сетевую игру. Будем потом играть против своих же ИИ ;)

    Пример кода ИИ


    Каждый ход контроллер вызывает метод AI.movement(); и ждет от того вызова метода this.finishMove(). Ниже вы видите пример ИИ, который используется в игре сейчас:
    Если это первый ход, то он старается закончить (если лежит шестерка, то он закончить не сможет), иначе — старается если есть чем (выбирается случайно) или взять карту. Обратите внимание на использование асинхронных вызовов — перед тем, как ложить следующую карту надо дождаться, чтобы долетела предыдущая.
    /*
     * allRanks : ['a','k','q','j','10','9','8','7','6'],
     * allSuits : ['s','c','h','d'],
     *
     * You can read:
     * <int> this.getPlayers().length
     * <int> this.getPlayers()[index].cards.length
     * <int> this.getPlayers()[index].score
     *
     * <int> card.getValue() - the cost of the card
     * <string> card.getName()  - russian name of the card
     * <Bridge.Card> card.setRequireSuit(<string> suit) - set require suit (one of ['s','c','h','d']) if rank of card is "Jacket"
     *
     * <Bridge.Card|null> this.player.hasPuttable() - return on the puttable cards or null, if no such
     * <int> this.player.sumCards() - the cost of all cards
     */

    window.addEvent('domready', function () {

    Bridge.AI = new Class({
        Extends : 
    Bridge.AIUtils,
        
    // @Override
        
    initialize : function (player) {
            
    this.parent(player);
            
    // this.debug();
        
    },
        
    // @private - part of demo logic
        
    putCardSmart : function (card) {
            if (
    card.rank == 'j') {
                
    card.setRequireSuit(
                    [
    's','c','h','d'].getRandom()
                );
            }
            
    this.putCard(cardthis.finishSmart.bind(this));
        },
        
    // @private - part of demo logic
        
    getCardSmart : function () {
            
    this.getCard(function (card) {
                
    this.canPutCard(card) ?
                    
    this.putCardSmart(card) :
                    
    this.finishSmart();
            }.
    bind(this));
        },
        
    // @private - part of demo logic
        
    finishSmart : function () {
            
    this.canFinishMove() ?
                
    this.finishMove() :
                
    this.movement();
        },
        
    // @Override
        
    movement : function (first) {
            if (
    first) {
                
    this.finishSmart();
            } else {
                var 
    card this.player.hasPuttable();
                
    card this.putCardSmart(card) : this.getCardSmart();
            }
        }

        
    // @protected <Bridge.Player[]> getPlayers()
        //        returns array of the players
        // @protected <Bridge.AI> message(<string> msg)
        //        puts text msg to the screen (returns this)
        // @protected <Bridge.Card> lastCard()
        //        returns last opened card
        // @protected <Bridge.AI> debug()
        //        open all cards (just for debug)
        // @protected <Boolean> canhGetCard()
        //        returns true, if you can get card from the deck
        // @protected <Bridge.AI> getCard(<function> onFinish)
        //        gets card from the deck or throw exception. First arg of the function is getted card
        // @protected <Boolean> canPutCard(<Bridge.Card> card)
        //        returns true, if you can put card to the deck
        // @protected <Bridge.AI> putCard(<Bridge.Card> card, <function> onFinish)
        //        puts card to the deck or throw exception
        // @protected <Boolean> canFinishMove()
        //        returns true, if you can finish the move
        // @protected <Bridge.AI> finishMove()
        //        finish the move, or throw exception
    });

    });


    Как принять участие


    Чтобы принять участие — регистрируемся на libcanvas.com (подтверждение на емейл не нужно, достаточно логин и пароль), идем в игру и видим сверху ссылку "Edit Artificial Intelligence". Там мы видим текстарию для ввода кода или возможность указать ссылку на внешний урл (например чтобы было удобно редактироват на локалхосте, не забудьте вернуть назад)

    ps. Отвечаю на вопросы и до начала второго тура принимаю предложения по улучшению.

    pps. Спасибо Nutochka за дизайн)


    ppps. интересует скорость и стабильность работы на вашем железе и браузерах и сравнение скорости с тем, что было в косынке
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 21

      +1
      Эта игра не имеет ничего общего ни с робберным ни со спортивным бриджем.
          +1
          В отличие от большинства карточных игр, бридж сегодня имеет строго определённые правила и даже признан МОК как вид спорта. Мне совсем не понятна этимология этого уличного названия.
            +3
            мне тоже.
            тем не менее, на «улицах» это самое популярное название. по крайней мере у нас.
            я прекрасно знаю про спортивный бридж и совершенно не претендую на его лавры, потому в заголовке прямо написал — дворовой бридж.
        +4
        Победителям — слава и почет.

        респект и уважуха :-D
          +1
          именно)
          +1
          Везде «101» называется. И в Омске, и в Орле, и в Волгодонске, и в Ростове. По личному опыту.
            +4
            В Киеве, Москве и Симферополе называли Бридж, по личному опыту, но вы можете называть как душа пожелает, я только за.
            ох, ну и холивар с названием, какая разница? все-равно я не буду из-за такого пустяка переписывать исходники)
              +2
              Да не холивар, просто очень слух режет, особенно для тех кто в обычный бридж играет.
              +1
              +1 за пермь и ижевск )
                +3
                У нас тоже 101 и при этом играли по старым/классическим правилам.
                  0
                  Аналогично. Новосибирск, Ноябрьск.
                  0
                  На javascript? То есть выполняться он будет на моей же стороне?
                  Может пусть каждый пишет бота на любом языке из списка определенных популярных, стравить ботов в песочнице и красиво наблюдать за ними?

                  ЗЫ. К сожалению, в бридж не играл ни разу, и интересно сколько из тех, кто захочет принять участие, умеет хорошо играть в бридж
                  • НЛО прилетело и опубликовало эту надпись здесь
                      +1
                      я буду проводить проверки кода. а потом тесты в песочнице. шанс, что на главную попоадет зловредный код — минимальная. непонятные куски я буду просто забраковывать
                        +1
                        К сожалению, в бридж не играл ни разу, и интересно сколько из тех, кто захочет принять участие, умеет хорошо играть в бридж
                        Ну. Эта игра достаточно легка. Полчасика пошпилить с компами и ты уже понимаешь принципы и умеешь в него играть. А мастеров реальных в неё нету, наверное)
                          0
                          Просто предпочитаю преф, мне в бридж не очень интересно :)
                            +3
                            «Везение тут играет умнее, чем умение играть». По-крайней мере те, кто имеет хоть какие-то навыки, легко сможет чувствовать себя на уровне ветеранов.
                          0
                          Вот если бы преферанс я бы поучаствовал…
                            +1
                            Расписной покер не планируете?
                            Прекрасная игра, и что странно — не одной реализации на компьютере.
                              +1
                              Наверное нет, с картами на меня пока хватит)

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

                            Самое читаемое