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