Feature: inform players their order before game

This commit is contained in:
2020-04-01 15:43:36 +08:00
parent 2671f81336
commit 4048d37bbc
5 changed files with 67 additions and 16 deletions
+3
View File
@@ -13,6 +13,7 @@ const (
Cancel //取消操作
Discard //打牌
Draw //发牌(一张)
Ready //玩家准备
)
// 吃牌的类型
@@ -25,5 +26,7 @@ const (
const (
GameMsgType int = iota
TableOrderMsgType
RoomControl
ChatMsgType
)
+27 -6
View File
@@ -12,15 +12,20 @@ type ConnManager struct {
playersCount int
conns []websocket.Conn
gameRecvCh chan message.GameMsgRecv
gameSendCh chan message.GameMsgSend
gameRecvCh chan message.GameMsgRecv
gameSendCh chan message.GameMsgSend
tableOrderCh chan int
}
func NewConnManager(playersCount int, gameRecvCh chan message.GameMsgRecv, gameSendCh chan message.GameMsgSend) *ConnManager {
func NewConnManager(playersCount int,
gameRecvCh chan message.GameMsgRecv,
gameSendCh chan message.GameMsgSend,
tableOrderCh chan int) *ConnManager {
connManager := ConnManager{playersCount: playersCount,
conns: make([]websocket.Conn, 0),
gameRecvCh: gameRecvCh,
gameSendCh: gameSendCh,
conns: make([]websocket.Conn, 0),
gameRecvCh: gameRecvCh,
gameSendCh: gameSendCh,
tableOrderCh: tableOrderCh,
}
go connManager.Broadcaster()
return &connManager
@@ -39,10 +44,26 @@ func (m *ConnManager) Broadcaster() {
for _, conn := range m.conns {
conn.WriteJSON(msg)
}
case first := <-m.tableOrderCh:
log.Println("send table order")
for i := 0; i < 4; i++ {
msg := message.TableOrderMsg{
MsgType: config.TableOrderMsgType,
TableOrder: i,
}
m.conns[(first+i)%4].WriteJSON(msg)
}
}
}
}
func (m *ConnManager) SendMsgTo(order int, msg []byte) {
if order >= len(m.conns) {
return
}
m.conns[order].WriteMessage(websocket.TextMessage, msg)
}
func connListener(conn *websocket.Conn, gameRecvCh chan message.GameMsgRecv, gameSendCh chan message.GameMsgSend) {
for {
commonMsg := message.CommonMsg{}
+7 -4
View File
@@ -11,8 +11,9 @@ type Room struct {
connManager *ConnManager
mahjongManager *game.MahjongManager
gameRecvCh chan message.GameMsgRecv
gameSendCh chan message.GameMsgSend
gameRecvCh chan message.GameMsgRecv
gameSendCh chan message.GameMsgSend
tableOrderCh chan int
password string
playerCount int
@@ -21,11 +22,13 @@ type Room struct {
func NewRoom(rule rule.MahjongRule) *Room {
gameRecvChannel := make(chan message.GameMsgRecv)
gameSendChannel := make(chan message.GameMsgSend)
tableOrderChannel := make(chan int)
return &Room{
gameRecvCh: gameRecvChannel,
gameSendCh: gameSendChannel,
connManager: NewConnManager(4, gameRecvChannel, gameSendChannel),
mahjongManager: game.NewMahjongManager(gameRecvChannel, gameSendChannel, rule),
tableOrderCh: tableOrderChannel,
connManager: NewConnManager(4, gameRecvChannel, gameSendChannel, tableOrderChannel),
mahjongManager: game.NewMahjongManager(gameRecvChannel, gameSendChannel, tableOrderChannel, rule),
}
}
+15 -6
View File
@@ -9,12 +9,14 @@ import (
)
type MahjongManager struct {
wall *model.Wall
playerTile []model.PlayerTile
rules rule.MahjongRule
wall *model.Wall
playerTile []model.PlayerTile
rules rule.MahjongRule
firstPlayer int
gameRecvCh chan message.GameMsgRecv
gameSendCh chan message.GameMsgSend
gameRecvCh chan message.GameMsgRecv
gameSendCh chan message.GameMsgSend
tableOrderCh chan int
lastTableOrder int
currentTableOrder int
@@ -27,13 +29,18 @@ type MahjongManager struct {
//NewMahjongManager return new Mahjong instance, with initiated game channels
// and tile-wall
func NewMahjongManager(gameRecvCh chan message.GameMsgRecv, gameSendCh chan message.GameMsgSend, r rule.MahjongRule) *MahjongManager {
func NewMahjongManager(gameRecvCh chan message.GameMsgRecv,
gameSendCh chan message.GameMsgSend,
tableOrderCh chan int,
r rule.MahjongRule) *MahjongManager {
mahjong := MahjongManager{}
mahjong.rules = r
mahjong.wall = model.NewWall(r.GenerateTiles)
mahjong.playerTile = make([]model.PlayerTile, 4)
mahjong.firstPlayer = 0
mahjong.gameRecvCh = gameRecvCh
mahjong.gameSendCh = gameSendCh
mahjong.tableOrderCh = tableOrderCh
return &mahjong
}
@@ -52,6 +59,8 @@ func (m *MahjongManager) gameLoop(gameRecvCh chan message.GameMsgRecv, gameSendC
log.Printf("player:[%d], action:[%d] ", msg.TableOrder, msg.Action)
switch msg.Action {
case config.Start:
//inform each player their order
m.tableOrderCh <- m.firstPlayer
m.handleStart(msg)
case config.Discard:
m.handleDiscard(msg)
+15
View File
@@ -0,0 +1,15 @@
package message
type TableOrderMsg struct {
MsgType int `json:"msg_type"`
TableOrder int `json:"table_order"`
}
type RoomInfoMsg struct {
MsgType int `json:"msg_type"`
}
type GameResultMsg struct {
MsgType int `json:"msg_type"`
Winner int `json:"winner"`
}