Skip to main content

Mahjong hands calculation

Project description

https://github.com/MahjongRepository/mahjong/workflows/Mahjong%20lib/badge.svg

Python 2.7 and 3.5+ are supported.

We support the Japanese version of mahjong only (riichi mahjong).

Riichi mahjong hands calculation

This library can calculate hand cost (han, fu with details, yaku, and scores) for riichi mahjong (Japanese version).

It supports optional features like:

Feature

Keyword parameter

Default value

Disable or enable open tanyao yaku

has_open_tanyao

False

Disable or enable aka dora in the hand

has_aka_dora

False

Disable or enable double yakuman (like suuanko tanki)

has_double_yakuman

True

Settings for different kazoe yakuman calculation (it сan be an yakuman or a sanbaiman)

kazoe_limit

HandConstants.KAZOE_LIMITED

Support kiriage mangan

kiriage

False

Allow to disable additional +2 fu in open hand (you can make 1-20 hand with that setting)

fu_for_open_pinfu

True

Disable or enable pinfu tsumo

fu_for_pinfu_tsumo

False

Counting renhou as 5 han or yakuman

renhou_as_yakuman

False

Disable or enable Daisharin yakuman

has_daisharin

False

Disable or enable Daisharin in other suits (Daisuurin, Daichikurin)

has_daisharin_other_suits

False

The code was validated on tenhou.net phoenix replays in total on 11,120,125 hands.

So, we can say that our hand calculator works the same way that tenhou.net hand calculation.

Project repository: https://github.com/MahjongRepository/mahjong

How to install

pip install mahjong

How to use

You can find more examples here: https://github.com/MahjongRepository/mahjong/blob/master/doc/examples.py

Let’s calculate how much will cost this hand:

https://user-images.githubusercontent.com/475367/30796350-3d30431a-a204-11e7-99e5-aab144c82f97.png

Tanyao hand by ron

from mahjong.hand_calculating.hand import HandCalculator
from mahjong.tile import TilesConverter
from mahjong.hand_calculating.hand_config import HandConfig
from mahjong.meld import Meld

calculator = HandCalculator()

# we had to use all 14 tiles in that array
tiles = TilesConverter.string_to_136_array(man='22444', pin='333567', sou='444')
win_tile = TilesConverter.string_to_136_array(sou='4')[0]

result = calculator.estimate_hand_value(tiles, win_tile)

print(result.han, result.fu)
print(result.cost['main'])
print(result.yaku)
for fu_item in result.fu_details:
    print(fu_item)

Output:

1 40
1300
[Tanyao]
{'fu': 30, 'reason': 'base'}
{'fu': 4, 'reason': 'closed_pon'}
{'fu': 4, 'reason': 'closed_pon'}
{'fu': 2, 'reason': 'open_pon'}

How about tsumo?

result = calculator.estimate_hand_value(tiles, win_tile, config=HandConfig(is_tsumo=True))

print(result.han, result.fu)
print(result.cost['main'], result.cost['additional'])
print(result.yaku)
for fu_item in result.fu_details:
    print(fu_item)

Output:

4 40
4000 2000
[Menzen Tsumo, Tanyao, San Ankou]
{'fu': 20, 'reason': 'base'}
{'fu': 4, 'reason': 'closed_pon'}
{'fu': 4, 'reason': 'closed_pon'}
{'fu': 4, 'reason': 'closed_pon'}
{'fu': 2, 'reason': 'tsumo'}

What if we add open set?

melds = [Meld(meld_type=Meld.PON, tiles=TilesConverter.string_to_136_array(man='444'))]

result = calculator.estimate_hand_value(tiles, win_tile, melds=melds, config=HandConfig(options=OptionalRules(has_open_tanyao=True)))

print(result.han, result.fu)
print(result.cost['main'])
print(result.yaku)
for fu_item in result.fu_details:
    print(fu_item)

Output:

1 30
1000
[Tanyao]
{'fu': 20, 'reason': 'base'}
{'fu': 4, 'reason': 'closed_pon'}
{'fu': 2, 'reason': 'open_pon'}
{'fu': 2, 'reason': 'open_pon'}

Shanten calculation

from mahjong.shanten import Shanten

shanten = Shanten()
tiles = TilesConverter.string_to_34_array(man='13569', pin='123459', sou='443')
result = shanten.calculate_shanten(tiles)

