「mahjong」 Wussten Sie, dass Python eine Bibliothek namens "** mahjong **" hat?
↓ Python-Bibliothek "** mahjong **" https://pypi.org/project/mahjong/
Wie der Name schon sagt, ist diese Bibliothek eine ** Mahjong ** Bibliothek! (Englische Übersetzung von Mahjong ist "Mahjong")
Dieses Mal habe ich den Inhalt der obigen URL zusammengefasst und tatsächlich verwendet!
Mit einem Wort, was Mahjong kann
「Mahjong hands calculation」 Mit anderen Worten, Sie können Mahjong manuell berechnen.
Lesen wir den Teil Projektbeschreibung im URL-Artikel!
Python2.7 and 3.5+ are supported. We support the Japanese version of mahjong only (riichi mahjong).
Wenn Sie die neueste Version von Python verwenden, sollte dies kein Problem darstellen. Und es steht geschrieben, dass nur japanische Reichweite Mahjong unterstützt wird.
Chinesischer Mahjong hat mehr Rollen als Japaner Mahjong erreichen, Es ist kompliziert, weil Friten in Ordnung ist ...
Riichi mahjong hands calculation
This library can calculate hand cost (han, fu with details, yaku, and scores) for riichi mahjong(Japanese version).
In dieser Bibliothek können Sie "** Übersetzung ", " Markierungsnummer (einschließlich Details) ", " Rolle " und " Punktzahl **" der Reichweite Mahjong berechnen. Korrekt!
Großartig ... es sieht schrecklich schwer aus, normal zu implementieren ...
Darüber hinaus scheint es, dass es die folgenden Regeländerungen als Option unterstützt. (Vereinfacht den Inhalt der aufgeführten Tabelle.)
Ich bin überrascht, dass es einige Optionen unterstützt.
Yakuman und Pinfu zu zählen sind verwirrend, Wenn Sie es nicht berühren, können Sie die Grundregeln befolgen.
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.
Und diese Bibliothek enthält ** 11.120.125 ** Agari-Hände aus dem berühmten Mahjong-Spiel "** Tenho **". Es scheint, dass Sie es bestätigen können!
Sie können eine Bibliothek verwenden, die dieselbe Berechnung wie Tenho kostenlos durchführen kann ... Gott
Probieren wir verschiedene Dinge aus!
Mach dich zuerst fertig! Wenn Python das neueste ist, gibt es kein Problem! Wie jede andere Bibliothek
pip install mahjong
Und du bist bereit zu gehen!
Mal sehen, ob wir es sofort berechnen können!
#Berechnung
from mahjong.hand_calculating.hand import HandCalculator
#Mahjong
from mahjong.tile import TilesConverter
#Rolle,Optionale Regeln
from mahjong.hand_calculating.hand_config import HandConfig, OptionalRules
#Quietschen
from mahjong.meld import Meld
#Wind(Platz&Selbst)
from mahjong.constants import EAST, SOUTH, WEST, NORTH
#HandCalculator(Berechnungsklasse)Erstellen Sie eine Instanz von
calculator = HandCalculator()
#Für die Ergebnisausgabe
def print_hand_result(hand_result):
#Transliteration,Anzahl der Markierungen
print(hand_result.han, hand_result.fu)
#Ergebnis(Im Fall von Tsumoagari[Links: Elterliches Ziel,richtig:Kinderziel],Im Fall von Ron Agari[links:Schütze kassierte,richtig:0])
print(hand_result.cost['main'], result.cost['additional'])
#Rolle
print(hand_result.yaku)
#Angaben zur Anzahl der Markierungen
for fu_item in hand_result.fu_details:
print(fu_item)
print('')
Danach bilden sich Informationen wie Agari
caluculator.estimate_hand_value()
Sie können es berechnen, indem Sie es als Argument angeben!
Das Argument von caluculator.estimate_hand_value ()
ist
・ Fliesen (** Majaku 牌 Agari Form )
・ Win_tile ( Agari-Kachel )
・ Meldungen ( Quietschen )
・ Dora_indicators ( Dora )
-Es gibt eine Konfiguration ( Option **).
https://github.com/MahjongRepository/mahjong/blob/master/mahjong/hand_calculating/hand.py
** Wenn du mit Ron angreifst ** Spieler: Kind 3 Transliteration 40 Punkte Schütze: 5200 Punkte Rolle: Tan Yao, Sanshoku Dokou
example01_ron.py
#Agari Form(man=Mans, pin=Stifte, sou=Schwerter, honors=Charakter)
tiles = TilesConverter.string_to_136_array(man='234555', pin='555', sou='22555')
#Agari(Schwerter 5)
win_tile = TilesConverter.string_to_136_array(sou='5')[0]
#Quietschen(Keiner)
melds = None
#Dora(Keiner)
dora_indicators = None
#Möglichkeit(Keiner)
config = None
#Berechnung
result = calculator.estimate_hand_value(tiles, win_tile, melds, dora_indicators, config)
print_hand_result(result)
Ergebnisausgabe
>3 40
5200 0
[Tanyao, Sanshoku Doukou]
{'fu': 30, 'reason': 'base'} #Menzenron
{'fu': 4, 'reason': 'closed_pon'} #Impressum
{'fu': 4, 'reason': 'closed_pon'} #Impressum
{'fu': 2, 'reason': 'open_pon'} #Morgen
** Wenn Sie mit Tsumo aggressiv sind ** Spieler: Kind 6 Übersetzungen 40 Notizen Eltern: 6000 Punkte, Kind 3000 Punkte Rollen: Menzentsumo, Tanyao, Sanankou, Sanshokudoukou
example01_tsumo.py
#Agari Form(Das gleiche wie oben)
tiles = TilesConverter.string_to_136_array(man='234555', pin='555', sou='22555')
#Agari(Das gleiche wie oben)
win_tile = TilesConverter.string_to_136_array(sou='5')[0]
#Quietschen(Keiner)
melds = None
#Dora(Keiner)
dora_indicators = None
#Möglichkeit(Fügen Sie Tsumo hinzu,Wenn falsch, Ron)
config = HandConfig(is_tsumo=True)
#Berechnung
result = calculator.estimate_hand_value(tiles, win_tile, melds, dora_indicators, config)
print_hand_result(result)
Ausgabeergebnis
>6 40
6000 3000
[Menzen Tsumo, Tanyao, San Ankou, Sanshoku Doukou]
{'fu': 20, 'reason': 'base'}
{'fu': 4, 'reason': 'closed_pon'} #Impressum
{'fu': 4, 'reason': 'closed_pon'} #Impressum
{'fu': 4, 'reason': 'closed_pon'} #Impressum
{'fu': 2, 'reason': 'tsumo'} #Tsumo
Der Unterschied zwischen Ron und Tsumo ist
Es ist ein Argument von caluculator.estimate_hand_value ()
Gibt an, ob in config (config) "config = HandConfig (is_tsumo = True)" vorhanden ist.
Neben Tsumo
・ Erreichen Sie → is_riichi
・ Ippatsu → is_ippatsu
・ Rinshan Kaihou → is_rinshan
・ Chankan → is_chankan
・ High Tee → is_haitei
・ Hotei → is_houtei
・ Doppelte Reichweite → is_daburu_riichi
・ Sinkendes Mangan → is_nagashi_mangan
・ Tenho → is_tenhou
・ Renho → is_renhou
・ Chiho → is_chiihou
Existiert, sodass Sie es auf die gleiche Weise wie "is_tsumo = True" festlegen können.
** Wenn der Feldwind nach Osten und der Selbstwind nach Süden ist ** Spieler: Kind, Selbstwind: Süd 4 Transliteration 40 Punkte Schütze: 8000 Punkte Rollen: Reichweite, Yakuhai (Selbststil), Dora 2
example02_south.py
#Agari Form(honors=1:Osten, 2:Süden, 3:Westen, 4:Norden, 5:Weiß, 6:發, 7:Während ~)
tiles = TilesConverter.string_to_136_array(man='677889', pin='88', sou='456', honors='222')
#Agari(Mann ist 8)
win_tile = TilesConverter.string_to_136_array(man='8')[0]
#Quietschen(Keiner)
melds = None
#Dora(Kachel anzeigen,裏Dora)
dora_indicators = [
TilesConverter.string_to_136_array(pin='7')[0],
TilesConverter.string_to_136_array(sou='9')[0],
]
#Möglichkeit(erreichen,Selbstwind,Feldstil)
config = HandConfig(is_riichi=True, player_wind=SOUTH, round_wind=EAST)
#Berechnung
result = calculator.estimate_hand_value(tiles, win_tile,melds,dora_indicators, config)
print_hand_result(result)
>4 40
8000 0
[Riichi, Yakuhai (wind of place), Dora 2]
{'fu': 30, 'reason': 'base'} #Menzenron
{'fu': 8, 'reason': 'closed_terminal_pon'} #Abdruck von Yaochu
** Wenn der Feldwind nach Osten und der Selbstwind nach Osten ist ** Spieler: Eltern, Selbststil: Ost 3 Transliteration 40 Punkte Schütze: 7700 Punkte Rolle: Reichweite, Dora 2
example02_east.py
#Agari Form(honors=1:Osten, 2:Süden, 3:Westen, 4:Norden, 5:Weiß, 6:發, 7:Während ~)
tiles = TilesConverter.string_to_136_array(man='677889', pin='88', sou='456', honors='222')
#Agari(Mann ist 8)
win_tile = TilesConverter.string_to_136_array(man='8')[0]
#Quietschen(Keiner)
melds = None
#Dora(Kachel anzeigen,裏Dora)
dora_indicators = [
TilesConverter.string_to_136_array(pin='7')[0],
TilesConverter.string_to_136_array(sou='9')[0],
]
#Möglichkeit(erreichen,Selbstwind,Feldstil)
config = HandConfig(is_riichi=True, player_wind=EAST, round_wind=EAST)
#Berechnung
result = calculator.estimate_hand_value(tiles, win_tile,melds,dora_indicators, config)
print_hand_result(result)
>3 40
7700 0
[Riichi, Dora 2]
{'fu': 30, 'reason': 'base'} #Menzenron
{'fu': 8, 'reason': 'closed_terminal_pon'} #Abdruck von Yaochu
Dora kann eingestellt werden, indem die Anzeigekachel in dora_indicators
beschrieben wird.
Self-Style zu player_wind
von config
, Feldwind zu round_wind
von config
Sie kann durch Angabe von "OST" (Ost), "SÜD" (Süd), "WEST" (West) und "NORD" (Nord) festgelegt werden.
Mit anderen Worten, Sie können den Player als übergeordnetes Element festlegen, indem Sie "player_wind = EAST" festlegen.
** Im Fall von Linshan Kaihou ** Spieler: Kind 3 Übersetzungen 40 Notizen Eltern: 2600 Punkte, Kinder: 1300 Punkte Rollen: Linshan Kaihou, Tan Yao, Rote Dora 1
example03_rinshan.py
#Agari Form(Rote Dora ist 0,Oder benutze r(Jede Bestellung ist in Ordnung), has_aka_dora=Wechseln Sie zu True)
tiles = TilesConverter.string_to_136_array(man='022246', pin='333', sou='33567', has_aka_dora=True)
#Agari(Manz 6)
win_tile = TilesConverter.string_to_136_array(man='6')[0]
#Quietschen(Qi:CHI,Pong:PON,Können:KAN(True:Minkan,False:Ankan),Kakan:CHANKAN,Nukidora:NUKI)
melds = [
Meld(Meld.KAN, TilesConverter.string_to_136_array(man='2222'), False),
Meld(Meld.PON, TilesConverter.string_to_136_array(pin='333')),
Meld(Meld.CHI, TilesConverter.string_to_136_array(sou='567'))
]
#Dora(Keiner)
dora_indicators = None
#Möglichkeit(Tsumo,Rinshan Kaihou,Essen Tan / Red Dora Regel hinzugefügt)
config = HandConfig(is_tsumo=True,is_rinshan=True, options=OptionalRules(has_open_tanyao=True, has_aka_dora=True))
#Berechnung
result = calculator.estimate_hand_value(tiles, win_tile,melds,dora_indicators, config)
print_hand_result(result)
>3 40
2600 1300
[Rinshan Kaihou, Tanyao, Aka Dora 1]
{'fu': 20, 'reason': 'base'}
{'fu': 16, 'reason': 'closed_kan'} #Kann unterschreiben(Ankan)
{'fu': 2, 'reason': 'open_pon'}
{'fu': 2, 'reason': 'tsumo'}
** Für Ron Agari ** Spieler: Kind 2 Transliteration 40 Punkte Schütze: 2600 Punkte Rolle: Tan Yao, Red Dora 1
example03_ron.py
#Agari Form(Das gleiche wie oben)
tiles = TilesConverter.string_to_136_array(man='022246', pin='333', sou='33567', has_aka_dora=True)
#Agari(Das gleiche wie oben)
win_tile = TilesConverter.string_to_136_array(man='6')[0]
#Quietschen(Das gleiche wie oben)
melds = [
Meld(Meld.KAN, TilesConverter.string_to_136_array(man='2222'), False),
Meld(Meld.PON, TilesConverter.string_to_136_array(pin='333')),
Meld(Meld.CHI, TilesConverter.string_to_136_array(sou='567'))
]
#Dora(Keiner)
dora_indicators = None
#Möglichkeit(Essen Tan / Red Dora Regel hinzugefügt)
config = HandConfig(options=OptionalRules(has_open_tanyao=True, has_aka_dora=True))
#Berechnung
result = calculator.estimate_hand_value(tiles, win_tile,melds,dora_indicators, config)
print_hand_result(result)
>2 40
2600 0
[Tanyao, Aka Dora 1]
{'fu': 20, 'reason': 'base'}
{'fu': 16, 'reason': 'closed_kan'}
{'fu': 2, 'reason': 'open_pon'}
Auch wenn is_tsumo = True
hinzugefügt wird, weil es ein Esser ist
Es gibt keinen Tsumo in der Rolle und es gibt einen richtigen Tanyao.
Wenn rote Dora enthalten ist, Vergessen Sie nicht, die Agari-Form bzw. die Optionen festzulegen!
Andere optionale Regeln neben dem Essen von Zunge und roter Dora, Es kann mit "HandConfig (Optionen)" von "config" eingestellt werden.
・ Double Yakuman → has_double_yakuman (T oder F)
・ Yakuman zählen → kazoe_limit (kazoe_limit = HandConfig.KAZOE_LIMITED, HandConfig.KAZOE_SANBAIMAN, HandConfig.KAZOE_NO_LIMIT)
Aufgerundetes Mangan → Kiriage (T oder F)
・ Pinfu → fu_for_open_pinfu (T oder F)
・ Pinfutsumo → fu_for_pinfu_tsumo (T oder F)
・ Renho → renhou_as_yakuman (T oder F)
・ Daisharin → has_daisharin (T oder F)
・ Daichikrin & Daisuulin → has_daisharin_other_suits (T oder F)
** Wenn 13 oder mehr Übersetzungen als Yakuman verwendet werden (normales Zählen von Yakuman) ** Spieler: Kind 29 Übersetzung 80 Punkte Eltern: 16000 Punkte, Kind: 8000 Punkte Rollen: Linshan Kaihou, Spielzeug, San Ankou, Sankantsu, Chinitsu, Rot 1, Dora 16
example04_limited.py
#Agari Form(Wenn es nur einen Fliesentyp gibt, hat_aka_Keine Notwendigkeit für Dora)
tiles = TilesConverter.string_to_136_array(man='22244455777999')
#Agari(Manz Red 5,Die Bedeutung ist jedoch die gleiche wie bei 5 gewöhnlichen Manz)
win_tile = TilesConverter.string_to_136_array(man='5')[0]
#Quietschen(Daiminkan:true,Ankan:False)
melds = [
Meld(Meld.KAN, TilesConverter.string_to_136_array(man='7777'), False),
Meld(Meld.KAN, TilesConverter.string_to_136_array(man='2222'), False),
Meld(Meld.KAN, TilesConverter.string_to_136_array(man='9999'), True)
]
#Dora(Nur die Anzahl der Anzeigekacheln)
dora_indicators = [
TilesConverter.string_to_136_array(man='1')[0],
TilesConverter.string_to_136_array(man='1')[0],
TilesConverter.string_to_136_array(man='6')[0],
TilesConverter.string_to_136_array(man='8')[0],
]
#Möglichkeit(Optionale Regeln kazoe_Limit auf KAZOE_NO_Beschränken,Wenn es rot gibt, stellen Sie hier ein)
config = HandConfig(is_tsumo=True,is_rinshan=True,options=OptionalRules(kazoe_limit=HandConfig.KAZOE_LIMITED, has_aka_dora=True))
#Berechnung
result = calculator.estimate_hand_value(tiles, win_tile,melds,dora_indicators, config)
print_hand_result(result)
>29 80
16000 8000
[Rinshan Kaihou, Toitoi, San Ankou, San Kantsu, Chinitsu, Dora 16, Aka Dora 1]
{'fu': 20, 'reason': 'base'}
{'fu': 16, 'reason': 'closed_kan'}
{'fu': 16, 'reason': 'closed_kan'}
{'fu': 16, 'reason': 'open_terminal_kan'}
{'fu': 4, 'reason': 'closed_pon'}
{'fu': 2, 'reason': 'pair_wait'}
{'fu': 2, 'reason': 'tsumo'}
** Wenn 13 oder mehr Übersetzungen als Sunbaiman gemacht werden ** Spieler: Kind 29 Übersetzung 80 Punkte Eltern: 12000 Punkte, Kind: 6000 Punkte Rollen: Linshan Kaihou, Spielzeug, San Ankou, Sankantsu, Chinitsu, Rot 1, Dora 16
example04_sanbaiman.py
#Agari Form(Das gleiche wie oben)
tiles = TilesConverter.string_to_136_array(man='22244455777999')
#Agari(Das gleiche wie oben)
win_tile = TilesConverter.string_to_136_array(man='5')[0]
#Quietschen(Das gleiche wie oben)
melds = [
Meld(Meld.KAN, TilesConverter.string_to_136_array(man='7777'), False),
Meld(Meld.KAN, TilesConverter.string_to_136_array(man='2222'), False),
Meld(Meld.KAN, TilesConverter.string_to_136_array(man='9999'), True)
]
#Dora(Das gleiche wie oben)
dora_indicators = [
TilesConverter.string_to_136_array(man='1')[0],
TilesConverter.string_to_136_array(man='1')[0],
TilesConverter.string_to_136_array(man='6')[0],
TilesConverter.string_to_136_array(man='8')[0],
]
#Möglichkeit(Optionale Regeln kazoe_Limit auf KAZOE_Nach Sanbaniman)
config = HandConfig(is_tsumo=True,is_rinshan=True,options=OptionalRules(kazoe_limit=HandConfig.KAZOE_SANBAIMAN, has_aka_dora=True))
#Berechnung
result = calculator.estimate_hand_value(tiles, win_tile,melds,dora_indicators, config)
print_hand_result(result)
>29 80
12000 6000
[Rinshan Kaihou, Toitoi, San Ankou, San Kantsu, Chinitsu, Dora 16, Aka Dora 1]
{'fu': 20, 'reason': 'base'}
{'fu': 16, 'reason': 'closed_kan'}
{'fu': 16, 'reason': 'closed_kan'}
{'fu': 16, 'reason': 'open_terminal_kan'}
{'fu': 4, 'reason': 'closed_pon'}
{'fu': 2, 'reason': 'pair_wait'}
{'fu': 2, 'reason': 'tsumo'}
** Wenn 13 oder mehr Übersetzungen Yakuman sind und 26 oder mehr Übersetzungen Double Yakuman sind ** Spieler: Kind 29 Übersetzung 80 Punkte Eltern: 32000 Punkte, Kind: 16000 Punkte Rollen: Linshan Kaihou, Spielzeug, San Ankou, Sankantsu, Chinitsu, Rot 1, Dora 16
example04_no_limit.py
#Agari Form(Das gleiche wie oben)
tiles = TilesConverter.string_to_136_array(man='22244455777999')
#Agari(Das gleiche wie oben)
win_tile = TilesConverter.string_to_136_array(man='5')[0]
#Quietschen(Das gleiche wie oben)
melds = [
Meld(Meld.KAN, TilesConverter.string_to_136_array(man='7777'), False),
Meld(Meld.KAN, TilesConverter.string_to_136_array(man='2222'), False),
Meld(Meld.KAN, TilesConverter.string_to_136_array(man='9999'), True)
]
#Dora(Das gleiche wie oben)
dora_indicators = [
TilesConverter.string_to_136_array(man='1')[0],
TilesConverter.string_to_136_array(man='1')[0],
TilesConverter.string_to_136_array(man='6')[0],
TilesConverter.string_to_136_array(man='8')[0],
]
#Möglichkeit(Optionale Regeln kazoe_Limit auf KAZOE_NO_Beschränken)
config = HandConfig(is_tsumo=True,is_rinshan=True,options=OptionalRules(kazoe_limit=HandConfig.KAZOE_NO_LIMIT, has_aka_dora=True))
#Berechnung
result = calculator.estimate_hand_value(tiles, win_tile,melds,dora_indicators, config)
print_hand_result(result)
>29 80
32000 16000
[Rinshan Kaihou, Toitoi, San Ankou, San Kantsu, Chinitsu, Dora 16, Aka Dora 1]
{'fu': 20, 'reason': 'base'}
{'fu': 16, 'reason': 'closed_kan'}
{'fu': 16, 'reason': 'closed_kan'}
{'fu': 16, 'reason': 'open_terminal_kan'}
{'fu': 4, 'reason': 'closed_pon'}
{'fu': 2, 'reason': 'pair_wait'}
{'fu': 2, 'reason': 'tsumo'}
Als Bonus hat es eine Agari-Form wie Saki-san.
Wenn das Chinitsu rote Dora enthält,
Has_aka_dora = True
ist für Tiles
nicht erforderlich
Nur config
(optional) ist in Ordnung.
(Wenn Tiles
hasaka_dora = True
hat, wird ein Fehler zurückgegeben.)
Fügen Sie so viele angezeigte Kacheln hinzu, wie die Nummer für "dora_indicators" angezeigt wird.
Mahjong ist nicht nur eine manuelle Berechnung Sie können auch die Anzahl der Chanten berechnen!
example04_shanten.py
#Anzahl der Chanten
from mahjong.shanten import Shanten
#Shanten(Chantenzahl-Berechnungsklasse)Erstellen Sie eine Instanz von
shanten = Shanten()
#14 Handfliesen
tiles = TilesConverter.string_to_34_array(man='13569', pin='123459', sou='443')
#Berechnung
result = shanten.calculate_shanten(tiles)
print(result)
#Ergebnis
>2
Dieses Mal habe ich es als Memorandum für mich zusammengefasst. Ich glaube, ich habe den Mangel an Erklärung fast wettgemacht. (Ich habe weder Nukidora noch spezielle Optionsregeln ausprobiert, aber w)
Diese Bibliothek ist als Mahjong-Liebhaber unwiderstehlich! (Lol) Ich möchte mit dieser Bibliothek eine neue Mahjong-App entwickeln.
Recommended Posts