util

package
v0.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 17, 2019 License: MIT Imports: 5 Imported by: 1

Documentation

Index

Constants

View Source
const (
	WallSafeTypeDoubleNoChance = iota // 只输单骑对碰
	WallSafeTypeNoChance              // 单骑对碰边张坎张
	WallSafeTypeDoubleOneChance
	WallSafeTypeMixedOneChance // 对于456来说,一半 double,一半不是 double
	WallSafeTypeOneChance
)

Variables

View Source
var (
	// [需要判断危险度的牌号(0-8)][是否有对应的现物(0-1或0-3)]
	// 123789: 无现物,有现物
	// 4: 无17现物,无1有7,有1无7,有17
	// 56: 同上
	TileTypeTable = [][]tileType{
		{tileTypeNoSuji19, tileTypeSuji19},
		{tileTypeNoSuji28, tileTypeSuji28},
		{tileTypeNoSuji37, tileTypeSuji37},
		{tileTypeNoSuji46, tileTypeHalfSuji46B, tileTypeHalfSuji46A, tileTypeDoubleSuji46},
		{tileTypeNoSuji5, tileTypeHalfSuji5, tileTypeHalfSuji5, tileTypeDoubleSuji5},
		{tileTypeNoSuji46, tileTypeHalfSuji46A, tileTypeHalfSuji46B, tileTypeDoubleSuji46},
		{tileTypeNoSuji37, tileTypeSuji37},
		{tileTypeNoSuji28, tileTypeSuji28},
		{tileTypeNoSuji19, tileTypeSuji19},
	}
	// [是否为役牌(0-1)][剩余数-1]
	HonorTileType = [][]tileType{
		{tileTypeOtaHaiLeft1, tileTypeOtaHaiLeft2, tileTypeOtaHaiLeft3, tileTypeOtaHaiLeft3},
		{tileTypeYakuHaiLeft1, tileTypeYakuHaiLeft2, tileTypeYakuHaiLeft3, tileTypeOtaHaiLeft3},
	}
)
View Source
var Mahjong = [...]string{
	"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",
}
View Source
var MahjongU = [...]string{
	"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",
}
View Source
var MahjongZH = [...]string{
	"1万", "2万", "3万", "4万", "5万", "6万", "7万", "8万", "9万",
	"1饼", "2饼", "3饼", "4饼", "5饼", "6饼", "7饼", "8饼", "9饼",
	"1索", "2索", "3索", "4索", "5索", "6索", "7索", "8索", "9索",
	"东", "南", "西", "北", "白", "发", "中",
}
View Source
var MaxTurns = len(RiskData) - 1
View Source
var RiskData = [][]float64{
	{},
	{5.7, 5.7, 5.8, 4.7, 3.4, 2.5, 2.5, 3.1, 5.6, 3.8, 1.8, 0.8, 2.6, 2.1, 1.2, 0.5, 2.4, 1.4, 1.2},
	{6.6, 6.9, 6.3, 5.2, 4.0, 3.5, 3.5, 4.1, 5.3, 3.5, 1.9, 0.8, 2.6, 2.3, 1.2, 0.5, 2.7, 1.3, 0.4},
	{7.7, 8.0, 6.7, 5.8, 4.6, 4.3, 4.1, 4.9, 5.2, 3.6, 1.8, 1.6, 2.0, 2.4, 1.2, 0.3, 2.6, 1.2, 0.3},
	{8.5, 8.9, 7.1, 6.2, 5.1, 4.8, 4.7, 5.6, 5.2, 3.8, 1.7, 1.6, 2.0, 2.6, 1.1, 0.2, 2.6, 1.2, 0.2},
	{9.4, 9.7, 7.5, 6.7, 5.5, 5.3, 5.1, 6.0, 5.3, 3.7, 1.7, 1.7, 2.0, 2.9, 1.2, 0.2, 2.8, 1.2, 0.2},
	{10.2, 10.5, 7.9, 7.1, 5.9, 5.8, 5.6, 6.4, 5.2, 3.7, 1.7, 1.8, 2.0, 3.2, 1.3, 0.2, 2.9, 1.3, 0.2},
	{11.0, 11.3, 8.4, 7.5, 6.3, 6.3, 6.1, 6.8, 5.3, 3.7, 1.7, 2.0, 2.1, 3.6, 1.4, 0.2, 3.2, 1.4, 0.2},
	{11.9, 12.2, 8.9, 8.0, 6.8, 6.9, 6.6, 7.4, 5.3, 3.8, 1.7, 2.1, 2.2, 4.0, 1.6, 0.2, 3.5, 1.6, 0.2},
	{12.8, 13.1, 9.5, 8.6, 7.4, 7.4, 7.2, 7.9, 5.5, 3.9, 1.8, 2.2, 2.3, 4.6, 1.9, 0.3, 4.0, 1.8, 0.2},
	{13.8, 14.1, 10.1, 9.2, 8.0, 8.0, 7.8, 8.5, 5.6, 4.0, 1.9, 2.4, 2.4, 5.3, 2.2, 0.3, 4.6, 2.1, 0.3},
	{14.9, 15.1, 10.8, 9.9, 8.7, 8.7, 8.5, 9.2, 5.7, 4.2, 2.0, 2.5, 2.6, 6.0, 2.6, 0.4, 5.1, 2.5, 0.3},
	{16.0, 16.3, 11.6, 10.6, 9.4, 9.4, 9.2, 9.9, 6.0, 4.4, 2.2, 2.7, 2.7, 6.8, 3.1, 0.4, 5.1, 2.5, 0.3},
	{17.2, 17.5, 12.4, 11.4, 10.2, 10.2, 10.0, 10.6, 6.2, 4.6, 2.4, 3.0, 3.0, 7.8, 3.7, 0.5, 6.6, 3.7, 0.5},
	{18.5, 18.8, 13.3, 12.3, 11.1, 11.0, 10.9, 11.4, 6.6, 4.9, 2.7, 3.2, 3.1, 8.8, 4.4, 0.7, 7.4, 4.4, 0.6},
	{19.9, 20.1, 14.3, 13.3, 12.0, 11.9, 11.8, 12.3, 7.0, 5.3, 3.0, 3.4, 3.4, 9.9, 5.2, 0.8, 8.4, 5.3, 0.8},
	{21.3, 21.7, 15.4, 14.3, 13.1, 12.9, 12.8, 13.3, 7.4, 5.7, 3.3, 3.7, 3.6, 11.2, 6.2, 1.0, 9.4, 6.5, 0.9},
	{22.9, 23.2, 16.6, 15.4, 14.2, 14.0, 13.8, 14.4, 8.0, 6.1, 3.6, 3.9, 3.9, 12.4, 7.3, 1.3, 10.5, 7.7, 1.2},
	{24.7, 24.9, 17.9, 16.7, 15.4, 15.2, 15.0, 15.6, 8.5, 6.6, 4.0, 4.3, 4.2, 13.9, 8.5, 1.7, 11.8, 9.4, 1.6},
	{27.5, 27.8, 20.4, 19.1, 17.8, 17.5, 17.5, 17.5, 9.8, 7.4, 5.0, 5.1, 5.1, 18.1, 12.1, 2.8, 14.7, 12.6, 2.1},
}

