Бридж спортивный

Сен 7, 2020 Спорт

Бридж спортивный


Предлагаю устроить спортивное программирование — написание ИИ на 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 : ,
* allSuits : ,
*
* You can read:
* <int> this.getPlayers().length
* <int> this.getPlayers().cards.length
* <int> this.getPlayers().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 ) 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(
.getRandom()
);
}
this.putCard(card, this.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. интересует скорость и стабильность работы на вашем железе и браузерах и сравнение скорости с тем, что было в косынке

admin

Поadmin

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *