Merge branch 'develop'
This commit is contained in:
commit
efe0d4de3f
|
@ -34,11 +34,11 @@ func (slf *Player[ID]) UseConn(conn *server.Conn) {
|
|||
}
|
||||
|
||||
// Send 向该玩家发送数据
|
||||
func (slf *Player[ID]) Send(packet []byte) {
|
||||
slf.conn.Write(packet)
|
||||
func (slf *Player[ID]) Send(packet []byte, callback ...func(err error)) {
|
||||
slf.conn.Write(packet, callback...)
|
||||
}
|
||||
|
||||
// Close 关闭玩家
|
||||
func (slf *Player[ID]) Close() {
|
||||
slf.conn.Close()
|
||||
func (slf *Player[ID]) Close(err ...error) {
|
||||
slf.conn.Close(err...)
|
||||
}
|
||||
|
|
|
@ -11,5 +11,5 @@ type Player[ID comparable] interface {
|
|||
// UseConn 指定连接
|
||||
UseConn(conn *server.Conn)
|
||||
// Close 关闭玩家并且释放其资源
|
||||
Close()
|
||||
Close(err ...error)
|
||||
}
|
||||
|
|
|
@ -78,14 +78,12 @@ func (slf *CardPile[P, C, T]) Reset() {
|
|||
slf.guid++
|
||||
card := slf.generateCard(slf.guid, point, color)
|
||||
slf.cards[slf.guid] = card
|
||||
cards = append(cards, card)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
slf.pile = slf.pile[0:0]
|
||||
for i := 0; i < slf.size; i++ {
|
||||
slf.pile = append(slf.pile, cards...)
|
||||
}
|
||||
slf.pile = cards
|
||||
}
|
||||
|
||||
// IsExclude 检查特定点数和花色是否被排除在外
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
package poker_test
|
||||
|
||||
import (
|
||||
"github.com/kercylan98/minotaur/game/poker"
|
||||
"testing"
|
||||
)
|
||||
|
||||
type Card struct {
|
||||
Guid int64
|
||||
Point int32
|
||||
Color int32
|
||||
}
|
||||
|
||||
func (slf *Card) GetGuid() int64 {
|
||||
return slf.Guid
|
||||
}
|
||||
|
||||
func (slf *Card) GetPoint() int32 {
|
||||
return slf.Point
|
||||
}
|
||||
|
||||
func (slf *Card) GetColor() int32 {
|
||||
return slf.Color
|
||||
}
|
||||
|
||||
func TestCardPile_PullTop(t *testing.T) {
|
||||
var pile = poker.NewCardPile[int32, int32, *Card](6,
|
||||
[2]int32{14, 15},
|
||||
[13]int32{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13},
|
||||
[4]int32{1, 2, 3, 4},
|
||||
func(guid int64, point int32, color int32) *Card {
|
||||
return &Card{Guid: guid, Point: point, Color: color}
|
||||
},
|
||||
)
|
||||
|
||||
pile.Shuffle()
|
||||
for i := 0; i < 10; i++ {
|
||||
t.Log(pile.PullTop())
|
||||
}
|
||||
}
|
|
@ -208,8 +208,11 @@ func (slf *Manager[PID, P, R]) SetOwner(roomId int64, owner PID) {
|
|||
}
|
||||
|
||||
// GetRoom 获取房间
|
||||
func (slf *Manager[PID, P, R]) GetRoom(guid int64) R {
|
||||
return slf.rooms.Get(guid).room
|
||||
func (slf *Manager[PID, P, R]) GetRoom(guid int64) (r R) {
|
||||
if room := slf.rooms.Get(guid); room != nil {
|
||||
r = room.room
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
// Exist 检查房间是否存在
|
||||
|
|
|
@ -73,6 +73,7 @@ func (slf *Seat[PlayerID, P, R]) RemoveSeat(id PlayerID) {
|
|||
slf.mutex.Lock()
|
||||
defer slf.mutex.Unlock()
|
||||
seat := slf.seatPS.DeleteGet(id)
|
||||
slf.vacancy = append(slf.vacancy, seat)
|
||||
slf.seatSP[seat] = nil
|
||||
}
|
||||
|
||||
|
@ -116,6 +117,7 @@ func (slf *Seat[PlayerID, P, R]) SetSeat(id PlayerID, seat int) int {
|
|||
}
|
||||
slf.seatSP[seat] = slf.seatSP[oldSeat]
|
||||
slf.seatSP[oldSeat] = nil
|
||||
slf.vacancy = append(slf.vacancy, oldSeat)
|
||||
slf.seatPS.Set(id, seat)
|
||||
}
|
||||
slf.event.OnPlayerSeatChangeEvent(slf.room, slf.manager.GetPlayer(id), oldSeat, seat)
|
||||
|
|
|
@ -0,0 +1,54 @@
|
|||
package room_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/kercylan98/minotaur/game/room"
|
||||
"github.com/kercylan98/minotaur/server"
|
||||
"testing"
|
||||
)
|
||||
|
||||
type Player struct {
|
||||
}
|
||||
|
||||
func (slf *Player) GetID() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func (slf *Player) GetConn() *server.Conn {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (slf *Player) UseConn(conn *server.Conn) {
|
||||
|
||||
}
|
||||
|
||||
func (slf *Player) Close(err ...error) {
|
||||
|
||||
}
|
||||
|
||||
type Room struct {
|
||||
}
|
||||
|
||||
func (slf *Room) GetGuid() int64 {
|
||||
return 0
|
||||
}
|
||||
|
||||
func TestSeat_SetSeat(t *testing.T) {
|
||||
rm := room.NewManager[string, *Player, *Room]()
|
||||
|
||||
r := &Room{}
|
||||
rm.CreateRoom(r)
|
||||
helper := rm.GetHelper(r)
|
||||
helper.AddSeat("a")
|
||||
helper.AddSeat("b")
|
||||
helper.RemoveSeat("a")
|
||||
helper.AddSeat("c")
|
||||
|
||||
for i, s := range helper.GetSeatInfo() {
|
||||
if s == nil {
|
||||
fmt.Println(i, "nil")
|
||||
} else {
|
||||
fmt.Println(i, *s)
|
||||
}
|
||||
}
|
||||
}
|
8
go.mod
8
go.mod
|
@ -66,11 +66,11 @@ require (
|
|||
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
golang.org/x/arch v0.3.0 // indirect
|
||||
golang.org/x/crypto v0.13.0 // indirect
|
||||
golang.org/x/crypto v0.14.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20221031165847-c99f073a8326 // indirect
|
||||
golang.org/x/net v0.14.0 // indirect
|
||||
golang.org/x/sys v0.12.0 // indirect
|
||||
golang.org/x/term v0.12.0 // indirect
|
||||
golang.org/x/net v0.17.0 // indirect
|
||||
golang.org/x/sys v0.13.0 // indirect
|
||||
golang.org/x/term v0.13.0 // indirect
|
||||
golang.org/x/text v0.13.0 // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect
|
||||
google.golang.org/protobuf v1.30.0 // indirect
|
||||
|
|
8
go.sum
8
go.sum
|
@ -225,6 +225,8 @@ golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk=
|
|||
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
|
||||
golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck=
|
||||
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
|
||||
golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
|
||||
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20221031165847-c99f073a8326 h1:QfTh0HpN6hlw6D3vu8DAwC8pBIwikq0AI1evdm+FksE=
|
||||
golang.org/x/exp v0.0.0-20221031165847-c99f073a8326/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
|
||||
|
@ -245,6 +247,8 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b
|
|||
golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14=
|
||||
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
|
||||
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
|
||||
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
|
@ -270,9 +274,13 @@ golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
|
|||
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
|
||||
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
|
||||
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU=
|
||||
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
|
||||
golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek=
|
||||
golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
|
|
|
@ -7,6 +7,7 @@ import (
|
|||
"github.com/gorilla/websocket"
|
||||
"github.com/kercylan98/minotaur/server/writeloop"
|
||||
"github.com/kercylan98/minotaur/utils/concurrent"
|
||||
"github.com/kercylan98/minotaur/utils/hash"
|
||||
"github.com/kercylan98/minotaur/utils/log"
|
||||
"github.com/panjf2000/gnet"
|
||||
"github.com/xtaci/kcp-go/v5"
|
||||
|
@ -161,6 +162,11 @@ func (slf *Conn) GetData(key any) any {
|
|||
return slf.data[key]
|
||||
}
|
||||
|
||||
// ViewData 查看只读的连接数据
|
||||
func (slf *Conn) ViewData() map[any]any {
|
||||
return hash.Copy(slf.data)
|
||||
}
|
||||
|
||||
// SetMessageData 设置消息数据,该数据将在消息处理完成后释放
|
||||
func (slf *Conn) SetMessageData(key, value any) *Conn {
|
||||
slf.ctx = context.WithValue(slf.ctx, key, value)
|
||||
|
|
|
@ -1,20 +1,20 @@
|
|||
package random
|
||||
|
||||
// WeightSlice 按权重随机从切片中产生一个数据并返回
|
||||
func WeightSlice[T any](getWeightHandle func(data T) int, data ...T) T {
|
||||
func WeightSlice[T any](getWeightHandle func(data T) int64, data ...T) T {
|
||||
item, _ := WeightSliceIndex(getWeightHandle, data...)
|
||||
return item
|
||||
}
|
||||
|
||||
// WeightSliceIndex 按权重随机从切片中产生一个数据并返回数据和对应索引
|
||||
func WeightSliceIndex[T any](getWeightHandle func(data T) int, data ...T) (item T, index int) {
|
||||
var total int
|
||||
var overlayWeight []int
|
||||
func WeightSliceIndex[T any](getWeightHandle func(data T) int64, data ...T) (item T, index int) {
|
||||
var total int64
|
||||
var overlayWeight []int64
|
||||
for _, d := range data {
|
||||
total += getWeightHandle(d)
|
||||
overlayWeight = append(overlayWeight, total)
|
||||
}
|
||||
var r = IntN(total)
|
||||
var r = Int64(0, total)
|
||||
var i, count = 0, len(overlayWeight)
|
||||
for i < count {
|
||||
h := int(uint(i+count) >> 1)
|
||||
|
@ -28,15 +28,15 @@ func WeightSliceIndex[T any](getWeightHandle func(data T) int, data ...T) (item
|
|||
}
|
||||
|
||||
// WeightMap 按权重随机从map中产生一个数据并返回
|
||||
func WeightMap[K comparable, T any](getWeightHandle func(data T) int, data map[K]T) T {
|
||||
func WeightMap[K comparable, T any](getWeightHandle func(data T) int64, data map[K]T) T {
|
||||
item, _ := WeightMapKey(getWeightHandle, data)
|
||||
return item
|
||||
}
|
||||
|
||||
// WeightMapKey 按权重随机从map中产生一个数据并返回数据和对应 key
|
||||
func WeightMapKey[K comparable, T any](getWeightHandle func(data T) int, data map[K]T) (item T, key K) {
|
||||
var total int
|
||||
var overlayWeight []int
|
||||
func WeightMapKey[K comparable, T any](getWeightHandle func(data T) int64, data map[K]T) (item T, key K) {
|
||||
var total int64
|
||||
var overlayWeight []int64
|
||||
var dataSlice = make([]T, 0, len(data))
|
||||
var dataKeySlice = make([]K, 0, len(data))
|
||||
for k, d := range data {
|
||||
|
@ -45,7 +45,7 @@ func WeightMapKey[K comparable, T any](getWeightHandle func(data T) int, data ma
|
|||
dataKeySlice = append(dataKeySlice, k)
|
||||
overlayWeight = append(overlayWeight, total)
|
||||
}
|
||||
var r = IntN(total)
|
||||
var r = Int64(0, total)
|
||||
var i, count = 0, len(overlayWeight)
|
||||
for i < count {
|
||||
h := int(uint(i+count) >> 1)
|
||||
|
|
Loading…
Reference in New Issue