[巡目][类型]

Functions

func CalculateAgariRate added in v0.1.2

func CalculateAgariRate(waits Waits, selfDiscards []int) float64

TODO: selfDiscards: 自家舍牌,用于分析骗筋时的和率

func CalculateLeftNoSujiTiles added in v0.2.0

func CalculateLeftNoSujiTiles(safeTiles34 []bool, leftTiles34 []int) (leftNoSujiTiles []int)

计算剩余的无筋 123789 牌 总计 18 种。剩余无筋牌数量越少,该无筋牌越危险

func CalculateMeld added in v0.1.5

func CalculateMeld(playerInfo *PlayerInfo, tile int, allowChi bool) (shanten int, waitsWithImproves WaitsWithImproves14List, incShantenResults WaitsWithImproves14List)

func CalculateShanten

func CalculateShanten(tiles34 []int, isOpen bool) int

根据手牌计算向听数 tiles34 手牌 isOpen 是否副露,未副露的手牌会考虑七对子

func CalculateShantenWithImproves14

func CalculateShantenWithImproves14(playerInfo *PlayerInfo) (shanten int, waitsWithImproves WaitsWithImproves14List, incShantenResults WaitsWithImproves14List)

2/5/8/11/14 张牌,计算向听数、进张、改良、向听倒退等

func CalculateShantenWithoutChitoitsu

func CalculateShantenWithoutChitoitsu(tiles34 []int) int

func CountOfTiles34 added in v0.1.7

func CountOfTiles34(tiles34 []int) (count int)

func CountPairs

func CountPairs(tiles34 []int) (pairs int)

