round.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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 i, player := range r.GetPlayersBySitPos(dealer.SitPos) {
  20. player.HandCards = getThreeCards(r)
  21. player.WaitCard = false
  22. game.Module.Skeleton.AfterFunc(time.Second*1*time.Duration(i), func() {
  23. // 如果等待的人数小于等于0,则开始通知庄家操作
  24. // if len(r.GetWaitCardPlayers()) <= 0 {
  25. // }
  26. notifyPlayerDealCard(r, player.SitPos)
  27. if player.SitPos == dealer.SitPos {
  28. game.Module.Skeleton.Go(func() {
  29. notifyPlayerAction(r, dealer.SitPos, msg.PlayerOptType_OPT_SELECT)
  30. }, func() {
  31. r.Status = room.RoomStatusPlaying
  32. })
  33. }
  34. })
  35. }
  36. }
  37. }
  38. // 返回牌堆里3张牌,并从牌堆中移除
  39. func getThreeCards(room *room.Room) []room.Card {
  40. // 获取前三张牌
  41. threeCards := room.CardDeck[:3]
  42. // 移除这三张牌(保留剩余的牌)
  43. room.CardDeck = room.CardDeck[3:]
  44. // 返回这三张牌
  45. return threeCards
  46. }
  47. // 通知玩家发牌
  48. func notifyPlayerDealCard(room *room.Room, sitPos int32) {
  49. //遍历所有玩家
  50. for _, player := range room.Players {
  51. if player.Agent != nil {
  52. player.Agent.WriteMsg(&msg.ReqDealCard{SitPos: int32(sitPos)})
  53. }
  54. }
  55. }
  56. // 通知玩家操作
  57. func notifyPlayerAction(room *room.Room, sitPos int32, optType msg.PlayerOptType) {
  58. player := room.GetPlayerBySitPos(sitPos)
  59. if !player.IsRobot {
  60. } else {
  61. //人机直接操作
  62. robotOpt(room, sitPos, optType)
  63. }
  64. players := room.GetPlayersBySitPos(sitPos)
  65. for _, p := range players {
  66. if p.Agent != nil {
  67. p.Agent.WriteMsg(&msg.ReqPlayerAction{SitPos: int32(sitPos), PlayerOpt: &msg.PlayerOpt{OptType: optType}})
  68. addPlayerOptTimeout(room, player, time.Second*time.Duration(GameConfig.ThinkTime))
  69. }
  70. }
  71. // game.Module.Skeleton.AfterFunc(time.Second*time.Duration(GameConfig.ThinkTime), func() {
  72. // })
  73. }
  74. // 添加玩家操作超时事件
  75. func addPlayerOptTimeout(room *room.Room, player *room.Player, timeout time.Duration) {
  76. eventID := fmt.Sprintf("player_%s_opt_%s", player.Id, player.SitPos)
  77. timerMgr.AddEvent(eventID, timeout, func() {
  78. // 超时处理逻辑,弃牌
  79. discardCard(room, player.SitPos)
  80. })
  81. }
  82. // 收到玩家操作
  83. func recvPlayerOptAction(room *room.Room, sitPos int32, optType msg.PlayerOptType) {
  84. player := room.GetPlayerBySitPos(sitPos)
  85. if player.Agent != nil {
  86. cancelOptTimeout(player, sitPos)
  87. if optType == msg.PlayerOptType_OPT_SEEN { // 看牌
  88. lookCard(room, sitPos)
  89. } else if optType == msg.PlayerOptType_OPT_PACKED { // 弃牌
  90. discardCard(room, sitPos)
  91. } else if optType == msg.PlayerOptType_OPT_CHAAL { // 跟注
  92. call(room, sitPos)
  93. }
  94. }
  95. }
  96. // 发送消息给所有玩家
  97. func SendRoundMsgToAll(room *room.Room, msg *msg.ReqRound) {
  98. for _, player := range room.Players {
  99. if player.Agent != nil {
  100. player.Agent.WriteMsg(msg)
  101. }
  102. }
  103. }