Хотел написать что-то полезное про алгоритмику карточных игр - а получилась какая-то буффонада о project management :|
Все совпадения с практиками моих прежних работодателей случайны: эта зараза пожирает всю индустрию оптом и вы не особенные в этом плане.

-------------------------------------------

Представим такую гипотетическую ситуацию: нам нужно замутить какое-то подобие карточной игры в какой-то видеоигре.

Решением №1 в такой ситуации обычно является какая-нибудь типовая чебурда на основе Фишера — Йетса, в основе которой лежит заблуждение, будто переносить в видеоигру процесс перетасовки и раздачи карт нужно полностью.

Отдельно делается полный список всех доступных карт. Лучше два (один на масти, один на номиналы). А если Вы Избранный - то ещё и куда-нибудь в константы пишется суммарное количество карт.
Отдельно делается список наличных карт в колоде.
Отдельно делается список карт в руке для каждой конкретной руки.
Отдельно делается список карт в сбросе.
А на столе... на столе обычно делается бардак, поскольку на стол возлагаются обязанности крупье и ментора по вопросам игровых правил (и компьютерного противника), образно говоря.

Эффективно. Быстро.
Не поддерживаемо и не расширяемо.

Проиллюстрирую примером.

-------------------------------------------

Вводная: насмотревшись "Ведьмака", отечественный производитель решил-таки разродиться полноценной РПГ про Волкодава.
Своей, родной РПГ, с клюквой исключительно в виде мелких кустиков и геймплейно обоснованным целибатом.
А где калька с "Ведьмака", там и калька с Гвента.
Но поскольку Гвент - это языческое сракобесие...

-------------------------------------------

Пришло техническое задание: кодим самую обычную игру "в дурака" против компьютера.
36 карт. 4 масти по 9 номиналов с жёстким порядком старшинства в каждом. Две руки.
Реализация - геймдизайнеру было влом заморачиваться алгоритмикой, поэтому всё на усмотрение программистов.
Потому, что ну камон, это чёртова карточная игра "в дурака", что сложного-то?

Реализуем вышеописанную типовую чебурду Фишера — Йетса для колоды и раздачи карт в руки.
Обучаем стол понятиям "карта может быть сыграна" и собственно сыгрыванию, переносу карт в отбой и условиям перемещения карт со стола в руку продувшего текущий раунд игрока.
Приписываем одну из двух рук компьютерному противнику. Вторую живому игроку - и даём возможность её смотреть в любой момент.
Минимально учим стол, в каком порядке должен играть карты компьютерный противник.
Про условия победы не забываем.

Под конец кодинга вспоминаем про козыри.
Быстренько костылим показ козыря, обязательное положение козыря последним в колоде, рихтуем условия "карта может быть сыграна" с учётом текущего козыря.

Готово, "фича запилена".
Тестеры озабочены тем, что козырная дама не бьёт некозырную семёрку.
Но часики затреканы, сторипойнты оприходованы, KPI растёт.

-------------------------------------------

Через месяцок-другой приписанному к проекту геймдизайнеру приходит в голову охренительная идея: "дурак" должен быть обязательно "подкидным". А то не интересно.
За оральную взятку техническое задание "подкидной дурак" попадает в спринт, со всеми приближающими кранч сопутствующими.

Логику сыгрывания карт, заточенную под "по одной карте за раз", приходится сильно переписывать.
Логику попадания карт со стола в руку вместо отбоя - тоже.
Но с помощью кофе, гугла и такой-то матери всё это заборото в минимальнейшие сроки.

Готово, "фича запилена".
Тестеры вяло бухтят на edge case с подкидыванием козыря как последней картой с руки, ломающим условия победы.
Но часики затреканы, сторипойнты оприходованы, KPI растёт.

-------------------------------------------