func InInts added in v0.1.7

func InInts(e int, arr []int) bool

func InitLeftTiles34 added in v0.1.7

func InitLeftTiles34() []int

func InitLeftTiles34WithTiles34 added in v0.1.7

func InitLeftTiles34WithTiles34(tiles34 []int) []int

func MinInt added in v0.1.7

func MinInt(a, b int) int

func MustStrToTile34 added in v0.1.5

func MustStrToTile34(humanTile string) int

func MustStrToTiles34

func MustStrToTiles34(humanTiles string) []int

func NumberToChineseShanten

func NumberToChineseShanten(num int) string

-1=和了,0=和牌,1=一向听,……

func StrToTile34

func StrToTile34(humanTile string) (tile34 int, err error)

e.g. "3m" => 2

func StrToTiles34

func StrToTiles34(humanTiles string) (tiles34 []int, err error)

e.g. "224m 24p" => [0, 2, 0, 1, 0, ..., 1, 0, 1, ...]

func Tile34ToStr added in v0.1.7

func Tile34ToStr(tile34 int) string

func Tiles34ToStr added in v0.1.7

func Tiles34ToStr(tiles34 []int) (humanTiles string)

func Tiles34ToStrWithBracket added in v0.1.7

func Tiles34ToStrWithBracket(tiles34 []int) string

func TilesToStr added in v0.1.7

func TilesToStr(tiles []int) (humanTiles string)

e.g. [9, 11, 27] => "13p 1z"

func TilesToStrWithBracket added in v0.1.7

func TilesToStrWithBracket(tiles []int) string

e.g. [9, 11, 27] => "[13p 1z]"

Types

type DivideResult added in v0.2.0

type DivideResult struct {

	// 刻子牌
	KotsuTiles []int
	// 顺子牌的第一张(如 678s 的 6s)
	ShuntsuFirstTiles []int
	// contains filtered or unexported fields
}

14 张牌的某种拆解结果 若该拆解没有刻子和顺子则为七对子

func DivideTiles34 added in v0.2.0

func DivideTiles34(tiles34 []int) (divideResults []DivideResult)

14张牌,返回所有可能的拆解,没有拆解表示未和牌 http://hp.vector.co.jp/authors/VA046927/mjscore/mjalgorism.html http://hp.vector.co.jp/authors/VA046927/mjscore/AgariIndex.java

func (*DivideResult) IsChiitoitsu added in v0.2.0

func (d *DivideResult) IsChiitoitsu() bool

判断是否为七对子

func (*DivideResult) String added in v0.2.0

func (d *DivideResult) String() string

调试用

type Improves

type Improves map[int]Waits

map[改良牌]进张(选择进张数最大的)

type PlayerInfo added in v0.2.0

type PlayerInfo struct {
	RoundWindTile34 int   // 场风
	SelfWindTile34  int   // 自风
	Tiles34         []int // 手牌
	DiscardTiles    []int // 注意初始化的时候把负数调整成正的!
	LeftTiles34     []int // 剩余牌
	IsOpen          bool  // 是否鸣牌

}

func NewSimplePlayerInfo added in v0.2.0

func NewSimplePlayerInfo(tiles34 []int, isOpen bool) *PlayerInfo

func (*PlayerInfo) FillLeftTiles34 added in v0.2.0

func (pi *PlayerInfo) FillLeftTiles34()

type RiskTiles34 added in v0.1.6

type RiskTiles34 []float64

func CalculateRiskTiles34 added in v0.1.6

func CalculateRiskTiles34(turns int, safeTiles34 []bool, leftTiles34 []int, roundWindTile int, playerWindTile int) (risk34 RiskTiles34)

根据巡目(对于对手而言)、现物、立直后通过的牌的、NC,来计算基础铳率 至于早外、Dora、OC 和读牌交给后续的计算 turns: 巡目,这里是对于对手而言的,也就是该玩家舍牌的次数 safeTiles34: 现物及立直后通过的牌 leftTiles34: 各个牌在山中剩余的枚数 roundWindTile: 场风 playerWindTile: 自风

type Waits

type Waits map[int]int

map[进张牌]剩余数

func CalculateShantenAndWaits13

func CalculateShantenAndWaits13(tiles34 []int, leftTiles34 []int, isOpen bool) (shanten int, waits Waits)

1/4/7/10/13 张牌,计算向听数、进张(考虑了剩余枚数)

func (Waits) AllCount added in v0.1.2

