440 lines
31 KiB
Go
440 lines
31 KiB
Go
package main
|
||
|
||
// thousandRules — текст правил игры 1000 (базовый вариант строго
|
||
// на троих), используется и в TUI-экране "Правила", и при выводе
|
||
// через --help.
|
||
const thousandRules = `1000 (ТЫСЯЧА) — правила (строго на троих игроков)
|
||
|
||
У "Тысячи" огромное количество договорённостей и вариантов (бочка,
|
||
золотой кон, самосвал, тузовый марьяж, игра втёмную, "расписать
|
||
игру" и т.д.). Реализован базовый, самый распространённый вариант
|
||
ИМЕННО НА ТРОИХ игроков — у игры вдвоём/вчетвером заметно другая
|
||
механика прикупа и сдающего, она не реализована.
|
||
|
||
КОЛОДА И СТАРШИНСТВО
|
||
24 карты: 9, В, Д, К, 10, Т в каждой масти. Старшинство карт:
|
||
9 < В < Д < К < 10 < Т — да, десятка сильнее короля, но слабее
|
||
туза, это особенность именно этой игры.
|
||
|
||
ОЧКИ КАРТ
|
||
Туз - 11, десятка - 10, король - 4, дама - 3, валет - 2,
|
||
девятка - 0.
|
||
|
||
РАЗДАЧА И ТОРГИ
|
||
Каждому раздаётся по 7 карт, 3 карты уходят в прикуп. Игрок слева
|
||
от сдающего обязан назвать ставку не менее 100 (это то количество
|
||
очков, которое он берётся набрать за раздачу). Далее по кругу
|
||
каждый либо поднимает ставку минимум на 5, либо пасует —
|
||
спасовавший больше не участвует в этих торгах. Максимальная
|
||
ставка — 120, либо 120 плюс стоимость марьяжа, если он есть на
|
||
руке. Торги заканчиваются, когда остаётся один игрок — он берёт
|
||
прикуп и становится объявившим торг ("играющим").
|
||
|
||
СНОС
|
||
Объявивший торг берёт прикуп (10 карт на руке) и отдаёт по одной
|
||
карте каждому из двух соперников — после этого у всех троих
|
||
становится по 8 карт. Играющий ходит первым.
|
||
|
||
ВЗЯТКИ
|
||
Обязательно ходить в масть; если её нет на руке — козырем (если
|
||
он уже объявлен в этой раздаче); если и козыря нет — любой картой.
|
||
Взятку забирает старшая карта хода, либо старший козырь, если он
|
||
был подложен.
|
||
|
||
МАРЬЯЖ
|
||
Если у игрока, который сейчас ходит первым в новой взятке (кроме
|
||
самой первой взятки раздачи), есть на руке король и дама одной
|
||
масти — он может объявить марьяж, походив одной из этих карт.
|
||
Эта масть становится (или меняется на) козырь до конца раздачи, а
|
||
стоимость марьяжа сразу добавляется к очкам игрока за раздачу.
|
||
Стоимость: пики 40, трефы 60, бубны 80, червы 100.
|
||
|
||
ПОДСЧЁТ ОЧКОВ
|
||
Если объявивший торг набрал (взятками и марьяжами) не меньше
|
||
своей ставки — ему засчитывается ставка целиком. Если меньше —
|
||
ставка вычитается из его счёта. Остальные добавляют себе ровно
|
||
то, что заработали, без штрафов.
|
||
|
||
ОКОНЧАНИЕ ПАРТИИ
|
||
Игра идёт до 1000 очков — первый, кто их наберёт, побеждает.
|
||
|
||
УПРАВЛЕНИЕ В ЭТОЙ ВЕРСИИ
|
||
В торгах:
|
||
↑→/kl или ↓←/hj изменить предлагаемую ставку на ±5
|
||
enter назвать текущую ставку
|
||
p пасовать
|
||
При сносе и в розыгрыше взяток:
|
||
←→/hl выбор карты в руке
|
||
enter сыграть/отдать выбранную карту (король/дама одной масти
|
||
при своём первом ходе взятки = объявить марьяж)
|
||
В любой момент:
|
||
q выход в меню
|
||
После завершения раздачи:
|
||
n новая раздача (если партия ещё не окончена)
|
||
q выход в меню
|
||
`
|
||
|
||
// klondikeRules — текст правил пасьянса Косынка (Клондайк),
|
||
// используется и в TUI-экране "Правила", и при выводе через --help.
|
||
const klondikeRules = `КОСЫНКА (KLONDIKE) — классический пасьянс на одного игрока
|
||
|
||
Реализован классический "Клондайк" с добором по одной карте за раз
|
||
и неограниченным числом пересдач колоды из отбоя.
|
||
|
||
ЦЕЛЬ
|
||
Собрать все 52 карты на четырёх фундаментах — по одному на
|
||
масть, от туза до короля по возрастанию.
|
||
|
||
ПОЛЕ
|
||
7 колонн (по 1-7 карт, в каждой открыта только самая нижняя из
|
||
выложенных карт), колода добора и отбой, 4 фундамента (по одному
|
||
на масть).
|
||
|
||
ХОДЫ
|
||
- В колонну можно положить открытую карту на 1 меньше по рангу и
|
||
противоположного цвета масти (чёрная на красную или наоборот).
|
||
В пустую колонну можно положить только короля.
|
||
- На фундамент можно положить только следующую по рангу карту той
|
||
же масти, начиная с туза.
|
||
- Можно перекладывать между колоннами целиком собранную (по
|
||
убыванию, с чередованием цвета) последовательность карт — не
|
||
только одну карту сверху. "Разрезать" такую цепочку и взять
|
||
только часть нельзя.
|
||
- Когда карта под перемещённой цепочкой открывается — она
|
||
автоматически переворачивается лицом вверх.
|
||
- Из колоды добора карты берутся по одной в отбой; когда колода
|
||
добора заканчивается — весь отбой переворачивается обратно в
|
||
колоду для новой пересдачи (без ограничения числа пересдач).
|
||
- Возврат карт с фундамента обратно в игру не реализован.
|
||
|
||
УПРАВЛЕНИЕ В ЭТОЙ ВЕРСИИ
|
||
Ход состоит из двух шагов: сначала выбор источника, потом — куда
|
||
переложить.
|
||
1-7 выбрать колонну (или переложить выбранное в неё)
|
||
0 выбрать отбой (только как источник)
|
||
f переложить выбранную карту на фундамент
|
||
esc отменить текущий выбор
|
||
d взять карту из колоды добора (пересдаст, если она пуста)
|
||
u отменить последний ход
|
||
n новая партия (перетасовать заново)
|
||
q выход в меню
|
||
`
|
||
|
||
// checkersRules — текст правил русских шашек, используется и в
|
||
// TUI-экране "Правила", и при выводе через --help.
|
||
const checkersRules = `ШАШКИ (RUSSIAN CHECKERS) — против бота
|
||
|
||
Реализованы русские шашки (не международные и не английские) на
|
||
доске 8х8. Вы всегда играете белыми и ходите первым; бот играет
|
||
чёрными (минимакс с альфа-бета отсечением). Перед началом партии
|
||
можно выбрать уровень сложности — "Простой" или "Сильный" (разница
|
||
только в глубине просчёта ходов бота).
|
||
|
||
ЦЕЛЬ
|
||
Взять все шашки соперника либо оставить его без единого
|
||
возможного хода.
|
||
|
||
ХОДЫ
|
||
Простая шашка ходит по диагонали на одну клетку только вперёд.
|
||
Дамка (шашка, дошедшая до последней горизонтали) ходит по
|
||
диагонали на любое расстояние в любом из четырёх направлений.
|
||
|
||
ВЗЯТИЕ
|
||
Простая шашка бьёт через одну соседнюю клетку в ЛЮБОМ из четырёх
|
||
диагональных направлений, включая назад — не только вперёд. Дамка
|
||
бьёт "летающим" ходом: может перепрыгнуть через вражескую шашку с
|
||
любого расстояния (если путь до неё свободен) и приземлиться на
|
||
любую свободную клетку сразу за ней (тоже с выбором расстояния).
|
||
|
||
Взятие ОБЯЗАТЕЛЬНО: если у вас есть хоть одно доступное взятие
|
||
где-либо на доске, простой ход запрещён. В отличие от
|
||
международных шашек, правило "бить максимально возможное число
|
||
шашек" не действует — подходит любое доступное взятие. Если после
|
||
взятия та же шашка может продолжить бить — она обязана продолжить
|
||
(ход не переходит сопернику, пока серия взятий не закончится).
|
||
Шашка, ставшая дамкой в середине серии взятий (дойдя до последней
|
||
горизонтали при ударе), продолжает эту же серию уже как дамка.
|
||
|
||
ОКОНЧАНИЕ ПАРТИИ
|
||
Побеждает тот, у кого остались ходы, когда у соперника их не
|
||
осталось (нет шашек или все заблокированы). Если долго (60
|
||
полуходов) не происходит ни одного взятия — партия принудительно
|
||
объявляется ничьей (упрощение официальных правил ничьей).
|
||
|
||
УПРАВЛЕНИЕ
|
||
↑↓←→ / hjkl передвижение курсора по доске
|
||
enter/space выбрать шашку (или переместить выбранную в клетку
|
||
под курсором)
|
||
esc отменить текущий выбор
|
||
q выход в меню
|
||
После завершения партии:
|
||
n новая партия
|
||
q выход в меню
|
||
`
|
||
|
||
// blackjackRules — текст правил Блэкджека, используется и в
|
||
// TUI-экране "Правила", и при выводе через --help.
|
||
const blackjackRules = `БЛЭКДЖЕК — правила для 1-6 игроков
|
||
|
||
Каждый игрок играет только против дилера — не друг против друга.
|
||
Можно играть даже в одиночку: тогда за столом только вы и дилер.
|
||
|
||
ЦЕЛЬ
|
||
Набрать сумму очков ближе к 21, чем у дилера, не превысив 21.
|
||
|
||
ОЧКИ КАРТ
|
||
Туз — 11 или 1 (автоматически считается как 1, если 11 привело бы
|
||
к перебору). Картинки (валет/дама/король) — 10. Остальные — по
|
||
номиналу.
|
||
|
||
ПОДГОТОВКА И СТАВКА
|
||
В начале раунда каждый игрок делает фиксированную ставку. Игрокам
|
||
и дилеру раздаётся по 2 карты; у дилера одна карта открыта, вторая
|
||
скрыта до конца раунда. Блэкджек с раздачи — это туз и карта на 10
|
||
очков в первых двух картах (сумма 21 ровно двумя картами).
|
||
|
||
ХОД ИГРОКА
|
||
Каждый игрок по очереди решает:
|
||
- взять карту (hit) — можно повторять, пока не остановитесь или
|
||
не переберёте (сумма больше 21 — мгновенный проигрыш ставки);
|
||
- остановиться (stand) — зафиксировать текущую сумму;
|
||
- удвоить ставку (double down) — доступно только на первых двух
|
||
картах: ставка удваивается, берётся ровно одна карта, и ход
|
||
сразу заканчивается (переберёте вы или нет).
|
||
Сплиты (разделение пары карт на две руки) не поддерживаются.
|
||
|
||
ХОД ДИЛЕРА
|
||
После того как все игроки закончили ходы, дилер открывает вторую
|
||
карту и берёт карты, пока сумма меньше 17. Дилер останавливается на
|
||
любых 17 и больше, включая "мягкие" 17 с тузом — так проще и
|
||
предсказуемее для игры через терминал.
|
||
|
||
ВЫПЛАТЫ
|
||
- Блэкджек с раздачи (и у дилера его нет) — выигрыш 3:2.
|
||
- Блэкджек и у игрока, и у дилера — ничья, ставка возвращается.
|
||
- Перебор у игрока — проигрыш ставки, независимо от того, что
|
||
случится дальше у дилера.
|
||
- Дилер перебрал, а игрок нет — выигрыш 1:1.
|
||
- Сумма игрока больше суммы дилера (оба не перебрали) — выигрыш 1:1.
|
||
- Суммы равны — ничья, ставка возвращается.
|
||
- Сумма дилера больше — проигрыш ставки.
|
||
|
||
УПРАВЛЕНИЕ В ЭТОЙ ВЕРСИИ
|
||
h взять карту
|
||
s остановиться
|
||
d удвоить ставку (только на первых двух картах)
|
||
q выход в меню
|
||
После завершения раунда:
|
||
n новый раунд с тем же капиталом и ставкой
|
||
q выход в меню
|
||
`
|
||
|
||
// oneOhOneRules — текст правил игры 101, используется и в
|
||
// TUI-экране "Правила", и при выводе через --help.
|
||
const oneOhOneRules = `101 — правила для 2-6 игроков
|
||
|
||
У игры "101" существует много вариантов, расходящихся в деталях.
|
||
Реализован следующий, наиболее часто встречающийся набор правил.
|
||
|
||
ЦЕЛЬ
|
||
Как можно быстрее избавиться от всех карт на руке. Тот, кто первым
|
||
это сделал — выигрывает раунд; остальные получают штрафные очки за
|
||
карты, оставшиеся на руках. Партия идёт до тех пор, пока не
|
||
останется один игрок — набравшие 101 очко и более выбывают.
|
||
|
||
ПОДГОТОВКА
|
||
Колода 36 карт (от шестёрки до туза), как и в Дураке. Сдающий
|
||
раздаёт по 5 карт каждому игроку, кроме себя — себе оставляет 4, а
|
||
пятую (лишнюю) кладёт в центр стола лицом вверх — это стартовая
|
||
карта сброса. Первым ходит игрок слева от сдающего.
|
||
|
||
ХОД
|
||
Нужно положить карту той же масти или того же ранга, что и верхняя
|
||
карта сброса. Если подходящей карты нет — нужно брать карты из
|
||
колоды добора по одной, пока не найдётся подходящая (тогда она
|
||
сразу же играется) либо пока колода не закончится (тогда ход
|
||
просто переходит дальше).
|
||
|
||
СПЕЦИАЛЬНЫЕ КАРТЫ
|
||
Туз — пропускает ход следующего игрока.
|
||
Шестёрка — следующий игрок берёт 1 карту и пропускает ход.
|
||
Семёрка — следующий игрок берёт 2 карты и пропускает ход.
|
||
Пиковый король — следующий игрок берёт 4 карты и пропускает ход.
|
||
Остальные короли и карты — обычные, без эффекта.
|
||
|
||
ОЧКИ КАРТ (штраф за карты, оставшиеся на руках)
|
||
Туз - 11, десятка - 10, девятка - 0, восьмёрка - 8, семёрка - 7,
|
||
шестёрка - 6, король - 4, дама - 3, валет - 2.
|
||
|
||
ОКОНЧАНИЕ РАУНДА
|
||
Победитель раунда получает 0 штрафных очков — а если его последней
|
||
сыгранной картой была дама, то бонус -20 очков (-40, если дама
|
||
червовая) вместо обычных 0. Остальные складывают очковую стоимость
|
||
карт, оставшихся у них на руках, и добавляют этот раунд к своему
|
||
общему счёту.
|
||
|
||
ВЫБЫВАНИЕ И ОКОНЧАНИЕ ПАРТИИ
|
||
Набравший 101 очко и более выбывает из партии — если только это не
|
||
ровно 101, тогда счёт обнуляется (можно отыграться). Сдающим
|
||
следующего раунда становится победитель предыдущего. Партия
|
||
продолжается, пока не останется один игрок — он побеждает.
|
||
|
||
УПРАВЛЕНИЕ В ЭТОЙ ВЕРСИИ
|
||
←→ / hl выбор карты в руке
|
||
enter сыграть выбранную карту
|
||
d взять карту из колоды (доступно только если нет подходящей)
|
||
q выход в меню
|
||
После завершения раунда:
|
||
n новый раунд (если партия ещё не окончена)
|
||
q выход в меню
|
||
`
|
||
|
||
// durakRules — текст правил Дурака (классический "подкидной"
|
||
// вариант в полном виде), используется и в TUI-экране "Правила", и
|
||
// при выводе через --help.
|
||
const durakRules = `ДУРАК — правила для 2-6 игроков
|
||
|
||
Реализован классический "подкидной" Дурак в полном виде: подкидывать
|
||
дополнительные карты в раунде может любой игрок за столом, кроме
|
||
самого защищающегося — не только тот, кто открыл раунд. Отбивается
|
||
всегда только защищающийся, забрать стол может тоже только он.
|
||
|
||
ПОДГОТОВКА
|
||
Колода 36 карт (от шестёрки до туза, без карт 2-5). Каждому
|
||
раздаётся по 6 карт. При 6 игроках колода не делится ровно — кому-
|
||
то может достаться на одну карту меньше, это нормально и по
|
||
правилам. Последняя карта колоды вскрывается — это козырь; она
|
||
остаётся в самом низу колоды добора и берётся последней.
|
||
Первым ходит игрок с самым младшим козырем на руке.
|
||
|
||
ХОД
|
||
Атакующий обязательно открывает раунд, подкинув одну карту.
|
||
Защищающийся должен отбить её картой той же масти старше по рангу,
|
||
либо любым козырем (козырь бьёт некозырную карту любого ранга, но
|
||
козырь козырю нужно бить только старшим козырем).
|
||
|
||
Как только очередная карта отбита, право подкинуть ещё одну карту
|
||
(того же ранга, что уже есть среди карт на столе) по очереди
|
||
получает каждый из остальных игроков, кроме защищающегося — начиная
|
||
с атакующего и по кругу. Каждый в свою очередь либо подкидывает
|
||
подходящую карту (тогда защищающийся должен снова отбиться или
|
||
забрать стол), либо пасует. Как только все подряд отказались
|
||
подкидывать — или лимит атаки исчерпан (не больше 6 карт на столе и
|
||
не больше числа карт на руке защищающегося на начало раунда) —
|
||
объявляется "бито": все карты со стола уходят в отбой навсегда.
|
||
|
||
Если защищающийся не может (или не хочет) отбить карту — он
|
||
забирает весь стол себе в руку. Это не проигрыш, а обычный игровой
|
||
момент.
|
||
|
||
СМЕНА РОЛЕЙ
|
||
После "бито" атакующим становится следующий по кругу после
|
||
защищающегося. После взятия стола атакующим становится следующий
|
||
по кругу после того, кто как раз забрал карты (он на этот раз
|
||
пропускает роль атакующего).
|
||
|
||
ДОБОР КАРТ
|
||
После каждого раунда игроки добирают карты из колоды до 6 (если в
|
||
колоде столько есть), начиная с атакующего того раунда и по кругу,
|
||
защищающийся добирает последним. Если стол забрали — забравший
|
||
вообще не добирает в этот раз (у него и так теперь много карт).
|
||
|
||
ОКОНЧАНИЕ ПАРТИИ
|
||
Как только у игрока не осталось карт на руке и в колоде добора
|
||
тоже пусто — он выходит из игры "в безопасности". Игра продолжается
|
||
для остальных. Последний, у кого остались карты на руках, когда все
|
||
остальные уже вышли — "дурак", он проигрывает. Если сразу несколько
|
||
игроков одновременно избавляются от последних карт — считается
|
||
ничья, дурака нет.
|
||
|
||
УПРАВЛЕНИЕ В ЭТОЙ ВЕРСИИ
|
||
Когда вы открываете раунд (обязательный первый ход):
|
||
←→ / hl выбор карты в руке
|
||
enter подкинуть выбранную карту
|
||
Когда вы защищающийся:
|
||
←→ / hl выбор карты в руке
|
||
enter отбить выбранной картой последнюю неотбитую карту
|
||
t забрать весь стол себе в руку
|
||
Когда очередь подкидывать дошла до вас (стол уже отбит):
|
||
←→ / hl выбор карты в руке
|
||
enter подкинуть ещё одну карту
|
||
p пасовать (отказаться подкидывать)
|
||
В любой момент:
|
||
q выход в меню
|
||
После завершения партии:
|
||
n новая партия с тем же числом игроков
|
||
q выход в меню
|
||
`
|
||
|
||
// вариант), используется и в TUI-экране "Правила", и при выводе
|
||
// через --help.
|
||
const tonkRules = `ТОНК (TONK) — правила для 3-4 игроков
|
||
|
||
ПОДГОТОВКА
|
||
Колода 52 карты без джокеров. Каждому раздаётся по 5 карт.
|
||
Оставшиеся карты — колода добора. Верхняя карта сразу вскрывается
|
||
рубашкой вниз рядом — так начинается стопка сброса.
|
||
|
||
ХОД ИГРОКА
|
||
1. Взять карту — либо верхнюю из колоды добора, либо верхнюю
|
||
из стопки сброса.
|
||
2. Можно выложить на стол готовые комбинации:
|
||
- сет: 3+ карты одного ранга, разных мастей
|
||
- сиквенс: 3+ карты одной масти подряд по рангу
|
||
Туз может быть как младшей картой (A-2-3), так и старшей
|
||
(Q-K-A), но не одновременно ("закольцевать" через край нельзя).
|
||
3. Можно подкладывать карты к уже выложенным комбинациям —
|
||
своим или чужим.
|
||
4. В конце хода нужно сбросить одну карту (кроме случая, когда
|
||
последняя карта руки ушла в комбинацию — тогда раунд
|
||
заканчивается победой без отдельного сброса).
|
||
|
||
ОЧКИ КАРТ
|
||
Туз = 1, валет/дама/король = 10, остальные — по номиналу.
|
||
|
||
ОБЪЯВЛЕНИЕ "ТОНК"
|
||
В любой момент сразу после взятия карты (до выкладывания
|
||
комбинаций) игрок может объявить Тонк, если сумма очков карт на
|
||
руке не превышает порог (по умолчанию 5). Раунд немедленно
|
||
заканчивается победой объявившего — денежные детали см. в разделе
|
||
"ДЕНЬГИ" ниже.
|
||
|
||
ЗАВЕРШЕНИЕ РАУНДА
|
||
- Игрок избавился от всех карт -> он забирает банк раунда целиком.
|
||
- Объявлен Тонк -> объявивший забирает банк, умноженный на
|
||
множитель Тонка (см. ниже); недостающую разницу сверх банка
|
||
поровну доплачивают остальные игроки.
|
||
- Колода добора и стопка сброса исчерпаны, и никто не может ни
|
||
выиграть, ни объявить Тонк -> раунд "мёртвый", банк возвращается
|
||
игрокам поровну (каждому — его ставка назад).
|
||
|
||
ДЕНЬГИ: СТАВКА И БАНК
|
||
В начале каждого раунда каждый игрок вносит фиксированную ставку
|
||
(анте) в общий банк. Обычная победа (опустошением руки) забирает
|
||
банк как есть. Победа через объявление Тонка забирает банк,
|
||
умноженный на 2: недостающую сумму сверх банка поровну доплачивают
|
||
остальные игроки — то есть Тонк выгоднее для победителя, но дороже
|
||
обходится проигравшим, чем обычное поражение. При "мёртвом" раунде
|
||
деньги никто не выигрывает и не теряет — ставки просто возвращаются.
|
||
Капитал каждого игрока переносится из раунда в раунд, пока идёт
|
||
партия; в этой версии капитал может уйти в минус, если ставки
|
||
превышают остаток средств — отдельного правила банкротства пока нет.
|
||
|
||
|
||
УПРАВЛЕНИЕ В ЭТОЙ ВЕРСИИ
|
||
Фаза взятия карты:
|
||
d взять из колоды добора
|
||
p взять из сброса
|
||
Фаза действия (после взятия карты):
|
||
←→ / hl выбор карты в руке
|
||
space отметить/снять отметку карты для новой комбинации
|
||
m выложить отмеченные карты как комбинацию (сет/сиквенс)
|
||
1-9 подложить выбранную карту к комбинации №N на столе
|
||
t объявить Тонк (доступно, если вес руки не выше порога)
|
||
enter сбросить выбранную карту и завершить ход
|
||
В любой момент:
|
||
q выход
|
||
После завершения раунда:
|
||
n новый раунд (счёт сохраняется)
|
||
q выход
|
||
`
|