ludo_room_data.go 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. package ludo
  2. import (
  3. "fmt"
  4. "server/msg"
  5. "strings"
  6. "github.com/name5566/leaf/log"
  7. )
  8. // 添加完成的玩家
  9. func (room_info *RoomInfoWrapper) addFinishColor(color msg.RoleType) {
  10. color_data := room_info.getColorDataByColor(color)
  11. color_data.IsFinish = true
  12. room_info.FinishColors = append(room_info.FinishColors, color_data)
  13. }
  14. // 根据颜色获取阵容数据
  15. func (room_info *RoomInfoWrapper) getColorDataByColor(color msg.RoleType) *msg.ColorData {
  16. for i := 0; i < len(room_info.Colors); i++ {
  17. element := room_info.Colors[i]
  18. if element.MColor == color {
  19. return element
  20. }
  21. }
  22. return nil
  23. }
  24. // 获取完成的阵营
  25. func (room_info *RoomInfoWrapper) getFinishColors() []*msg.ColorData {
  26. return room_info.FinishColors
  27. }
  28. // 获取没有被踢出去的玩家
  29. func (room_info *RoomInfoWrapper) getNotKickColors() []*msg.ColorData {
  30. temp := make([]*msg.ColorData, 0, 4)
  31. for i := 0; i < len(room_info.Colors); i++ {
  32. element := room_info.Colors[i]
  33. if !element.IsKick {
  34. temp = append(temp, element)
  35. break
  36. }
  37. }
  38. return temp
  39. }
  40. // 获取被踢出去的玩家
  41. func (room_info *RoomInfoWrapper) getKickColors() []*msg.ColorData {
  42. temp := make([]*msg.ColorData, 0, 3)
  43. for i := 0; i < len(room_info.Colors); i++ {
  44. element := room_info.Colors[i]
  45. if element.IsKick {
  46. temp = append(temp, element)
  47. break
  48. }
  49. }
  50. return temp
  51. }
  52. // 更新角色位置
  53. func (room_info *RoomInfoWrapper) updateRoleStep(role_id string, step int32) {
  54. role_data := room_info.getRoleDataById(role_id)
  55. role_data.OldSetp = role_data.Step
  56. role_data.Step = step
  57. }
  58. // 是否结束游戏
  59. func (room_info *RoomInfoWrapper) IsOverGame() bool {
  60. colors := room_info.Colors
  61. if len(room_info.getNotKickColors()) == 1 { //说明就剩下一个人了
  62. return true
  63. }
  64. count := 0
  65. for i := 0; i < len(colors); i++ {
  66. element := colors[i]
  67. if element.IsFinish || element.IsKick {
  68. count++
  69. }
  70. }
  71. return count == len(colors)
  72. }
  73. func (room_info *RoomInfoWrapper) getColors() []*msg.ColorData {
  74. return room_info.Colors
  75. }
  76. // 开始下个玩家的回合
  77. func (room_info *RoomInfoWrapper) setNextPlayerRound() {
  78. room_info.CurRoundColor = room_info.findNextColor()
  79. fmt.Printf("setNextPlayerRound = %d\n", room_info.CurRoundColor)
  80. if room_info.CurRoundColor == msg.RoleType_ROLE_TYPE_UNKNOWN {
  81. log.Error("setNextPlayerRound error")
  82. }
  83. room_info.notify_update_room_info()
  84. }
  85. // 找到下一个没有完成的玩家
  86. func (room_info *RoomInfoWrapper) findNextColor() msg.RoleType {
  87. cur := room_info.CurRoundColor
  88. colors := room_info.getColors()
  89. if room_info.RoomType == msg.RoomType_SHUANG_REN {
  90. i := roleIndexOf(colors, room_info.getColorDataByColor(cur))
  91. if i == (len(colors) - 1) {
  92. i = 0
  93. } else {
  94. i = (i + 1)
  95. }
  96. for index := i; index < len(colors); index++ {
  97. element := colors[index]
  98. if !element.IsFinish && !element.IsKick {
  99. return element.MColor
  100. }
  101. }
  102. for index := 0; index < i; index++ {
  103. element := colors[index]
  104. if !element.IsFinish && !element.IsKick {
  105. return element.MColor
  106. }
  107. }
  108. } else if room_info.RoomType == msg.RoomType_SIREN_REN {
  109. return room_info.getNextColor()
  110. }
  111. return msg.RoleType_ROLE_TYPE_UNKNOWN
  112. }
  113. func (room_info *RoomInfoWrapper) getNextColor() msg.RoleType {
  114. cur := room_info.CurRoundColor
  115. next_color := GetNextRole(cur)
  116. nex_color_data := room_info.getColorDataByColor(next_color)
  117. if nex_color_data.IsFinish || nex_color_data.IsKick {
  118. return room_info.getNextColor()
  119. }
  120. return next_color
  121. }
  122. // 当前玩家是否是机器人
  123. func (room_info *RoomInfoWrapper) containsRobot(color msg.RoleType) bool {
  124. color_data := room_info.getColorDataByColor(color)
  125. return strings.Contains(color_data.MId, "robot")
  126. }
  127. // 获取一个颜色的玩家有多少个*不在家*的角色
  128. func (room_info *RoomInfoWrapper) getRoleNotAtHomeByColor(color msg.RoleType) []*msg.RoleData {
  129. temp := make([]*msg.RoleData, 0, 4)
  130. roles := room_info.Roles
  131. for i := range roles {
  132. element := roles[i]
  133. if element.MColor == color && element.Step != 0 {
  134. temp = append(temp, element)
  135. }
  136. }
  137. return temp
  138. }
  139. // 根据操作获取最后一个操作回合数据
  140. func (room_info *RoomInfoWrapper) getLastRoundByOpt(opt msg.OptType) *msg.Round {
  141. length := len(room_info.Rounds)
  142. for i := (length - 1); i >= 0; i-- {
  143. element := room_info.Rounds[i]
  144. if opt == element.Opt {
  145. return element
  146. }
  147. }
  148. return nil
  149. }
  150. // 获取地图位置
  151. func (room_info *RoomInfoWrapper) getMapPosByColorAndStep(color msg.RoleType, step int32) string {
  152. if color == msg.RoleType_RED {
  153. return redRoad[step]
  154. } else if color == msg.RoleType_GREEN {
  155. return greenRoad[step]
  156. } else if color == msg.RoleType_BLUE {
  157. return blueRoad[step]
  158. } else if color == msg.RoleType_YELLOW {
  159. return yellowRoad[step]
  160. }
  161. return ""
  162. }
  163. // 获取目标路上所有角色
  164. func (room_info *RoomInfoWrapper) getRoadRoles(key1 string) []*msg.RoleData {
  165. temp := make([]*msg.RoleData, 0, 10) // 初始长度 0,容量 10
  166. for i := 0; i < len(room_info.Roles); i++ {
  167. element := room_info.Roles[i]
  168. role_road_key := room_info.getMapPosByColorAndStep(element.MColor, element.Step)
  169. if key1 == role_road_key {
  170. temp = append(temp, element)
  171. }
  172. }
  173. return temp
  174. }
  175. // 是否是无敌的点
  176. func (room_info *RoomInfoWrapper) isWuDiRoad(key1 string) bool {
  177. list := gameRule.WU_DI_ROAD
  178. for i := 0; i < len(list); i++ {
  179. element := list[i]
  180. if key1 == element {
  181. return true
  182. }
  183. }
  184. return false
  185. }
  186. // 判断目标非自己阵营的角色
  187. func (room_info *RoomInfoWrapper) getRolesByColorRoles(color msg.RoleType, roles []*msg.RoleData) []*msg.RoleData {
  188. temp := make([]*msg.RoleData, 0, 10) // 初始长度 0,容量 10
  189. for i := range roles {
  190. element := roles[i]
  191. if element.MColor != color {
  192. temp = append(temp, element)
  193. }
  194. }
  195. return temp
  196. }
  197. // 将一批角色踢回家
  198. func (room_info *RoomInfoWrapper) kickRolesBackHome(roles []*msg.RoleData) {
  199. for i := range roles {
  200. role_data := roles[i]
  201. role_data.Step = 0
  202. }
  203. }
  204. // 移动的目标是否是终点
  205. func (room_info *RoomInfoWrapper) moveTargetIsEnd(color msg.RoleType, key1 string) bool {
  206. if color == msg.RoleType_BLUE {
  207. return key1 == "blue_des"
  208. } else if color == msg.RoleType_YELLOW {
  209. return key1 == "yellow_des"
  210. } else if color == msg.RoleType_GREEN {
  211. return key1 == "green_des"
  212. } else if color == msg.RoleType_RED {
  213. return key1 == "red_des"
  214. }
  215. return false
  216. }
  217. // 根据颜色获取有多少个完成竞赛的角色
  218. func (room_info *RoomInfoWrapper) getFinishRolesByColor(color msg.RoleType) []*msg.RoleData {
  219. temp := make([]*msg.RoleData, 0, 10)
  220. if color == msg.RoleType_BLUE {
  221. temp = room_info.getRoadRoles("blue_des")
  222. } else if color == msg.RoleType_YELLOW {
  223. temp = room_info.getRoadRoles("yellow_des")
  224. } else if color == msg.RoleType_GREEN {
  225. temp = room_info.getRoadRoles("green_des")
  226. } else if color == msg.RoleType_RED {
  227. temp = room_info.getRoadRoles("red_des")
  228. }
  229. return temp
  230. }
  231. // 根据颜色获取对应颜色的所有角色
  232. func (room_info *RoomInfoWrapper) getRoleDataByColor(color msg.RoleType) []*msg.RoleData {
  233. list := make([]*msg.RoleData, 0, 4) // 初始长度 0,容量 10
  234. for _, v := range room_info.Roles {
  235. if v.MColor == color {
  236. list = append(list, v)
  237. }
  238. }
  239. return list
  240. }
  241. // 根据id获取角色
  242. func (room_info *RoomInfoWrapper) getRoleDataById(role_id string) *msg.RoleData {
  243. for i := 0; i < len(room_info.Roles); i++ {
  244. element := room_info.Roles[i]
  245. if element.MId == role_id {
  246. return element
  247. }
  248. }
  249. return nil
  250. }
  251. // 记录每个回合
  252. func (room_info *RoomInfoWrapper) addRound(rd *msg.Round) {
  253. room_info.Rounds = append(room_info.Rounds, rd)
  254. }
  255. // 根据骰子数获取角色列表
  256. func (room_info *RoomInfoWrapper) getRolesBySzNumber(color msg.RoleType, szNumber int32) []*msg.RoleData {
  257. temp := make([]*msg.RoleData, 0, 4) // 初始长度 0,容量 10
  258. list := room_info.getRoleDataByColor(color)
  259. for i := 0; i < len(list); i++ {
  260. element := list[i]
  261. des_step := element.Step + szNumber
  262. if des_step < gameRule.MAX_STEP {
  263. temp = append(temp, element)
  264. }
  265. }
  266. return temp
  267. }
  268. // 根据筛子数判定角色是否可以移动
  269. func (room_info *RoomInfoWrapper) roleIsCanMove(role_id string, szNumber int32) bool {
  270. role_data := room_info.getRoleDataById(role_id)
  271. des_step := role_data.MSeat + szNumber
  272. return des_step <= gameRule.MAX_STEP
  273. }
  274. // 获取可以移动的玩家
  275. func (room_info *RoomInfoWrapper) getCanMoveRoles(roles []*msg.RoleData, szNumber int32) []*msg.RoleData {
  276. temp := make([]*msg.RoleData, 0, 4)
  277. for i := 0; i < len(roles); i++ {
  278. element := roles[i]
  279. if room_info.roleIsCanMove(element.MId, szNumber) {
  280. temp = append(temp, element)
  281. }
  282. }
  283. return temp
  284. }
  285. // 设置当前玩家操作类型
  286. func (room_info *RoomInfoWrapper) setCurColorOpt(opt *msg.NotifyPlayerOpt) {
  287. room_info.CurColorOptData = opt
  288. }
  289. // 将玩家踢出房间
  290. func (room_info *RoomInfoWrapper) kickColor(color msg.RoleType) {
  291. color_data := room_info.getColorDataByColor(color)
  292. color_data.IsKick = true
  293. }
  294. // 获取房间倒计时的key
  295. func (room_info *RoomInfoWrapper) GetRoomTimeOutKey() string {
  296. return fmt.Sprintf("%d_TimeOut", room_info.Id)
  297. }
  298. // 获取房间ID
  299. func (room_info *RoomInfoWrapper) GetRoomId() int32 {
  300. return room_info.Id
  301. }