def Translate(data): for msg in data: return msg tiles_tenhou: dict[str, int] = { '1m': 0, '2m': 1, '3m': 2, '4m': 3, '5m': 4, '5mr': 34, '6m': 5, '7m': 6, '8m': 7, '9m': 8, '1p': 9, '2p': 10, '3p': 11, '4p': 12, '5p': 13, '5pr': 35, '6p': 14, '7p': 15, '8p': 16, '9p': 17, '1s': 18, '2s': 19, '3s': 20, '4s': 21, '5s': 22, '5sr': 36, '6s': 23, '7s': 24, '8s': 25, '9s': 26, 'E': 27, 'S': 28, 'W': 29, 'N': 30, 'P': 31, 'F': 32, 'C': 33 } def TileName(tile_id): if tile_id not in tiles_tenhou: return tile_id return [ '1m', '2m', '3m', '4m', '5m', '6m', '7m', '8m', '9m', '1p', '2p', '3p', '4p', '5p', '6p', '7p', '8p', '9p', '1s', '2s', '3s', '4s', '5s', '6s', '7s', '8s', '9s', # '东', '南', '西', '北', '白', '发', '中', '1z', '2z', '3z', '4z', '5z', '6z', '7z', '0m', '0p', '0s' ][tiles_tenhou[tile_id]] def Dir(who, seat=0): if who == seat: return '自家' if who == (seat + 1) % 4: return '下家' if who == (seat + 2) % 4: return '对家' return '上家' NUKI_CN = {'chi': '吃', 'pon': '碰', 'kakan': '杠', 'ankan': '杠', 'daiminkan': '杠'} NUKI_JP = {'chi': 'チー', 'pon': 'ポン', 'kakan': 'カン', 'ankan': 'カン', 'daiminkan': 'カン'} def ScoreList(msg, seat=0, is3p=False): return ','.join(Dir(i, seat) + ' ' + str(x) for i, x in enumerate(msg['scores'][0:3 if is3p else 4])) def TranslateSingle(msg, seat=0): action = msg['type'] if action == 'start_kyoku': bakaze = msg['bakaze'] return ('东南西北'['ESWN'.index(bakaze)] + ' ' + str(msg['kyoku']) + ' 局' + ' ' + str(msg['honba']) + ' 本场,宝牌指示牌 ' + TileName(msg['dora_marker']) + '\n' + ScoreList(msg, seat)) elif action == 'nukidora': return Dir(msg['actor'], seat) + '拔北' elif action == 'tsumo': return Dir(msg['actor'], seat) + '摸牌 ' + TileName(msg['pai']) elif action == 'dahai': return Dir(msg['actor'], seat) + ('摸切' if msg['tsumogiri'] else '手切') + ' ' + TileName(msg['pai']) elif action in NUKI_CN: return (Dir(msg['actor'], seat) + NUKI_CN[action] + ('' if action not in ('chi', 'peng') else ' ' + (' '.join([TileName(x) for x in msg['consumed']])))) elif action == 'reach': return Dir(msg['actor'], seat) + '宣告立直' elif action == 'reach_accepted': return Dir(msg['actor'], seat) + '立直成功' elif action == 'dora': return '新宝牌指示牌:' + TileName(msg['dora_marker']) elif action == 'hora': return '和牌' #,新分数列表:' + ScoreList(msg, seat) elif action == 'ryukyoku': return '流局' elif action == 'none': return '跳过' else: return str(msg) def TranslateSingleRaw(msg, seat=0, is3p=False): action = msg['type'] if action == 'start_kyoku': bakaze = msg['bakaze'] return ('东南西北'['ESWN'.index(bakaze)] + ' ' + str(msg['kyoku']) + ' 局' + ' ' + str(msg['honba']) + ' 本场,' + ScoreList(msg, seat, is3p)) elif action == 'nukidora': return Dir(msg['actor'], seat) + '拔北' elif action == 'tsumo': return Dir(msg['actor'], seat) + '自摸|' + TileName(msg['pai']) elif action == 'dahai': return Dir(msg['actor'], seat) + '打|' + TileName(msg['pai']) elif action in NUKI_CN: return (Dir(msg['actor'], seat) + NUKI_CN[action] + '|' + TileName(msg['pai']) + ('' if action not in ('chi', 'peng') else '|' + ('|'.join([TileName(x) for x in msg['consumed']])))) elif action == 'reach': return Dir(msg['actor'], seat) + '立直' elif action == 'reach_accepted': return Dir(msg['actor'], seat) + '宣告立直' elif action == 'dora': return '新宝牌指示牌:' + TileName(msg['dora_marker']) elif action == 'hora': return '和' elif action == 'ryukyoku': return '流局' elif action == 'none': return '跳过' else: return str(msg) if __name__ == '__main__': true = True false = False data = [{"type": "start_kyoku", "bakaze": "E", "kyoku": 3, "honba": 0, "kyotaku": 0, "oya": 2, "dora_marker": "9m", "scores": [37000, 19000, 49000, 0], "tehais": [["4p", "9m", "E", "1m", "2s", "P", "4p", "W", "9s", "5s", "1m", "8p", "1m"], ["?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?"], ["?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?"], ["?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?"]]}, {"type": "tsumo", "actor": 2, "pai": "?"}, {"type": "dahai", "actor": 2, "pai": "9m", "tsumogiri": true}, {"type": "tsumo", "actor": 0, "pai": "N"}, {"type": "nukidora", "actor": 0, "pai": "N"}, {"type": "tsumo", "actor": 0, "pai": "9s"}, {"type": "dahai", "actor": 0, "pai": "9m", "tsumogiri": true}, {"type": "tsumo", "actor": 1, "pai": "?"}, {"type": "dahai", "actor": 1, "pai": "4s", "tsumogiri": false}, {"type": "tsumo", "actor": 2, "pai": "?"}, {"type": "dahai", "actor": 2, "pai": "W", "tsumogiri": true}, {"type": "tsumo", "actor": 0, "pai": "2p"}, {"type": "dahai", "actor": 0, "pai": "W", "tsumogiri": true}, {"type": "tsumo", "actor": 1, "pai": "?"}, {"type": "dahai", "actor": 1, "pai": "6s", "tsumogiri": false}, {"type": "tsumo", "actor": 2, "pai": "?"}, {"type": "dahai", "actor": 2, "pai": "C", "tsumogiri": true}, {"type": "tsumo", "actor": 0, "pai": "9m"}, {"type": "dahai", "actor": 0, "pai": "9m", "tsumogiri": true}, {"type": "tsumo", "actor": 1, "pai": "?"}, {"type": "dahai", "actor": 1, "pai": "9s", "tsumogiri": false}, {"type": "tsumo", "actor": 2, "pai": "?"}, {"type": "dahai", "actor": 2, "pai": "7s", "tsumogiri": true}, {"type": "tsumo", "actor": 0, "pai": "9s"}, {"type": "dahai", "actor": 0, "pai": "E", "tsumogiri": true}, {"type": "tsumo", "actor": 1, "pai": "?"}, {"type": "dahai", "actor": 1, "pai": "9p", "tsumogiri": false}, {"type": "tsumo", "actor": 2, "pai": "?"}, {"type": "dahai", "actor": 2, "pai": "7s", "tsumogiri": false}, {"type": "tsumo", "actor": 0, "pai": "1p"}, {"type": "dahai", "actor": 0, "pai": "P", "tsumogiri": true}, {"type": "tsumo", "actor": 1, "pai": "?"}, {"type": "dahai", "actor": 1, "pai": "4s", "tsumogiri": false}, {"type": "tsumo", "actor": 2, "pai": "?"}, {"type": "dahai", "actor": 2, "pai": "8s", "tsumogiri": false}, {"type": "tsumo", "actor": 0, "pai": "8s"}, {"type": "dahai", "actor": 0, "pai": "8s", "tsumogiri": true}, {"type": "tsumo", "actor": 1, "pai": "?"}, {"type": "dahai", "actor": 1, "pai": "4p", "tsumogiri": false}, {"type": "tsumo", "actor": 2, "pai": "?"}, {"type": "dahai", "actor": 2, "pai": "E", "tsumogiri": false}, {"type": "tsumo", "actor": 0, "pai": "N"}, {"type": "nukidora", "actor": 0, "pai": "N"}, {"type": "tsumo", "actor": 0, "pai": "3s"}, {"type": "dahai", "actor": 0, "pai": "5s", "tsumogiri": true}, {"type": "tsumo", "actor": 1, "pai": "?"}, {"type": "dahai", "actor": 1, "pai": "E", "tsumogiri": false}, {"type": "tsumo", "actor": 2, "pai": "?"}, {"type": "dahai", "actor": 2, "pai": "1m", "tsumogiri": true}, {"type": "tsumo", "actor": 0, "pai": "8p"}, {"type": "dahai", "actor": 0, "pai": "1p", "tsumogiri": true}, {"type": "tsumo", "actor": 1, "pai": "?"}, {"type": "dahai", "actor": 1, "pai": "1s", "tsumogiri": false}, {"type": "tsumo", "actor": 2, "pai": "?"}, {"type": "dahai", "actor": 2, "pai": "5p", "tsumogiri": true}, {"type": "tsumo", "actor": 0, "pai": "6p"}, {"type": "dahai", "actor": 0, "pai": "2p", "tsumogiri": true}, {"type": "tsumo", "actor": 1, "pai": "?"}, {"type": "dahai", "actor": 1, "pai": "6s", "tsumogiri": false}, {"type": "tsumo", "actor": 2, "pai": "?"}, {"type": "dahai", "actor": 2, "pai": "9p", "tsumogiri": true}, {"type": "tsumo", "actor": 0, "pai": "8p"}, {"type": "reach", "actor": 0}, {"type": "dahai", "actor": 0, "pai": "6p", "tsumogiri": true}, {"type": "reach_accepted", "actor": 0, "deltas": [-1000, 0, 0, 0], "scores": [36000, 19000, 49000, 0]}, {"type": "tsumo", "actor": 1, "pai": "?"}, {"type": "dahai", "actor": 1, "pai": "7p", "tsumogiri": false}, {"type": "tsumo", "actor": 2, "pai": "?"}, {"type": "dahai", "actor": 2, "pai": "C", "tsumogiri": false}, {"type": "tsumo", "actor": 0, "pai": "C"}, {"type": "dahai", "actor": 0, "pai": "C", "tsumogiri": true}, {"type": "tsumo", "actor": 1, "pai": "?"}, {"type": "dahai", "actor": 1, "pai": "6p", "tsumogiri": false}, {"type": "tsumo", "actor": 2, "pai": "?"}, {"type": "dahai", "actor": 2, "pai": "1s", "tsumogiri": true}] for x in data: print(TranslateSingle(x))