Skip to main content

A simple Japanese riichi mahjong environment.

Project description

日本麻将

Project Status

雀魂规则:完成

天凤规则:未完成

测试:未彻底进行

综述

本项目包含一个用C++实现的日本麻将游戏。并且提供接口,以便:

实现不同种类的AI Agent
人类游玩

Example

import numpy as np
import pymahjong as mp

for n in range(1000):
	t = mp.Table()
	t.game_init()
	for m in range(5000):        
		if t.get_phase() < 4:
			aval_actions = t.get_self_actions()
			a = np.random.randint(len(aval_actions))
			if aval_actions[a].action == mp.Action.Tsumo:
				print(aval_actions[a].action)
				for i in range(len(aval_actions[a].correspond_tiles)):
					print(aval_actions[a].correspond_tiles[i].tile)
			t.make_selection(a)
		else:
			aval_actions = t.get_response_actions()
			a = np.random.randint(len(aval_actions))

			if aval_actions[a].action == mp.Action.Ron:
				print(aval_actions[a].action)
				for i in range(len(aval_actions[a].correspond_tiles)):
					print(aval_actions[a].correspond_tiles[i].tile)
			t.make_selection(a)            

		if t.get_phase() == 16:  
			print(t.get_result().result_type)
			break

Table通用接口

Table::init_game_with_metadata

参数类型: unordered_map: string, string 表示元数据

metadata现在支持的Key为: "yama": "1z1z.... 牌山初始化(默认随机开始) "oya": "0"/"1"/"2"/"3" 亲家,默认为"0" "wind": 东风局/南风局/西风局分别为"east","north","south",默认为"east" "deal": "from_0"/"from_oya" 从谁开始发牌(从0号玩家/从庄家开始发牌),默认为"from_0"

Table::get_info 获取牌桌对象

可以进一步通过访问成员来对数据进行获取,包括:

(pybind11封装的接口形式下)
.def_readonly("dora_spec", &Table::dora_spec)
.def_readonly("DORA", &Table::宝牌指示牌)
.def_readonly("URA_DORA", &Table::里宝牌指示牌)
.def_readonly("YAMA", &Table::牌山)
.def_readonly("players", &Table::players)
.def_readonly("turn", &Table::turn)
.def_readonly("last_action", &Table::last_action)
.def_readonly("game_wind", &Table::场风)
.def_readonly("last_action", &Table::last_action)
.def_readonly("oya", &Table::庄家)
.def_readonly("honba", &Table::n本场)
.def_readonly("riichibo", &Table::n立直棒)

Table::get_result 获取游戏结果

仅在从get_phase/get_phase_mt中获取到GAME_OVER/GAME_OVER_MT值之后,可以获取结果

返回类型是Result类型,参见Result部分的介绍

Table单线程版本

Table::get_phase 获取阶段

0,1,2,3分别为每个玩家的主动阶段。 4,5,6,7为回复阶段(鸣牌/pass)。 8,9,10,11为抢杠。 12,13,14,15为抢暗杠。 16为GameOver

Table::get_self_action/get_response_action 获取允许执行的动作

数据类型是SelfAction和ResponseAction的列表。参见这两个类的介绍。

Table::make_selection 进行选择

参数类型为int,表示在允许执行的动作的列表中的第几个。

Table多线程版本

Table::get_phase_mt 获取阶段

0,1,2,3分别为每个玩家的主动阶段。 4为回复阶段 5为GameOver

Table::get_self_action_mt/get_response_action_mt 获取允许执行的动作

参数为int,表示第几号玩家。

数据类型是SelfAction和ResponseAction的列表。参见这两个类的介绍。

如果返回空列表,表示还没有轮到你做出选择。这个结果和should_i_make_selection_mt是一致的。

Table::should_i_make_selection_mt

参数为int,表示第几号玩家。

返回bool,表示你是否可以开始执行动作了。

Table::make_selection_mt 进行选择

参数1:int,表示第几号玩家 参数2:int,表示在允许执行的动作的列表中的第几个。

BaseTile枚举

(参见MahjongPy/MahjongPy.cpp)

Fulu类型

包含一系列可以访问的属性

(pybind11封装的接口形式下)
.def_readonly("type", &Fulu::type)
.def_readonly("tiles", &Fulu::tiles)
.def_readonly("take", &Fulu::take)	

Tile类型

包含一系列可以访问的属性

