Skip to content
This repository was archived by the owner on Jul 8, 2023. It is now read-only.
This repository was archived by the owner on Jul 8, 2023. It is now read-only.

Improve open hand rules for tanyao #74

@Nihisil

Description

@Nihisil
  1. “Число шантен” во всех условиях равно числу шатен на таняо.
  2. Если число шантен после открытия увеличивается на 1 пункт или больше, то не открываемся.
  3. Если число шантен остается таким же, и в руке меньше 2 центральных дор, то не открываемся.
  4. Если есть 2 или больше центральные доры, то открываемся только в том случае, если укеире на таняо после открытия будет больше, чем укеире на таняо до открытия.
  5. Если число шантен уменьшается на 1, в руке 1 дора и у нас ряншантен или больше, то открываемся после 8 хода.
  6. Если число шантен уменьшается на 1, в руке нет дор и у нас саншантен или больше, то открываемся после 8 хода.
  7. Если число шантен уменьшается на 1, в руке нет дор и у нас ряншантен или ишантен, открываемся после 11 хода.

Идея для реализации:

В метод calculate_outs добавить параметр restriction, который может обозначать отсутствие ограничений, либо же ограничения типа "только таняо", "только хоницу в масти X", "только чанта" и т.п.

Для таняо это будет работать так:

  1. Проверяем, что в руке не более 7 нецентральных тайлов. Если их больше, алгоритм не будет работать правильно. Мы не должны вызывать метод с таким ограничением для руки, в который больше 7 нецентральных тайлов - так что надо продумать, как правильно обрабатывать такую ошибку, мб просто крашиться.
  2. В самом начале алгоритма раскидываем все "нецентральные" тайлы по одиночным ветрам и драконам. Таким образом одиночная 9 не сможет образовать форму 98 при заходе 8, так что дополнительного укеире при заходе центрального тайла она нам не даст.
  3. Во внутреннем цикле алгоритма мы будем пропускать тайлы, которые удовлетворяют ограничению. Здесь же мы сохраним лучшее значение числа шантен, которое мы смогли получить.
  4. Вместо подсчета числа шантен заново в конце алгоритма мы возьмем лучшее из значений, которое получили в цикле в пункте 3. Таким образом рука 234567m234567p99s будет посчитана, как ишантен на таняо, а не как темпай и не как агари.

Все это надо будет плотно обложить это тестами, например, проверить, что:

  • 234567m234567p99s - ишантен на таняо
  • 23m234567p45677s - темпай на таняо, но укеире == 4, а не 8
  • 12m234567p45677s - ишантен на таняо
  • 123m234567p4567s - ишантен на таняо
  • 123m234567p4569s - ряншантен на таняо
  • 234m567p678s12345z - саншантен на таняо

Алгоритм не универсальный, для чанты или хоницу вероятно придется придумывать что-то еще.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions