Feature: inform players their order before game
This commit is contained in:
@@ -13,6 +13,7 @@ const (
|
||||
Cancel //取消操作
|
||||
Discard //打牌
|
||||
Draw //发牌(一张)
|
||||
Ready //玩家准备
|
||||
)
|
||||
|
||||
// 吃牌的类型
|
||||
@@ -25,5 +26,7 @@ const (
|
||||
|
||||
const (
|
||||
GameMsgType int = iota
|
||||
TableOrderMsgType
|
||||
RoomControl
|
||||
ChatMsgType
|
||||
)
|
||||
|
||||
@@ -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
@@ -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
@@ -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)
|
||||
|
||||
@@ -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"`
|
||||
}
|
||||
Reference in New Issue
Block a user