private void enter(UserToken token) { token.instanceID = 0; int userId = getUserId(token); Console.WriteLine("用户开始匹配" + userId); //判断玩家当前是否正在匹配队列中 if (!userRoom.ContainsKey(userId)) { MatchRoom room = null; bool isenter = false; //当前是否有等待中的房间 if (roomMap.Count > 0) { //遍历当前所有等待中的房间 foreach (MatchRoom item in roomMap.Values) { //如果没满员 if (item.teamMax > item.team.Count) { room = item; room.team.Add(userId); //添加玩家与房间的映射关系 isenter = true; userRoom.TryAdd(userId, room.id); break; } } if (!isenter) { //走到这里 说明等待中的房间全部满员了 if (cache.Count > 0) { cache.TryPop(out room); room.team.Add(userId); roomMap.TryAdd(room.id, room); userRoom.TryAdd(userId, room.id); } else { room = new MatchRoom(); room.id = index.GetAndAdd(); room.team.Add(userId); roomMap.TryAdd(room.id, room); userRoom.TryAdd(userId, room.id); } } } else { //没有等待中的房间 //直接从缓存列表中找出可用房间 或者创建新房间 if (cache.Count > 0) { cache.TryPop(out room); room.team.Add(userId); roomMap.TryAdd(room.id, room); userRoom.TryAdd(userId, room.id); } else { room = new MatchRoom(); room.id = index.GetAndAdd(); room.team.Add(userId); roomMap.TryAdd(room.id, room); userRoom.TryAdd(userId, room.id); } } //不管什么方式进入房间 ,判断房间是否满员,满了就开始选人并将当前房间丢进缓存队列 if (room.team.Count == room.teamMax) { // 这里通知选人模块 开始选人了 EventUtil.createSelect(room.team); writeToUsers(room.team.ToArray(), GetType(), 0, MatchProtocol.ENTER_SELECT_BRO, null); //移除玩家与房间映射 foreach (int item in room.team) { int i; userRoom.TryRemove(item, out i); } //重置房间数据 供下次使用 room.team.Clear(); //将房间从等待房间表中移除 roomMap.TryRemove(room.id, out room); //将房间丢进缓存表 供下次使用 cache.Push(room); } } }