room.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package room
  2. import (
  3. "github.com/name5566/leaf/gate"
  4. )
  5. type Round struct {
  6. // 回合数
  7. Round int
  8. // 回合座位
  9. RoundSitPos int
  10. // 回合下注
  11. RoundBet int
  12. // 思考时间
  13. RoundThinkTime int
  14. // 回合结束时间
  15. RoundEndTime int64
  16. // 操作看牌
  17. OpLookCard bool
  18. // 操作下注
  19. OpBet bool
  20. // 操作弃牌
  21. OpPack bool
  22. // 操作开牌
  23. OpOpenCard bool
  24. }
  25. // 定一个类为每局游戏
  26. type GameRound struct {
  27. //回合列表
  28. Rounds []Round
  29. }
  30. // RoomStatus 房间状态
  31. const (
  32. RoomStatusWaiting = 0 // 等待开局
  33. RoomStatusDealing = 1 // 发牌中
  34. RoomStatusPlaying = 2 // 游戏进行中
  35. )
  36. type Room struct {
  37. Id string
  38. Players []*Player
  39. Status int
  40. // 当前轮次
  41. Round int
  42. // 当前回合的座位
  43. RoundSitPos int
  44. // 每局游戏
  45. GameRound *GameRound
  46. // 牌堆
  47. CardDeck []Card
  48. }
  49. // 定一个扑克牌,从1到52
  50. type Card struct {
  51. // 花色
  52. Color int
  53. // 点数
  54. Point int
  55. }
  56. type Player struct {
  57. Id string
  58. Agent gate.Agent
  59. IsRobot bool
  60. UserData interface{}
  61. //手牌
  62. HandCards []Card
  63. // 座位
  64. SitPos int
  65. // 等待发牌
  66. WaitCard bool
  67. // 是否已看牌
  68. IsLookCard bool
  69. // 是否已弃牌
  70. IsPacked bool
  71. // 是否开牌
  72. IsOpenCard bool
  73. // 是否已结算
  74. IsSettle bool
  75. // 是否已离开
  76. IsLeave bool
  77. // 是否已准备
  78. IsReady bool
  79. // 是否是庄家
  80. IsDealer bool
  81. }
  82. // 获取玩家ID
  83. func (p *Player) GetUserId() string {
  84. return p.Id
  85. }
  86. func (r *Room) AddPlayer(p *Player) {
  87. r.Players = append(r.Players, p)
  88. }
  89. func (r *Room) RemovePlayer(p *Player) {
  90. for i, player := range r.Players {
  91. if player.Id == p.Id {
  92. r.Players = append(r.Players[:i], r.Players[i+1:]...)
  93. break
  94. }
  95. }
  96. }
  97. func (r *Room) RemoveAllRobot() {
  98. for i, player := range r.Players {
  99. if player.IsRobot {
  100. r.Players = append(r.Players[:i], r.Players[i+1:]...)
  101. }
  102. }
  103. }
  104. func (r *Room) GetPlayer(id string) *Player {
  105. for _, player := range r.Players {
  106. if player.Id == id {
  107. return player
  108. }
  109. }
  110. return nil
  111. }
  112. // 获取庄家的玩家
  113. func (r *Room) GetDealerPlayer() *Player {
  114. for _, player := range r.Players {
  115. if player.IsDealer {
  116. return player
  117. }
  118. }
  119. return nil
  120. }
  121. // 设置指定玩家为庄家,并设置其他玩家为非庄家
  122. func (r *Room) SetDealerPlayer(p *Player) {
  123. for _, player := range r.Players {
  124. player.IsDealer = false
  125. }
  126. p.IsDealer = true
  127. }
  128. // 获取WaitCard是false的所有玩家
  129. func (r *Room) GetWaitCardPlayers() []*Player {
  130. players := make([]*Player, 0)
  131. for _, player := range r.Players {
  132. if !player.WaitCard {
  133. players = append(players, player)
  134. }
  135. }
  136. return players
  137. }
  138. // sitPos 是当前玩家的座位号,GetWaitCardPlayers 从sitPos开始 顺时针方向把所有玩家返回
  139. // 从指定座位号开始顺时针获取所有玩家
  140. func (room *Room) GetPlayersBySitPos(startSitPos int) []*Player {
  141. players := make([]*Player, 0)
  142. maxSitPos := 5 // 假设最大6个座位
  143. // 先添加大于等于 startSitPos 的座位
  144. for sitPos := startSitPos; sitPos < maxSitPos; sitPos++ {
  145. for _, player := range room.Players {
  146. if player.SitPos == sitPos && !player.IsLeave {
  147. players = append(players, player)
  148. break
  149. }
  150. }
  151. }
  152. // 再添加小于 startSitPos 的座位
  153. for sitPos := 0; sitPos < startSitPos; sitPos++ {
  154. for _, player := range room.Players {
  155. if player.SitPos == sitPos && !player.IsLeave {
  156. players = append(players, player)
  157. break
  158. }
  159. }
  160. }
  161. return players
  162. }
  163. // 根据座位号获取玩家
  164. func (r *Room) GetPlayerBySitPos(sitPos int) *Player {
  165. for _, player := range r.Players {
  166. if player.SitPos == sitPos {
  167. return player
  168. }
  169. }
  170. return nil
  171. }
  172. // 增加玩家操作到当前回合
  173. func (r *Room) AddPlayerOpt(round Round) {
  174. r.GameRound.Rounds = append(r.GameRound.Rounds, round)
  175. }