(pybind11封装的接口形式下)
.def_readonly("tile", &Tile::tile)
.def_readonly("red_dora", &Tile::red_dora)

River类型

包含一系列可以访问的属性

(pybind11封装的接口形式下)
.def_readonly("river", &River::river)

SelfAction类型

包含一系列可以访问的属性

(pybind11封装的接口形式下)
.def_readonly("action", &ResponseAction::action)
.def_readonly("correspond_tiles", &ResponseAction::correspond_tiles)

ResponseAction类型

包含一系列可以访问的属性

(pybind11封装的接口形式下)
.def_readonly("action", &ResponseAction::action)
.def_readonly("correspond_tiles", &ResponseAction::correspond_tiles)

Player类型

包含一系列可以访问的属性

(pybind11封装的接口形式下)
.def_readonly("double_riichi", &Player::double_riichi)
.def_readonly("riichi", &Player::riichi)
.def_readonly("menchin", &Player::门清)
.def_readonly("wind", &Player::wind)
.def_readonly("oya", &Player::亲家)
.def_readonly("furiten", &Player::振听)
.def_readonly("riichi_furiten", &Player::立直振听)
.def_readonly("score", &Player::score)
.def_readonly("hand", &Player::hand)
.def_readonly("fulus", &Player::副露s)
.def_readonly("river", &Player::river)
.def_readonly("ippatsu", &Player::一发)
.def_readonly("first_round", &Player::first_round)

Yaku枚举

(参见MahjongPy/MahjongPy.cpp)

ResultType枚举

(pybind11封装的接口形式下)
.value("RonAgari", ResultType::荣和终局)
.value("TsumoAgari", ResultType::自摸终局)
.value("IntervalRyuuKyoku", ResultType::中途流局)
.value("NoTileRyuuKyoku", ResultType::荒牌流局)
.value("RyuuKyokuMangan", ResultType::流局满贯)

Result类型

包含一系列可以访问的属性

(pybind11封装的接口形式下)
.def_readonly("result_type", &Result::result_type)
.def_readonly("results", &Result::results)
.def_readonly("score", &Result::score)

CounterResult类型

包含一系列可以访问的属性

(pybind11封装的接口形式下)
.def_readonly("yakus", &CounterResult::yakus)
.def_readonly("fan", &CounterResult::fan)
.def_readonly("fu", &CounterResult::fu)
.def_readonly("score1", &CounterResult::score1)
.def_readonly("score2", &CounterResult::score2)

全局函数

yakus_to_string 将役打印出来

参数:Yaku的list 返回:GBK编码的bytes,需要进行decode

TableToString

参数1: Table 参数2:int : 表示打印选项

打印选项的二进制位来表示需要打印的值,在选项中加上这个值即可 0:牌山(1) 1:玩家信息(2) 2:DORA信息(4) 3:立直棒(8) 4:本场棒(16) 5:亲家(32) 6:剩余牌量(64)

返回的是GBK编码的bytes,需要进行decode

例: 想打印所有的信息,可以使用TableToString(table, 999) 想打印牌山和玩家信息,可以使用TableToString(table, 1+2) 想打印玩家信息,DORA信息和立直棒信息,可以使用TableToString(table, 2+4+8)

RiverToString

参数:River类型 返回的是GBK编码的bytes,需要进行decode

TileToString

参数:Tile类型 返回的是GBK编码的bytes,需要进行decode

FuluToString

参数:Fulu类型 返回的是GBK编码的bytes,需要进行decode

SelfActionToString

参数:SelfAction类型 返回的是GBK编码的bytes,需要进行decode

ResponseActionToString

参数:ResponseAction类型 返回的是GBK编码的bytes,需要进行decode

PlayerToString

参数:Player类型 返回的是GBK编码的bytes,需要进行decode

ResultToString

参数:Result类型 返回的是GBK编码的bytes,需要进行decode

CounterResultToString

参数:CounterResult类型 返回的是GBK编码的bytes,需要进行decode

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

pymahjong-0.1-cp39-cp39-manylinux_2_24_x86_64.whl (382.0 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.24+ x86-64

pymahjong-0.1-cp38-cp38-manylinux_2_24_x86_64.whl (382.0 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.24+ x86-64

pymahjong-0.1-cp37-cp37m-manylinux_2_24_x86_64.whl (372.2 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.24+ x86-64

pymahjong-0.1-cp36-cp36m-manylinux_2_24_x86_64.whl (372.1 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.24+ x86-64

Supported by

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