print(result)

Releases History

1.1.10 (2020-05-11)

  • Add japanese yaku names

  • Fix an issue with not correct ryuuiisou detection

  • Allow to print aka dora in TilesConverter.to_one_line_string() method (“0” symbol)

  • Add support for Python 3.8

1.1.9 (2019-07-29)

  • Add TilesConverter.one_line_string_to_136_array() and TilesConverter.one_line_string_to_34_array() methods

1.1.8 (2019-07-25)

  • Fix an issue with incorrect daburu chuuren poutou calculations

  • Allow passing ‘0’ as a red five to tiles converter

1.1.7 (2019-04-09)

  • Introduce OptionalRules hand configuration

1.1.6 (2019-02-10)

  • Fix a bug when hatsu yaku was added to the hand instead of chun

  • Fix a bug where kokushi wasn’t combined with tenhou/renhou/chihou

  • Add English names to all yaku

  • Add support of python 2.7

  • Add a way to pass aka dora to tile converter

1.1.5 (2018-09-04)

  • Allow to disable chiitoitsu or kokushi in shanten calculator

1.1.4 (2018-08-31)

  • Add is_terminal() and is_dora_indicator_for_terminal() functions to the utils.py

1.1.3 (2018-08-22)

  • Add is_tile_strictly_isolated() function to the utils.py

1.1.2 (2017-10-14)

  • Add settings for different kazoe yakuman calculation (it kan be an yakuman or a sanbaiman)

  • Support up to sextuple yakuman scores

  • Support kiriage mangan

  • Allow to disable +2 fu in open hand

  • Allow to disable tsumo pinfu (add 2 additional fu for hand like that)

1.1.1 (2017-10-07)

  • Fix a bug with not correct agari state determination and closed kan in the hand

1.1.0 (2017-10-07)

Breaking changes:

  • Interface of hand calculator was changed. New interface will allow to easy support different game rules

Additional fixes:

  • Refactor hand divider. Allow to pass melds objects instead of arrays

  • Add file with usage examples

  • Minor project refactoring

1.0.5 (2017-09-25)

  • Improve installation script

1.0.4 (2017-09-25)

Bug fixes:

  • Fix refactoring regressions with kan sets and dora calculations

  • Fix regression with sankantsusuukantsu and called chankan

  • Closed kan can’t be used in chuuren poutou

  • Fix yaku ids (some of them had incorrect numbers)

Features:

  • Allow to disable double yakuman (like suuanko tanki)

  • Remove float calculations from scores and fu

  • Add travis build status

  • Add usage examples to the readme

1.0.3 (2017-09-23)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mahjong-1.1.10.tar.gz (32.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mahjong-1.1.10-py3-none-any.whl (64.1 kB view details)

Uploaded Python 3

File details

Details for the file mahjong-1.1.10.tar.gz.

File metadata

  • Download URL: mahjong-1.1.10.tar.gz
  • Upload date:
  • Size: 32.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.19.1 setuptools/41.4.0 requests-toolbelt/0.8.0 tqdm/4.25.0 CPython/2.7.17

File hashes

Hashes for mahjong-1.1.10.tar.gz
Algorithm Hash digest
SHA256 e64d67f7b3101e05532682e1cd1f5ccc868e94e804bcbebc32c1a5da19ccfd74
MD5 3091207a5afd530146aa949f9d2ed691
BLAKE2b-256 60d012aaf5dc580b74069cb71ae83be1aa3dae250b8684434eeec75ff61d3927

See more details on using hashes here.

File details

Details for the file mahjong-1.1.10-py3-none-any.whl.

File metadata

  • Download URL: mahjong-1.1.10-py3-none-any.whl
  • Upload date:
  • Size: 64.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.19.1 setuptools/41.4.0 requests-toolbelt/0.8.0 tqdm/4.25.0 CPython/2.7.17

File hashes

Hashes for mahjong-1.1.10-py3-none-any.whl
Algorithm Hash digest
SHA256 e5fe906dab586efb14afdf5845cdc74895e609d1a9cf86bcd6376dd96bf2ff24
MD5 ef4854da764637b5e75783144893e090
BLAKE2b-256 301e0ad54087039c88d885cb2418cfa642659b46aafe0967f3420125887c685f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page