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

Improve open hand rules for tanyao #74

Open
Nihisil opened this issue Aug 31, 2018 · 0 comments
Open

Improve open hand rules for tanyao #74

Nihisil opened this issue Aug 31, 2018 · 0 comments

Comments

@Nihisil
Copy link
Contributor

Nihisil commented Aug 31, 2018

  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 - саншантен на таняо

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

@Nihisil Nihisil added this to the v0.4 milestone Aug 31, 2018
@Nihisil Nihisil removed this from the v0.4 milestone Sep 17, 2020
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

1 participant