Асёнка , описание Вашей игры показалось мне знакомым. Мы тоже любим в нее играть. Написала Вам правила, если что-то непонятно, спрашивайте. Приятного времяпровождения!

Карточная игра "Мост" ("Bridge")
Правила:
1. Количество игроков два и более.
2. Колода 54карты (с 2-мя джокерами)
3. Каждый игрок получает по 6 карт. Оставшиеся карты в колоде
выкладываются на стол рубашкой вверх, причем первая верхняя карта кладется
рядом с колодой рубашкой вниз. Жребием или по-договоренности определяют сдающего,потом становятся сдающими по очереди по часовой стрелке. Первый ход делает следующий игрок за сдающим.
4. Цель игры: Набрать больше очков, делая выкладки. Выигрывает тот игрок, кто быстрее наберет 500 очков или чуть больше (очки полученные за несколько игр суммируются).

5. Выкладка: Одна выкладка состоит из трех карт и более, выложенных за один раз. Может быть двух типов: по масти
(например: К пики,Т пики, 2 пики; 3 червы,4 червы,5 червы и т.д) или по достоинству
(например: В пики, В трефы, В бубны; 7 трефы, 7 бубны, 7червы и т.д.)
Последовательность карт в выкладках по достоинству: 2,3,4,5,6,7,8,9,10,В,Д,К,Т,2,3,4,5 и т.д.

6. Мост: это карты выложенные игроками последовательно на стол рубашкой вниз рядом с колодой (т.е. на столе есть закрытая колода, а за ней ряд открытых карт)

7.--Ход каждого игрока начинается с того, что он берет карту и заканчивается тем,что он кладет карту.Все операции (выкладки,обмен джокеров,докладывание карт до выкладок) проводятся строго в течении своего хода.
--Игрок в свой ход должен взять одну карту либо из колоды, либо из моста, т.е. если для образования выкладки нужная игроку карта находится в мосте, он берет ее (делает выкладку именно с этой карты) и все последующие за ней карты (т.е. берет весь мост начиная с нужной карты для выкладки).
--Игрок обязан сделать выкладку с первой картой, взятой из моста.
--В конце каждого хода игрок выкладывает любую одну карту в мост (из тех карт,что на руках).
--Джокеры могут заменять любую карту в выкладках. Игрок обязан озвучить, какую карту заменяет джокер.
Например: у игрока А есть выкладка - 8 трефы,джокер (заменяющий 9 трефы),10 трефы. Игрок В имеющий карту 9 трефы может (по своему желанию) обменять ее на джокера игрока А. Здесь надо соблюдать правило - в выкладках и мосте не могут
лежать одновременно карта и заменяющей ее джокер.
Например: если у игрока А выкладка - Д пики, Д бубны, Д трефы, тогда у игрока В
не может быть такой выкладки - В трефы, джокер (заменяющий Д трефы), К трефы.
Д трефы уже есть в другой выкладке.
--Игрок сделавший хотя бы одну выкладку, может доложить одну карту или более до своих и чужих выкладок, т.е. продолжать их. При этом доложенные карты игрок кладет рядом со своими выкладками и очки засчитываются ему в плюс.
Например: у игрока А выкладка - 2 бубны, 2 трефы, 2 пики. у игрока В выкладка -
К червы, Т червы, 2 червы, 3 червы. Значит до выкладки игрока В игрок А или игрок В могут доложить такие карты: 4 червы (и далее 5 червы,6 червы...)
или Д червы (и далее В червы, 10 червы...). До выкладки игрока А ни игрок В, на игрок А не могут доложить карту 2 червы, т.к. она уже присутствует в выкладке
игрока В.

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

9. Подсчет очков:
Карты достоинством 2,3,4,5,6,7,8,9 - 5очков; 10,В,Д,К - 10очков; Т- 15очков.
После окончания игры все карты в выкладках записываются игроку в плюс, оставшиеся на руках – в минус. Джокеры в выкладках дают 0 очков,на руках дают по 100 очков в минус.

Бридж , называемый Британской энциклопедией «весьма популярным в определенных кругах», единственная из карточных игр, включенная в перечень Олимпийских видов спорта.

Классический бридж называется робберным, второй вид этой игры – спортивный – разработан специально для соревнований таким образом, чтобы минимизировать влияние случайностей на результат. При игре в бридж используется 52-карточная колода, а количество игроков кратно четырем. Жеребьевка определяет пары, а размещение за столом происходит таким образом, что два игрока-партнера из одной пары сидят напротив друг друга. Традиционно принято обозначать всех игроков по сторонам света. Бридж-клубы и организаторы соревнований практикуют раскладывание на столах своеобразных «компасов» с обозначением сторон света. Обозначенные на них стороны света не должны совпадать с реальными географическими, однако после жеребьевки игроков и их карты начинают именовать согласно указанным на «компасе» сторонам света. Пример: игрок Север, его карты – рука Севера. Поскольку партнеры сидят напротив, Север играет в паре с Югом, карты которого называются рукой Юга. Законченный цикл игры называют туром, он состоит из трех робберов, в начале каждого из которых проводится новая жеребьевка. Каждый роббер – две игры (гейма), на протяжении которых изменения в парах невозможны.

Сдача карт в бридже

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

Карты в бридже

Колода из 52 карт состоит из четырех мастей по 13 карт в каждой. В бридже старшинство карт считается не только по «номиналу (2, 3, 4, 5, 6, 7, 8, 9, 10, валет, дама, король, туз – по возрастающей), но и по мастям. Младшими мастями считаются трефа и бубна, их называют «минорами». «Мажоры» или старшие масти – черва и пика. Самая старшая из «мажоров» - пика, младшая из «миноров» - трефа. Названия карт в бридже сходно с именами в преферансе. Старшинство «номиналов» традиционное. Старшие (от 10 до туза) называются онерами (дама, король, туз – старшие онеры). Младшие карты (от 2 до 9) – фосками.

Распределение или расклад мастей

Раскладом называется распределение мастей карт в одной руке. Равномерным раскладом считается распределение, при котором в руке находится не более одного дуплета (двух карт одной масти). Карту, которая представляет свою масть единственной в руке, называют синглетом. Если какая-то масть в руке отсутствует, это – ренонс масти. Если карт одной масти три и менее, это – короткая масть, более четырех – длинная. При раскладе карт используются следующие термины: - регулярная рука – расклад, не содержащий «пятерок» (пять карт одной масти), - косая рука – расклад, при котором хотя бы девять карт руки относятся к длинным мастям.

Взятки в бридже

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

Заявки

В игре пары делают заявки. Так называется обязательство взять определенное количество взяток. При этом оговаривается масть взяток и наличие в них козырей. Заявки бывают следующих видов:

  1. Отказ от торговли. Пас. Не лишает права делать заявки на следующем круге.
  2. Контракт. Заявление числа, масти и наличия козырей во взятках, которые обязуется взять пара партнеров. Заявки осуществляются по восходящей.
  3. Контра – опровержение заявки противников. Ставка на то, что пара не сможет выполнить сделанную заявку.
  4. Реконтра – ответ на контру, подтверждение сделанной заявки.

Торгующиеся стороны в бридже имеют принятые традиционно обозначения: автор заявки – открывающий, сидящий напротив партнер – о твечающий, по левую руку от открывающего противник – первый защищающийся, его партнер – второй защищающийся. Начало торговли – ход сдающего. Он может быть как в виде конкретной заявки, так и в виде паса. Пас всего стола означает пересдачу карт и новую игру. Торговля осуществляется по восходящей, причем перебить можно заявку не только противников, но и своего партнера. Конец торгов объявляется после трех подряд пасов после какой-либо заявки. Это же относится к условиям вступления в силу контры или реконтры.

Розыгрыш карт

