package game import "math/rand" // 四川麻将牌算法 // 1 ~ 9 : 一万 ~ 9万 // 11 ~ 19 : 一条 ~ 9条 // 21 ~ 29 : 一筒 ~ 9筒 // 31 ~ 34 : 东南西北风 // 41 : 发财 // 42 : 红中 // 43 : 白板 // 51 ~ 54 : 春夏秋冬 // 61 ~ 64 : 四种花色 // MjWall 牌墙 type MjWall struct { tiles []int8 forward int // 前游标 // backward int // 后游标 } func (w *MjWall) Init() { w.forward = 0 w.tiles = make([]int8, 0, 9*3*4) // 初始化牌墙 for i := 0; i < 4; i++ { w.tiles = append(w.tiles, []int8{1, 2, 3, 4, 5, 6, 7, 8, 9}...) w.tiles = append(w.tiles, []int8{11, 12, 13, 14, 15, 16, 17, 18, 19}...) w.tiles = append(w.tiles, []int8{21, 22, 23, 24, 25, 26, 27, 28, 29}...) } w.disorder() } // disorder 洗牌 func (w *MjWall) disorder() { length := len(w.tiles) for j := 0; j < length; j++ { repIdx := (rand.Intn(length) + rand.Intn(length)) / 2 w.tiles[j], w.tiles[repIdx] = w.tiles[repIdx], w.tiles[j] } } func (w *MjWall) Peek() int8 { return w.tiles[w.forward] } func (w *MjWall) Pop() int8 { defer func() { w.forward++ }() return w.tiles[w.forward] } func (w *MjWall) PopN(n int) (tiles []int8) { defer func() { w.forward += n }() tiles = make([]int8, n) copy(tiles, w.tiles[w.forward:w.forward+n]) return } func (w *MjWall) RestNum() int { return len(w.tiles) - w.forward } func (w *MjWall) GetTiles() []int8 { return w.tiles } func SortTiles(tiles []int8) { length := len(tiles) for i := 0; i < length; i++ { for j := i + 1; j < length; j++ { if tiles[i] > tiles[j] { tiles[i], tiles[j] = tiles[j], tiles[i] } } } } // SortHandTiles 手牌排序,定缺牌排到后面 func SortHandTiles(lack int8, tiles []int8) { length := len(tiles) for i := 0; i < length; i++ { for j := i + 1; j < length; j++ { l, r := tiles[i], tiles[j] // 定缺牌放最后 if l/10 == lack { l += 63 } if r/10 == lack { r += 63 } if l > r { tiles[i], tiles[j] = tiles[j], tiles[i] } } } }