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.
67 lines
1.1 KiB
67 lines
1.1 KiB
package game |
|
|
|
import ( |
|
"math/rand" |
|
"sync" |
|
) |
|
|
|
const ( |
|
BigBlindChip int32 = 2 // 大盲注金额 |
|
SmallBlinds int32 = BigBlindChip / 2 // 小盲注金额 |
|
) |
|
|
|
// Dealer 发牌员, 有打乱的一副牌 |
|
type Dealer struct { |
|
// 一副牌 |
|
// cardList *collect.LinkedList[Card] |
|
cards []*Card |
|
index int |
|
lock *sync.Mutex |
|
} |
|
|
|
func NewDealer() *Dealer { |
|
return &Dealer{ |
|
cards: make([]*Card, 52), |
|
index: 0, |
|
lock: new(sync.Mutex), |
|
} |
|
} |
|
|
|
func (d *Dealer) Init() *Dealer { |
|
d.lock.Lock() |
|
defer d.lock.Unlock() |
|
|
|
d.index = 0 |
|
// 初始化一副牌,13张牌 |
|
for i := 0; i < 13; i++ { |
|
// 4 种花色 |
|
for j := 0; j < 4; j++ { |
|
d.cards[i*4+j] = &Card{PokerDot(i), PokerSuit(j)} |
|
} |
|
} |
|
// 洗牌 |
|
disorder(d.cards) |
|
return d |
|
} |
|
|
|
// Deal 发牌堆第一张牌 |
|
func (d *Dealer) Deal() *Card { |
|
d.lock.Lock() |
|
defer d.lock.Unlock() |
|
|
|
card := d.cards[d.index] |
|
d.index++ |
|
return card |
|
} |
|
|
|
// disorder 乱序洗牌 |
|
func disorder(cards []*Card) { |
|
length := len(cards) |
|
// 洗52次 |
|
for i := 0; i < length; i++ { |
|
for j := 0; j < length; j++ { |
|
repIdx := (rand.Intn(length) + rand.Intn(length)) / 2 |
|
cards[j], cards[repIdx] = cards[repIdx], cards[j] |
|
} |
|
} |
|
}
|
|
|