You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

97 lines
1.9 KiB

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]
}
}
}
}