142 lines
2.6 KiB
Go
142 lines
2.6 KiB
Go
package poker
|
||
|
||
import (
|
||
"samba/pkg/log"
|
||
"samba/util/util"
|
||
)
|
||
|
||
// AllocAct 配牌行为
|
||
type AllocAct int
|
||
|
||
const (
|
||
// AllocBad 配差牌
|
||
AllocBad = AllocAct(iota) - 1
|
||
// AllocNormal 普通配牌
|
||
AllocNormal
|
||
// AllocGood 配好牌
|
||
AllocGood
|
||
)
|
||
|
||
func (a AllocAct) String() string {
|
||
switch a {
|
||
case AllocBad:
|
||
return "配差牌"
|
||
case AllocNormal:
|
||
return "普通配牌"
|
||
case AllocGood:
|
||
return "配好牌"
|
||
default:
|
||
return "unknown"
|
||
}
|
||
}
|
||
|
||
const (
|
||
// 每一点幸运值对应的概率
|
||
pAsLuckyPoint = 1
|
||
)
|
||
|
||
// AllocActByLuckyPoint 根据幸运点数返回配牌行为
|
||
func AllocActByLuckyPoint(lucky int) AllocAct {
|
||
|
||
if lucky > 0 {
|
||
return util.Tie(util.RandHappened(lucky*pAsLuckyPoint), AllocGood, AllocNormal)
|
||
}
|
||
if lucky < 0 {
|
||
return util.Tie(util.RandHappened((-lucky)*pAsLuckyPoint), AllocBad, AllocNormal)
|
||
}
|
||
|
||
return AllocNormal
|
||
}
|
||
|
||
// Allocator 幸运值配牌器
|
||
type Allocator struct {
|
||
pks []*Poker
|
||
idx int
|
||
goodPksIdx []int
|
||
badPksIdx []int
|
||
}
|
||
|
||
func (a *Allocator) Init(pkg IPokerGenerator, pokers []*Poker) {
|
||
a.pks = make([]*Poker, len(pokers))
|
||
for idx, poker := range pokers {
|
||
switch {
|
||
case pkg.IsGoodPoker(poker):
|
||
a.goodPksIdx = append(a.goodPksIdx, idx)
|
||
case pkg.IsBadPoker(poker):
|
||
a.badPksIdx = append(a.badPksIdx, idx)
|
||
}
|
||
a.pks[idx] = poker
|
||
}
|
||
|
||
}
|
||
|
||
// Alloc 根据行为配牌
|
||
// act AllocAct 为配牌行为
|
||
// num int 为期望的配牌数量
|
||
// 若好牌、差牌的牌池为空,也就是说被其他玩家配牌,则会进行普通配牌,此时ok返回false
|
||
// 只要有一张牌符合了配牌条件,则ok为true
|
||
func (a *Allocator) Alloc(act AllocAct, num int) (pks []*Poker, ok bool) {
|
||
pks = make([]*Poker, num)
|
||
for i := 0; i < num; i++ {
|
||
var pok bool
|
||
switch act {
|
||
case AllocGood:
|
||
pks[i], pok = a.popGoodPoker()
|
||
case AllocBad:
|
||
pks[i], pok = a.popBadPoker()
|
||
case AllocNormal:
|
||
pks[i] = a.popPoker()
|
||
pok = true
|
||
}
|
||
ok = ok || pok
|
||
}
|
||
return pks, ok
|
||
|
||
}
|
||
|
||
func (a *Allocator) popGoodPoker() (*Poker, bool) {
|
||
for {
|
||
if len(a.goodPksIdx) <= 0 {
|
||
return a.popPoker(), false
|
||
}
|
||
idx := a.goodPksIdx[0]
|
||
pk := a.pks[idx]
|
||
a.pks[idx] = nil
|
||
a.goodPksIdx = a.goodPksIdx[1:]
|
||
if pk != nil {
|
||
return pk, true
|
||
}
|
||
}
|
||
}
|
||
|
||
func (a *Allocator) popBadPoker() (*Poker, bool) {
|
||
for {
|
||
if len(a.badPksIdx) <= 0 {
|
||
return a.popPoker(), false
|
||
}
|
||
idx := a.badPksIdx[0]
|
||
pk := a.pks[idx]
|
||
a.pks[idx] = nil
|
||
a.badPksIdx = a.badPksIdx[1:]
|
||
if pk != nil {
|
||
return pk, true
|
||
}
|
||
}
|
||
}
|
||
|
||
func (a *Allocator) popPoker() *Poker {
|
||
for {
|
||
if a.idx >= len(a.pks) {
|
||
log.Error("pokers is nil")
|
||
return nil
|
||
}
|
||
idx := a.idx
|
||
a.idx++
|
||
pk := a.pks[idx]
|
||
if pk != nil {
|
||
a.pks[idx] = nil
|
||
return pk
|
||
}
|
||
}
|
||
}
|