match_robot.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package ludo
  2. import (
  3. "fmt"
  4. "server/console"
  5. "server/msg"
  6. "time"
  7. )
  8. var wait_room map[int32]time.Time = make(map[int32]time.Time)
  9. var namesArray [10]string = [10]string{
  10. "Alice", "Bob", "Charlie", "David", "Eve",
  11. "Frank", "Grace", "Henry", "Ivy", "Jack",
  12. }
  13. func AddWaitRoomList(room_id int32) {
  14. wait_room[room_id] = time.Now()
  15. }
  16. func RemoveWaitRoomList(room_id int32) {
  17. delete(wait_room, room_id)
  18. }
  19. func StartMatchRobotTask() {
  20. // 创建每秒触发一次的定时器
  21. ticker := time.NewTicker(1 * time.Second)
  22. defer ticker.Stop() // 确保退出时释放资源
  23. for {
  24. select {
  25. case <-ticker.C:
  26. Scheduling()
  27. }
  28. }
  29. }
  30. func Scheduling() {
  31. for room_id, start_time := range wait_room {
  32. room_info := gameConfig.RoomMap[room_id]
  33. if room_info == nil {
  34. RemoveWaitRoomList(room_id)
  35. } else {
  36. if room_info.RoomStatus != msg.RoomStatus_AWAIT {
  37. RemoveWaitRoomList(room_id)
  38. } else {
  39. cur_time := time.Now()
  40. // 计算整数秒(直接截断小数部分)
  41. seconds := int(cur_time.Sub(start_time).Seconds())
  42. fmt.Printf("Scheduling seconds %d:\n", seconds)
  43. if seconds > 5 { //5秒还没匹配完成就给玩家匹配机器人
  44. room_info.RoomStatus = msg.RoomStatus_START
  45. lack_num := 0
  46. if room_info.RoomType == msg.RoomType_SHUANG_REN {
  47. lack_num = 2 - len(room_info.Colors)
  48. } else {
  49. lack_num = 4 - len(room_info.Colors)
  50. }
  51. addRobotsToRoom(room_info, lack_num)
  52. }
  53. }
  54. }
  55. }
  56. }
  57. func RemoveColorByColor(temp []msg.RoleType, color msg.RoleType) []msg.RoleType {
  58. result := make([]msg.RoleType, 0, len(temp))
  59. for _, item := range temp {
  60. if item != color {
  61. result = append(result, item)
  62. }
  63. }
  64. return result
  65. }
  66. func getRoomLackColor(room_info *msg.RoomInfo) msg.RoleType {
  67. var select_color msg.RoleType
  68. if room_info.RoomType == msg.RoomType_SHUANG_REN {
  69. if room_info.Colors[0].MColor == msg.RoleType_BLUE {
  70. select_color = msg.RoleType_GREEN
  71. } else {
  72. select_color = msg.RoleType_BLUE
  73. }
  74. } else if room_info.RoomType == msg.RoomType_SIREN_REN {
  75. var temp []msg.RoleType = make([]msg.RoleType, 4)
  76. temp = append(temp, msg.RoleType_BLUE)
  77. temp = append(temp, msg.RoleType_GREEN)
  78. temp = append(temp, msg.RoleType_RED)
  79. temp = append(temp, msg.RoleType_YELLOW)
  80. for i := 0; i < len(room_info.Colors); i++ {
  81. color_data := room_info.Colors[i]
  82. temp = RemoveColorByColor(temp, color_data.MColor)
  83. }
  84. console.Log("temp:", temp)
  85. if len(temp) > 0 {
  86. select_color = temp[0]
  87. }
  88. }
  89. return select_color
  90. }
  91. func addRobotsToRoom(room_info *msg.RoomInfo, num int) {
  92. console.Log("addRobotsToRoom:", num)
  93. for i := 0; i < num; i++ {
  94. matchInfo := &msg.MatchLudo{
  95. RoomLevel: room_info.RoomLevel,
  96. SelectRoomType: room_info.RoomType,
  97. SelectColor: getRoomLackColor(room_info),
  98. }
  99. robot_user_id := fmt.Sprintf("robot_%d", i)
  100. fmt.Printf("matchInfo:%v\n", matchInfo)
  101. isFullPlayer, err_info := JoinRoom(room_info, matchInfo, robot_user_id)
  102. if err_info == nil {
  103. if isFullPlayer {
  104. start_room := startGame(room_info)
  105. fmt.Printf("%v:匹配成功开始游戏!", start_room)
  106. NotifyRoomPlayerMatch(start_room)
  107. }
  108. }
  109. }
  110. }
  111. func getNewRobotPlayer(userId string, room_id int32) (*msg.UserInfo, error) {
  112. robot_player := &msg.UserInfo{
  113. UserId: userId,
  114. MCoin: getRandomRobotCoin(),
  115. MHead: getRandomRobotHead(),
  116. Name: getRandomRobotName(),
  117. RoomId: room_id,
  118. }
  119. return robot_player, nil
  120. }