round.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package teen
  2. import (
  3. "fmt"
  4. "server/game"
  5. "server/game/room"
  6. "server/msg"
  7. "time"
  8. )
  9. // 创建定时管理器
  10. var timerMgr = NewTimerManager()
  11. // 开始发牌,先给庄家发牌
  12. func startDealCard(r *room.Room) {
  13. initCardDeck(r)
  14. shuffleCardDeck(r.CardDeck)
  15. if r.Status == room.RoomStatusWaiting {
  16. r.Status = room.RoomStatusDealing
  17. dealer := r.GetDealerPlayer()
  18. // 找到庄家下家依次发牌
  19. for _, player := range r.GetPlayersBySitPos(dealer.SitPos) {
  20. player.HandCards = getThreeCards(r)
  21. player.WaitCard = false
  22. game.Module.Skeleton.AfterFunc(time.Second*1, func() {
  23. notifyPlayerDealCard(r, player.SitPos)
  24. // 如果等待的人数小于等于0,则开始通知庄家操作
  25. if len(r.GetWaitCardPlayers()) <= 0 {
  26. game.Module.Skeleton.Go(func() {
  27. notifyPlayerAction(r, dealer.SitPos)
  28. }, func() {
  29. r.Status = room.RoomStatusPlaying
  30. })
  31. }
  32. })
  33. }
  34. }
  35. }
  36. // 返回牌堆里3张牌,并从牌堆中移除
  37. func getThreeCards(room *room.Room) []room.Card {
  38. // 获取前三张牌
  39. threeCards := room.CardDeck[:3]
  40. // 移除这三张牌(保留剩余的牌)
  41. room.CardDeck = room.CardDeck[3:]
  42. // 返回这三张牌
  43. return threeCards
  44. }
  45. // 通知玩家发牌
  46. func notifyPlayerDealCard(room *room.Room, sitPos int) {
  47. //遍历所有玩家
  48. for _, player := range room.Players {
  49. if player.Agent != nil {
  50. player.Agent.WriteMsg(&msg.ReqDealCard{SitPos: int32(sitPos)})
  51. }
  52. }
  53. }
  54. // 通知玩家操作
  55. func notifyPlayerAction(room *room.Room, sitPos int) {
  56. player := room.GetPlayerBySitPos(sitPos)
  57. if player.Agent != nil {
  58. player.Agent.WriteMsg(&msg.ReqPlayerAction{SitPos: int32(sitPos)})
  59. }
  60. //玩家超过思考时间,则算起牌,否则算操作
  61. addPlayerOptTimeout(room, player, time.Second*time.Duration(GameConfig.ThinkTime))
  62. // game.Module.Skeleton.AfterFunc(time.Second*time.Duration(GameConfig.ThinkTime), func() {
  63. // })
  64. }
  65. // 添加玩家操作超时事件
  66. func addPlayerOptTimeout(room *room.Room, player *room.Player, timeout time.Duration) {
  67. eventID := fmt.Sprintf("player_%s_opt_%s", player.Id, player.SitPos)
  68. timerMgr.AddEvent(eventID, timeout, func() {
  69. // 超时处理逻辑,弃牌
  70. discardCard(room, player.SitPos)
  71. })
  72. }
  73. // 收到玩家操作
  74. func recvPlayerOptAction(room *room.Room, sitPos int, optType msg.PlayerOptType) {
  75. player := room.GetPlayerBySitPos(sitPos)
  76. if player.Agent != nil {
  77. cancelOptTimeout(player, sitPos)
  78. if optType == msg.PlayerOptType_OPT_LOOK_CARD { // 看牌
  79. lookCard(room, sitPos)
  80. } else if optType == msg.PlayerOptType_OPT_DISCARD { // 弃牌
  81. discardCard(room, sitPos)
  82. } else if optType == msg.PlayerOptType_OPT_CALL { // 跟注
  83. call(room, sitPos)
  84. } else if optType == msg.PlayerOptType_OPT_RAISE { // 加注
  85. raise(room, sitPos)
  86. } else if optType == msg.PlayerOptType_OPT_DOUBLE { // 加倍
  87. double(room, sitPos)
  88. } else if optType == msg.PlayerOptType_OPT_FOLD { // 放弃
  89. fold(room, sitPos)
  90. }
  91. }
  92. }
  93. // 发送消息给所有玩家
  94. func SendRoundMsgToAll(room *room.Room, msg *msg.ReqRound) {
  95. for _, player := range room.Players {
  96. if player.Agent != nil {
  97. player.Agent.WriteMsg(msg)
  98. }
  99. }
  100. }