예제 #1
0
 /// <summary>
 /// 将用户添加到创建好的房间内
 /// </summary>
 /// <param name="userId"></param>
 /// <param name="room"></param>
 private void AddUserToRoom(int userId, MatchRoom room)
 {
     room.TeamOne.Add(userId);
     roomMap.TryAdd(room.Id, room);
     userRoom.TryAdd(userId, room.Id);
 }
예제 #2
0
 /// <summary>
 /// 将用户添加到创建好的房间内
 /// </summary>
 /// <param name="userId"></param>
 /// <param name="room"></param>
 private void AddUserToRoom(int userId, MatchRoom room)
 {
     room.TeamOne.Add(userId);
     roomMap.TryAdd(room.Id, room);
     userRoom.TryAdd(userId, room.Id);
 }
예제 #3
0
 /// <summary>
 /// 创建房间从缓存数据中
 /// </summary>
 /// <param name="userId"></param>
 /// <param name="room"></param>
 private void CreateRoomFromCache(int userId, out MatchRoom room)
 {
     if (cacheRooms.Count > 0)
     {
         cacheRooms.TryPop(out room);
         AddUserToRoom(userId, room);
     }
     else
     {
         room = new MatchRoom();
         room.Id = AddIndex;
         AddUserToRoom(userId, room);
     }
 }
예제 #4
0
        private void Enter(UserToken token)
        {
            int userId = GetUserId(token);

            //判断是否正在匹配的房间中
            if (!userRoom.ContainsKey(userId))
            {
                MatchRoom room    = null;
                bool      isEnter = false;
                //当前是否有在等待中的房间
                if (roomMap.Count > 0)
                {
                    //遍历所有等待中的房间
                    foreach (MatchRoom item in roomMap.Values)
                    {
                        //如果没满员
                        if (item.TeamMax * 2 > item.TeamOne.Count + item.TeamTwo.Count)
                        {
                            room = item;
                            //如果队伍一没满员则进入队伍1
                            if (room.TeamOne.Count < room.TeamMax)
                            {
                                room.TeamOne.Add(userId);
                            }
                            else
                            {
                                room.TeamTwo.Add(userId);
                            }
                            //添加玩家与房间的映射关系
                            isEnter = true;
                            userRoom.TryAdd(userId, room.Id);
                            break;
                        }
                    }
                    //当所有房间全部满员 判断缓存中是否有房间
                    if (!isEnter)
                    {
                        CreateRoomFromCache(userId, out room);
                    }
                }
                else
                {
                    //没有等待中的房间
                    CreateRoomFromCache(userId, out room);
                }

                //不管什么方式进入房间,判断房间是否满员,满了就开始选人,将房间丢进缓存队列
                if (room.TeamOne.Count == room.TeamTwo.Count && room.TeamOne.Count == room.TeamMax)
                {
                    //通知选人模块开始选人
                    EventUtil.createSelect(room.TeamOne, room.TeamTwo);

                    WriteToUsers(room.TeamOne.ToArray(), GetType(), 0, MatchProtocol.ENTER_DELECT_BRO, null);
                    WriteToUsers(room.TeamTwo.ToArray(), GetType(), 0, MatchProtocol.ENTER_DELECT_BRO, null);

                    //移除玩家映射
                    foreach (int item in room.TeamOne)
                    {
                        int i;
                        userRoom.TryRemove(item, out i);
                    }
                    foreach (int item in room.TeamTwo)
                    {
                        int i;
                        userRoom.TryRemove(item, out i);
                    }
                    //重置房间数据
                    room.TeamOne.Clear();
                    room.TeamTwo.Clear();
                    //将房间从等待房间中移除
                    roomMap.TryRemove(room.Id, out room);
                    //加入缓存
                    cacheRooms.Push(room);
                }
            }
        }