Files
zp2/backend/src/main/java/com/zombie/game/server/RoomManager.java
2026-07-26 14:41:36 +08:00

104 lines
3.4 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.zombie.game.server;
import com.zombie.game.model.PlayerInfo;
import com.zombie.game.model.Room;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* Room manager for tracking game rooms and player-room assignments / 房间管理器,用于追踪游戏房间和玩家房间分配
*/
public class RoomManager {
// All active rooms mapped by room ID / 所有活跃房间以房间ID映射
private final Map<String, Room> rooms = new ConcurrentHashMap<>();
// Player ID to room ID mapping / 玩家ID到房间ID的映射
private final Map<String, String> playerToRoom = new ConcurrentHashMap<>();
// Add a new room to the manager / 向管理器添加新房间
public void addRoom(String roomId, Room room) {
rooms.put(roomId, room);
// Map existing players in room to room ID / 将房间中现有玩家映射到房间ID
for (PlayerInfo player : room.getPlayers()) {
playerToRoom.put(player.getId(), roomId);
}
}
// Add a player to a room / 将玩家添加到房间
public boolean joinRoom(String roomId, String playerId, String playerName) {
Room room = rooms.get(roomId);
if (room == null) return false;
// Reject if room is full / 房间已满则拒绝
if (room.getPlayerCount() >= 4) return false;
boolean added = room.addPlayer(playerId, playerName);
if (added) {
playerToRoom.put(playerId, roomId);
}
return added;
}
// Remove a player from their room / 从房间中移除玩家
public Room leaveRoom(String playerId) {
String roomId = playerToRoom.remove(playerId);
if (roomId == null) return null;
Room room = rooms.get(roomId);
if (room == null) return null;
room.removePlayer(playerId);
// Delete room if empty / 如果房间为空则删除
if (room.getPlayerCount() == 0) {
rooms.remove(roomId);
return null;
}
return room;
}
// Get room by player ID / 通过玩家ID获取房间
public Room getRoomByPlayerId(String playerId) {
String roomId = playerToRoom.get(playerId);
if (roomId == null) return null;
return rooms.get(roomId);
}
// Get room by room ID / 通过房间ID获取房间
public Room getRoom(String roomId) {
return rooms.get(roomId);
}
// Get all rooms / 获取所有房间
public Collection<Room> getAllRooms() {
return rooms.values();
}
// Get rooms that haven't started a game yet / 获取尚未开始游戏的房间
public List<Room> getAvailableRooms() {
List<Room> available = new ArrayList<>();
for (Room room : rooms.values()) {
if (!room.isGameStarted()) {
available.add(room);
}
}
return available;
}
// Remove a room and all player mappings / 移除房间及其所有玩家映射
public void removeRoom(String roomId) {
Room room = rooms.remove(roomId);
if (room != null) {
for (PlayerInfo player : room.getPlayers()) {
playerToRoom.remove(player.getId());
}
}
}
// Check if a player is in any room / 检查玩家是否在任意房间中
public boolean isPlayerInRoom(String playerId) {
return playerToRoom.containsKey(playerId);
}
}