fix: 修复牌型识别、获胜显示、出牌区布局、移动端重连

1. 牌型识别: 新增三带一对、飞机、飞机带单/带对、四带二、四带两对
2. 获胜显示: 先显示最后出牌1秒后再弹出获胜对话框
3. 出牌区布局: 横向排列并换行
4. 移动端重连: 切回前台时自动重连WebSocket
5. 更新文档: README.md和API.md补充新增牌型
This commit is contained in:
wtz
2026-02-22 10:00:13 +08:00
parent af3b805dbf
commit 97e03acbe2
7 changed files with 279 additions and 74 deletions

View File

@@ -185,6 +185,7 @@ func (c *Client) handleMessage(data []byte) {
}
room, _ := c.Hub.GameMgr.GetRoom(c.RoomID)
if room != nil && room.State == models.RoomStateFinished {
c.Hub.broadcastFinalState(c.RoomID, room)
c.Hub.broadcastToRoom(c.RoomID, models.Message{
Type: models.MsgTypeGameOver,
Data: map[string]string{"winnerId": room.LastWinner},
@@ -313,6 +314,34 @@ func (h *Hub) broadcastRoomState(roomID string) {
}
}
func (h *Hub) broadcastFinalState(roomID string, room *models.Room) {
h.mu.RLock()
clients := make([]*Client, 0)
for _, c := range h.Clients {
if c.RoomID == roomID {
clients = append(clients, c)
}
}
h.mu.RUnlock()
for _, c := range clients {
state := h.GameMgr.GetRoomState(roomID, c.ID)
if state != nil {
state.State = models.RoomStatePlaying
data, _ := json.Marshal(models.Message{
Type: models.MsgTypeState,
Data: state,
Timestamp: time.Now().Unix(),
})
select {
case c.Send <- data:
case <-c.done:
default:
}
}
}
}
func (h *Hub) BroadcastRoomLeft(roomID, playerID string) {
h.mu.RLock()
clients := make([]*Client, 0)