func (w Waits) AllCount() (count int)

func (Waits) ParseIndex

func (w Waits) ParseIndex() (allCount int, indexes []int)

func (Waits) String

func (w Waits) String() string

type WaitsWithImproves13

type WaitsWithImproves13 struct {
	// 场风
	RoundWindTile34 int

	// 自风
	SelfWindTile34 int

	// 原手牌
	Tiles34 []int

	// 剩余牌
	LeftTiles34 []int

	// 向听数
	Shanten int

	// 进张:摸到这张牌能让向听数前进
	// 考虑了剩余枚数
	// 若某个进张 4 枚都可见,则该进张的 value 值为 0
	Waits Waits

	// map[进张牌]向听前进后的进张数(这里让向听前进的切牌选择的是使「向听前进后的进张数最大」的切牌)
	NextShantenWaitsCountMap map[int]int

	// 向听前进后的进张数的加权均值
	AvgNextShantenWaitsCount float64

	// 综合了进张与向听前进后进张的评分
	MixedWaitsScore float64

	// 改良:摸到这张牌虽不能让向听数前进,但可以让进张变多
	// len(Improves) 即为改良的牌的种数
	Improves Improves

	// 改良情况数,这里计算的是有多少种使进张增加的切牌方式
	ImproveWayCount int

	// 在没有摸到进张时的改良后进张数的加权均值(计算时,对于既不是进张也不是改良的牌,其进张数为 Waits.AllCount())
	// 这里只考虑一巡的改良均值
	// TODO: 在考虑改良的情况下,如何计算向听前进所需要的摸牌次数的期望值?
	AvgImproveWaitsCount float64

	// 向听前进后,若听牌,其最大和率的加权均值
	// 若已听牌,则该值为当前手牌和率
	AvgAgariRate float64

	// 振听可能率(一向听和听牌时)
	FuritenRate float64
}

1/4/7/10/13 张手牌的分析结果

func CalculateShantenWithImproves13

func CalculateShantenWithImproves13(playerInfo *PlayerInfo) (r *WaitsWithImproves13)

1/4/7/10/13 张牌,计算向听数、进张、改良等(考虑了剩余枚数)

func (*WaitsWithImproves13) String

func (r *WaitsWithImproves13) String() string

调试用

type WaitsWithImproves14

type WaitsWithImproves14 struct {
	// 切牌后的手牌分析结果
	Result13 *WaitsWithImproves13
	// 需要切的牌
	DiscardTile int
	// 切掉这张牌后的向听数
	Shanten int
	// 副露信息(没有副露就是 nil)
	// 比如用 23m 吃了牌,OpenTiles 就是 [1,2]
	OpenTiles []int
}

func (*WaitsWithImproves14) String

func (r *WaitsWithImproves14) String() string

type WaitsWithImproves14List

type WaitsWithImproves14List []*WaitsWithImproves14

func (WaitsWithImproves14List) Sort

func (l WaitsWithImproves14List) Sort()

type WallSafeTile added in v0.1.3

type WallSafeTile struct {
	Tile34   int
	SafeType int
}

type WallSafeTileList added in v0.1.3

type WallSafeTileList []WallSafeTile

func CalcDNCSafeTiles added in v0.1.6

func CalcDNCSafeTiles(leftTiles34 []int) (dncSafeTiles WallSafeTileList)

根据剩余牌 leftTiles34 中的某些牌是否为 0,来判断哪些牌非常安全(Double No Chance:只输单骑、双碰)

func CalcNCSafeTiles added in v0.1.6

func CalcNCSafeTiles(leftTiles34 []int) (ncSafeTiles WallSafeTileList)

根据剩余牌 leftTiles34 中的某些牌是否为 0,来判断哪些牌较为安全(No Chance:只输单骑、双碰、边张、坎张)

func CalcOCSafeTiles added in v0.1.6

func CalcOCSafeTiles(leftTiles34 []int) (ocSafeTiles WallSafeTileList)

根据剩余牌 leftTiles34 中的某些牌是否为 1,来判断哪些牌较为安全(One Chance:早巡大概率只输单骑、双碰、边张、坎张)

func CalcWallTiles added in v0.1.6

func CalcWallTiles(leftTiles34 []int) (safeTiles WallSafeTileList)

func (WallSafeTileList) FilterWithHands added in v0.1.3

func (l WallSafeTileList) FilterWithHands(handsTiles34 []int) WallSafeTileList

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL