-
Notifications
You must be signed in to change notification settings - Fork 51
Chinese (简体中文)
github-actions[bot] edited this page Feb 20, 2026
·
6 revisions
Important
这是已弃用的 v1 文档。新的 v2 文档请参阅此处。
本软件包支持Python 3.9及以上版本
若您需要与Python 2兼容,请使用本软件包v1.1.11版本。
本软件包包含日本麻雀(立直麻雀)各种相关计算工具(向听数计算、和牌判定、得点计算等)。
本软件包可用于计算立直麻雀手牌详情(番数、符数、役种及得点)。
包含以下可选功能:
| 功能 关键 | 字参数 | 默认值 |
|---|---|---|
| 有无食断(非门前清断幺九是否成立) | has_open_tanyao | False |
| 有无红宝牌 | has_aka_dora | False |
| 有无双倍役满役种(如四暗刻单骑) | has_double_yakuman | True |
| 非役满役种累计番数上限设置(累计役满//累计三倍满) | kazoe_limit | HandConstants.KAZOE_LIMITED |
| 有无切上满贯 | kiriage | False |
| 非门清平和型食和是否+2符(总计30符) | fu_for_open_pinfu | True |
| 平和自摸是否仍然+2符(总计30符) | fu_for_pinfu_tsumo | False |
| 人和是否视为役满(还是只有5番) | renhou_as_yakuman | False |
| 是否有大车轮役种(门前清22334455667788饼) | has_daisharin | False |
| 是否有其他花色的大车轮役种(索:大竹林,万:大数邻) | has_daisharin_other_suits | False |
| 放铳开立直是否算役满 | has_sashikomi_yakuman | False |
| 多倍役满是否上限为6倍 (最高得点192000) | limit_to_sextuple_yakuman | True |
| 是否有大七星役满役种(字牌七对子) | has_daichisei | False |
| 八连庄是否需要有役才能成立 | paarenchan_needs_yaku | True |
本软件包经过tenhou.net(天凤)*11,120,125 局*凤凰对局测试验证
因此,我们可以确定所提供的算法与天凤算法一致。
项目地址: https://github.com/MahjongRepository/mahjong
更多示例请参阅: https://github.com/MahjongRepository/mahjong/blob/v1.4.0/doc/examples.py
我们来计算一下下面这手牌的得点:

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)输出:
1 40
1300
[Tanyao]
{'fu': 30, 'reason': 'base'}
{'fu': 4, 'reason': 'closed_pon'}
{'fu': 4, 'reason': 'closed_pon'}
{'fu': 2, 'reason': 'open_pon'}
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)输出:
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'}
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)输出:
1 30
1000
[Tanyao]
{'fu': 20, 'reason': 'base'}
{'fu': 4, 'reason': 'closed_pon'}
{'fu': 2, 'reason': 'open_pon'}
{'fu': 2, 'reason': 'open_pon'}
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)tiles = TilesConverter.string_to_136_array(honors='111133555566667777')
win_tile = TilesConverter.string_to_136_array(honors='3')[0]
melds = [
Meld(meld_type=Meld.KAN, tiles=TilesConverter.string_to_136_array(honors='1111'), opened=False),
Meld(meld_type=Meld.KAN, tiles=TilesConverter.string_to_136_array(honors='5555'), opened=False),
Meld(meld_type=Meld.KAN, tiles=TilesConverter.string_to_136_array(honors='6666'), opened=False),
Meld(meld_type=Meld.KAN, tiles=TilesConverter.string_to_136_array(honors='7777'), opened=False),
]
result = calculator.estimate_hand_value(tiles, win_tile, melds=melds, dora_indicators=TilesConverter.string_to_136_array(honors='44447777'),
scores_calculator_factory=Aotenjou, config=HandConfig(is_riichi=True, is_tsumo=True, is_ippatsu=True, is_haitei=True, player_wind=EAST, round_wind=EAST))
print(result.han, result.fu)
print(result.cost['main'])
print(result.yaku)
for fu_item in result.fu_details:
print(fu_item)输出:
103 160
12980742146337069071326240823050300
[Menzen Tsumo, Riichi, Ippatsu, Haitei Raoyue, Yakuhai (wind of place), Yakuhai (wind of round), Daisangen, Suu Kantsu, Tsuu Iisou, Suu Ankou Tanki, Dora 32]
{'fu': 32, 'reason': 'closed_terminal_kan'}
{'fu': 32, 'reason': 'closed_terminal_kan'}
{'fu': 32, 'reason': 'closed_terminal_kan'}
{'fu': 32, 'reason': 'closed_terminal_kan'}
{'fu': 20, 'reason': 'base'}
{'fu': 2, 'reason': 'pair_wait'}
{'fu': 2, 'reason': 'tsumo'}