room.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package ludo
  2. import (
  3. "errors"
  4. "fmt"
  5. redismgr "server/db/redis"
  6. "server/msg"
  7. )
  8. // 判断是否已存在选择的阵营
  9. func IsMatchColor(room_info *msg.RoomInfo, select_color msg.RoleType) bool {
  10. for c := range room_info.Colors {
  11. if room_info.Colors[c].MColor == select_color {
  12. return false
  13. }
  14. }
  15. return true
  16. }
  17. func AddRoom(room *msg.RoomInfo) {
  18. gameConfig.mu.Lock()
  19. defer gameConfig.mu.Unlock()
  20. gameConfig.RoomMap[room.Id] = room
  21. }
  22. func RemoveRoom(roomID int32) {
  23. gameConfig.mu.Lock()
  24. defer gameConfig.mu.Unlock()
  25. delete(gameConfig.RoomMap, roomID)
  26. }
  27. func GetRoom(roomID int32) *msg.RoomInfo {
  28. gameConfig.mu.RLock()
  29. defer gameConfig.mu.RUnlock()
  30. return gameConfig.RoomMap[roomID]
  31. }
  32. func GetRoomsByType(roomType msg.RoomType) []*msg.RoomInfo {
  33. gameConfig.mu.RLock()
  34. defer gameConfig.mu.RUnlock()
  35. var result []*msg.RoomInfo
  36. for _, room := range gameConfig.RoomMap {
  37. if room.RoomType == roomType {
  38. result = append(result, room)
  39. }
  40. }
  41. return result
  42. }
  43. func GetRoomsByLevel(matchInfo *msg.MatchLudo, roomStatus msg.RoomStatus) []*msg.RoomInfo {
  44. gameConfig.mu.Lock()
  45. defer gameConfig.mu.Unlock()
  46. fmt.Printf("RoomMap: %+v\n", gameConfig.RoomMap) // 打印 RoomMap 内容
  47. fmt.Printf("Query: roomType=%v, roomLevel=%v, roomStatus=%v, color=%v\n",
  48. matchInfo.SelectRoomType, matchInfo.RoomLevel, roomStatus, matchInfo.SelectColor)
  49. var result []*msg.RoomInfo
  50. for _, room := range gameConfig.RoomMap {
  51. fmt.Printf("Checking room: %+v\n", room) // 打印每个 room 的信息
  52. if room.RoomType == matchInfo.SelectRoomType &&
  53. room.RoomLevel == matchInfo.RoomLevel &&
  54. room.RoomStatus == roomStatus &&
  55. IsMatchColor(room, matchInfo.SelectColor) {
  56. result = append(result, room)
  57. }
  58. }
  59. return result
  60. }
  61. func CreateRoom(matchInfo *msg.MatchLudo, userId string) *msg.RoomInfo {
  62. gameConfig.mu.Lock()
  63. defer gameConfig.mu.Unlock()
  64. userInfo, err_info := redismgr.GetUserInfoFromRedis(userId)
  65. if err_info != nil {
  66. return nil
  67. }
  68. newRoom := &msg.RoomInfo{
  69. Id: generateRoomID(),
  70. RoomLevel: int32(matchInfo.RoomLevel),
  71. RoomType: matchInfo.SelectRoomType,
  72. RoomMode: msg.RoomMode_WAN_JIA, //设置为玩家pvp模式
  73. RoomStatus: msg.RoomStatus_AWAIT,
  74. Colors: []*msg.ColorData{
  75. {
  76. MId: userId,
  77. MColor: matchInfo.SelectColor, //所属阵营
  78. IsKick: false, //是否被踢
  79. IsFinish: false, //是否完成了比赛
  80. TimeOutNum: 0, //超时次数
  81. MName: userInfo.Name, //玩家名字
  82. MHead: userInfo.MHead, //头像
  83. RankNum: 0, //本局游戏的名次
  84. MCoin: userInfo.MCoin, //玩家拥有的金币
  85. },
  86. },
  87. }
  88. gameConfig.RoomMap[newRoom.Id] = newRoom
  89. return newRoom
  90. }
  91. func JoinRoom(room *msg.RoomInfo, matchInfo *msg.MatchLudo, userId string) (bool, error) {
  92. gameConfig.mu.Lock()
  93. defer gameConfig.mu.Unlock()
  94. userInfo, err_info := redismgr.GetUserInfoFromRedis(userId)
  95. if err_info != nil {
  96. return false, errors.New("not find user at JoinRoom time ")
  97. }
  98. user_agent := getAgentByUserId(userId)
  99. if user_agent == nil {
  100. return false, errors.New("not find user ")
  101. }
  102. room.Colors = append(room.Colors, &msg.ColorData{
  103. MId: userId,
  104. MColor: matchInfo.SelectColor, //所属阵营
  105. IsKick: false, //是否被踢
  106. IsFinish: false, //是否完成了比赛
  107. TimeOutNum: 0, //超时次数
  108. MName: userInfo.Name, //玩家名字
  109. MHead: userInfo.MHead, //头像
  110. RankNum: 0, //本局游戏的名次
  111. MCoin: userInfo.MCoin, //玩家拥有的金币
  112. })
  113. ud := &msg.UserInfo{
  114. UserId: userInfo.UserId,
  115. Name: userInfo.Name,
  116. MCoin: userInfo.MCoin,
  117. MHead: userInfo.MHead,
  118. RoomId: room.Id,
  119. }
  120. redismgr.SaveUserInfoToRedis(ud)
  121. user_agent.SetUserData(ud)
  122. isFullPlayer := false
  123. if room.RoomType == msg.RoomType_SHUANG_REN { //说明是两人的房间
  124. isFullPlayer = len(room.Colors) == 2
  125. } else if room.RoomType == msg.RoomType_SIREN_REN { //说明是四人的房间
  126. isFullPlayer = len(room.Colors) == 4
  127. }
  128. return isFullPlayer, nil
  129. }
  130. func generateRoomID() int32 {
  131. gameConfig.mu.RLock()
  132. defer gameConfig.mu.RUnlock()
  133. return int32(len(gameConfig.RoomMap) + 1)
  134. }
  135. func getPlayerCount(room_info *msg.RoomInfo) int {
  136. if room_info.RoomType == msg.RoomType_SHUANG_REN {
  137. return 2
  138. }
  139. return 4
  140. }
  141. func setPlayersRoomId(room_info *msg.RoomInfo) {
  142. for i := range room_info.Colors {
  143. user_id := room_info.Colors[i].MId
  144. user_agent := getAgentByUserId(user_id)
  145. if user_agent != nil {
  146. user_agent.SetUserData(&msg.UserInfo{})
  147. }
  148. }
  149. }
  150. func initRoles(room_info *msg.RoomInfo) {
  151. for i := range room_info.Colors {
  152. color_data := room_info.Colors[i]
  153. color := color_data.MColor
  154. for i := range 4 {
  155. room_info.Roles = append(room_info.Roles, &msg.RoleData{
  156. MColor: color,
  157. MSeat: int32(i),
  158. MId: fmt.Sprintf("%d_%d", color, i),
  159. MCurRoad: msg.RoadType_HOME,
  160. })
  161. }
  162. }
  163. }
  164. func setFirstColor(room_info *msg.RoomInfo) {
  165. // if room_info.RoomType == msg.RoomType_SHUANG_REN {
  166. // room_info.CurRoundColor =
  167. // }
  168. room_info.CurRoundColor = room_info.Colors[0].MColor
  169. }
  170. func getCurColorEventKey(room_info *msg.RoomInfo) string {
  171. return fmt.Sprintf("%d_%s", room_info.Id, room_info.CurRoundColor)
  172. }