This repository was archived by the owner on Jul 8, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 53
This repository was archived by the owner on Jul 8, 2023. It is now read-only.
Improve open hand rules for tanyao #74
Copy link
Copy link
Open
Description
- “Число шантен” во всех условиях равно числу шатен на таняо.
- Если число шантен после открытия увеличивается на 1 пункт или больше, то не открываемся.
- Если число шантен остается таким же, и в руке меньше 2 центральных дор, то не открываемся.
- Если есть 2 или больше центральные доры, то открываемся только в том случае, если укеире на таняо после открытия будет больше, чем укеире на таняо до открытия.
- Если число шантен уменьшается на 1, в руке 1 дора и у нас ряншантен или больше, то открываемся после 8 хода.
- Если число шантен уменьшается на 1, в руке нет дор и у нас саншантен или больше, то открываемся после 8 хода.
- Если число шантен уменьшается на 1, в руке нет дор и у нас ряншантен или ишантен, открываемся после 11 хода.
Идея для реализации:
В метод calculate_outs добавить параметр restriction, который может обозначать отсутствие ограничений, либо же ограничения типа "только таняо", "только хоницу в масти X", "только чанта" и т.п.
Для таняо это будет работать так:
- Проверяем, что в руке не более 7 нецентральных тайлов. Если их больше, алгоритм не будет работать правильно. Мы не должны вызывать метод с таким ограничением для руки, в который больше 7 нецентральных тайлов - так что надо продумать, как правильно обрабатывать такую ошибку, мб просто крашиться.
- В самом начале алгоритма раскидываем все "нецентральные" тайлы по одиночным ветрам и драконам. Таким образом одиночная 9 не сможет образовать форму 98 при заходе 8, так что дополнительного укеире при заходе центрального тайла она нам не даст.
- Во внутреннем цикле алгоритма мы будем пропускать тайлы, которые удовлетворяют ограничению. Здесь же мы сохраним лучшее значение числа шантен, которое мы смогли получить.
- Вместо подсчета числа шантен заново в конце алгоритма мы возьмем лучшее из значений, которое получили в цикле в пункте 3. Таким образом рука
234567m234567p99sбудет посчитана, как ишантен на таняо, а не как темпай и не как агари.
Все это надо будет плотно обложить это тестами, например, проверить, что:
234567m234567p99s- ишантен на таняо23m234567p45677s- темпай на таняо, но укеире == 4, а не 812m234567p45677s- ишантен на таняо123m234567p4567s- ишантен на таняо123m234567p4569s- ряншантен на таняо234m567p678s12345z- саншантен на таняо
Алгоритм не универсальный, для чанты или хоницу вероятно придется придумывать что-то еще.