diff --git a/game/builtin/player.go b/game/builtin/player.go index 876178a..5013174 100644 --- a/game/builtin/player.go +++ b/game/builtin/player.go @@ -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...) } diff --git a/game/player.go b/game/player.go index f322136..b069374 100644 --- a/game/player.go +++ b/game/player.go @@ -11,5 +11,5 @@ type Player[ID comparable] interface { // UseConn 指定连接 UseConn(conn *server.Conn) // Close 关闭玩家并且释放其资源 - Close() + Close(err ...error) } diff --git a/game/poker/card_pile.go b/game/poker/card_pile.go index 17d9c17..e9a0421 100644 --- a/game/poker/card_pile.go +++ b/game/poker/card_pile.go @@ -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 检查特定点数和花色是否被排除在外 diff --git a/game/poker/card_pile_test.go b/game/poker/card_pile_test.go new file mode 100644 index 0000000..1c76a60 --- /dev/null +++ b/game/poker/card_pile_test.go @@ -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()) + } +} diff --git a/game/room/manager.go b/game/room/manager.go index 0f59582..57cd53e 100644 --- a/game/room/manager.go +++ b/game/room/manager.go @@ -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 检查房间是否存在 diff --git a/game/room/seat.go b/game/room/seat.go index 5878991..8c722c1 100644 --- a/game/room/seat.go +++ b/game/room/seat.go @@ -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) diff --git a/game/room/seat_test.go b/game/room/seat_test.go new file mode 100644 index 0000000..d479341 --- /dev/null +++ b/game/room/seat_test.go @@ -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) + } + } +} diff --git a/go.mod b/go.mod index 36c07ee..d1ff23b 100644 --- a/go.mod +++ b/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 diff --git a/go.sum b/go.sum index 239ad43..830e467 100644 --- a/go.sum +++ b/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= diff --git a/server/conn.go b/server/conn.go index 86a046a..62ba494 100644 --- a/server/conn.go +++ b/server/conn.go @@ -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) diff --git a/utils/random/weight.go b/utils/random/weight.go index e931c4d..eaac060 100644 --- a/utils/random/weight.go +++ b/utils/random/weight.go @@ -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)