MahjongRepository / tenhou-python-bot

Bot for tenhou.net riichi mahjong server written in Python
MIT License
201 stars 52 forks source link

Improve open hand rules for tanyao #74

Open Nihisil opened 6 years ago

Nihisil commented 6 years ago
  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 будет посчитана, как ишантен на таняо, а не как темпай и не как агари.

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

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