После окончания торгов проверяется возможность выполнения игроками сделанных ими заявок. При этом цель сделавших заявку – выполнить ее, цель их противников – не допустить этого. Разыгрывающим вне зависимости от того, кто сделал окончательную заявку, станет назвавший масть этого контракта Противники разыгрывающего называются в бридже «вистующими». Один из вистующих делает первый выход, после чего партнер того, кто стал в этой игре разыгрывающем выкладывает все карты на стол вниз рубашкой (открытыми). Разыгрывающий, в свою очередь, распоряжается в игре и своими, и выложенными картами, при этом партнер не имеет права принимать участие в игре, оставаясь наблюдающим. После того, как сыграны все взятки, осуществляется подсчет результатов игры в очках и запись. За выполнение контракта назначается премия, в противном случае – штраф. Количество дополнительно начисленных или снятых очков определяется сложностью (высотой) контракта, и зональностью, которая оговаривается до начала игры. В «зоне» действуют более низкие штрафы и премии. Высота контракта определяется его классом. Класс «шлемовых» контрактов – обязательства на 12 или 13 взяток. Геймовые контракты приносят небольшие премии. Этот класс называют минимальным, поскольку он приносят одинаковые премии при равном количестве взяток, но расхождении в их качестве (наличие козыря, масть и т.п.). Контракты ниже, чем геймовые, относятся к классу частичных и приносят очень маленькие премии. Расчет очков по принятому международному стандарту ведется в соответствии со следующими правилами: Взятка в младшей масти (трефа или без козырей) - по 20 очков, в старшей масти (черва или пика) - по 30 очков, первая взятка без козыря – 40 очков, последующие без козыря - по 30 очков. Удвоить запись может контра, реконтра увеличивает количество очков в 4 раза. Дополнительные взятки (сверх обязательств) приносят: бубновая или трефовая – 20 очков, червовая или пиковая – 30.

Мост

Популярный среди шулеров прием съема карт. Под съемом подразумевается обмен местами двух разделенных половин колоды. При хорошем исполнении невозможно увидеть данный обмен карт. Заключается он в следующем. Шулер изгибает сначала одну часть колоды вверх, а затем другую часть колоды вниз. Приготовив карты, шулер переносит верхнюю часть колоды вниз, показывая своими движениями, что он намеревается тасовать. Таким образом согнутые половины колоды складываются и образуют в середине пустоту, которая позволяет сделать съемку именно в этом месте. В таком положении шулер придерживает карты указательным пальцем до момента снятия колоды. Для чего шулеру нужно сделать съем карт в определенном месте? Например, шулер тасуя карты, исполняет прием подлог , нужные карты собраны в нижней части колоды. Затем шулеру нужно поменять местами верхнюю и нижнюю часть колоды. Шулер разделяет колоду в нужном месте и собранные необходимые карты для выигрыша, перемещаются при съеме наверх колоды.
Более подробно данный прием описан в разделе карточных фокусов под названием

Предлагаю устроить спортивное программирование - написание ИИ на 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:
* this.getPlayers().length
* this.getPlayers().cards.length
* this.getPlayers().score
*
* card.getValue() - the cost of the card
* card.getName() - russian name of the card
* card.setRequireSuit( suit) - set require suit (one of ["s","c","h","d"]) if rank of card is "Jacket"
*
* this.player.hasPuttable() - return on the puttable cards or null, if no such
* 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();
},
putCardSmart : function (card ) {
if (card . rank == "j" ) {
card . setRequireSuit (
[ "s" , "c" , "h" , "d" ]. 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 getPlayers()
// returns array of the players
// @protected message( msg)
// puts text msg to the screen (returns this)
// @protected lastCard()
// returns last opened card
// @protected debug()
// open all cards (just for debug)
// @protected canhGetCard()
// returns true, if you can get card from the deck
// @protected getCard( onFinish)
// gets card from the deck or throw exception. First arg of the function is getted card
// @protected canPutCard( card)
// returns true, if you can put card to the deck
// @protected putCard( card, onFinish)
// puts card to the deck or throw exception
// @protected canFinishMove()
// returns true, if you can finish the move
// @protected finishMove()
// finish the move, or throw exception
});