Релиз.
Игроки довольны всем.
Только вот за подкидного дурака 36 картами ругаются. Хотят полную колоду с двойками-пятёрками.
По поводу чего Коммюнити Менеджер имеет мозговое соитие с геймдизайнером.
В результате задачу "сделать полную колоду" протаскивают в очередной спринт вместо исправлений козырной дамы и подкидывания козырей, ломающего условия победы.

На бумаге всё просто.
В каждой масти было 9 номиналов, стало 13.
Только вот чтобы "всё просто" реализовать, надо посмотреть Фишеру на Йетсы и поправить весь-весь-весь хардкод в них.
Количества карт в колоде, старшинства номиналов, обработки козырных карт, да мало ли куда ещё.
Поскольку ни один из участвующих в этом парад-алле сотрудников не играл во что-то сложнее "очка", очевиднейшей проблемы с такой постановкой ТЗ (о которой в следующем блоке) пока никто не замечает.

Готово, "фича запилена".
Тестеры собачатся с геймдизайнером на тему "бьёт ли двойка туза".
Но часики затреканы, сторипойнты оприходованы, KPI растёт.

-------------------------------------------

У геймдизайнера пожар в штанах: популярный стример разродился видео на тему "В %ИГРА_NAME% в полной колоде карт нет джокеров".
Игроки по такому случаю устраивают силосный обстрел на форуме.
Надо запиливать джокеров. Пока КМ не пришёл с банкой бизнес-геля (опять).

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

К Йетсам Фишера приматываются костыли для работы с мастью null.
В т. ч. игнорирование всех номиналов, кроме джокеров, для масти null и игнорирование джокеров для не-null мастей при компоновке рук и работе с картами на столе. Отчего у стола начинают подкашиваться ножки.
Из условий сыгрывания карты наконец-то выносятся в отдельную логику проверки на козыри и вводится понятие убер-козыря.
Техлид проекта видит этот ворох костылей, но ничего, кроме ухода в скорбный запой, поделать не может: нужен рефакторинг, на который никто добро не даст.

Готово, "фича запилена".
Тестеры с бодрым матерком перетестируют все баги из бэклога (авось интенсивный костылинг хоть что-то подпёр), ничего не изменилось в плане багов.
Но часики затреканы, сторипойнты оприходованы, KPI растёт.

-------------------------------------------

Игра "продалась", надо делать DLC, чтобы "продаться" ещё раз.
Вполне логично для каких-то игровых механик сделать DLCшные надстройки.
И тут геймдизайнер вспоминает: у нас же есть "подкидной дурак"!
Т. е. весь механ для карточных игр у нас уже в принципе есть!
А давайте замутим в DLC игру в покер! Покер сейчас популярно!

ТЗ "на основе кода подкидного дурака сделать покер для DLC" попадает в спринт.
Техлид попадает таки в долгожданный запой.

Потому, что непонятно, какой покер, - старый добрый холдэм (и какой, чёрт побери, именно), или ещё какой?
Потому, что заточеный под "дурака" стол под "покер" надо переписывать полностью. Причём в зависимости от нужной разновидности покера переделки могут быть ну очень разными.
Потому, что логику сыгрывания карт нужно выкидывать на помойку, а вместо неё прикручивать механику ставок, триумвират "check-raise-fold", (возможно) механику "общих" карт (флоп).
Потому, что условия победы в покере - это не "0 карт в колоде, 0 карт в одной из рук", тут хитрая комбинаторика.
И что на этот раз делать с джокерами?!

И на следующем же дейли начинается форменный DBD: геймдизайнер против премейда программистов, не на жизнь, а на смерть... Разработка то уже попланирована как если бы это было пару констант поправить. А тут рефакторить надо.
А ещё лучше НАКОНЕЦ-ТО выкинуть весь этот мусор и сделать нормально, с адаптирующейся под правила игры алгоритмикой.

(и научить наконец геймдизайнера проектировать как надо, а не бросаться тасками с формулировкой "ну решите там сами, как это сделать")