Recientemente he estado trabajando en un sitio que puede unir a los jugadores y no puedo averiguar cuál sería la mejor manera de utilizar el algoritmo. A todos los jugadores que intentan jugar se les asigna un lobby único en el que se encuentran, pueden hacer cola solos o con otra persona. Por ejemplo, tenemos un juego 2 contra 2, 1 jugador ingresa a la cola jugando solo, luego 2 jugadores ingresan a la cola estando en el mismo lobby (estar en el mismo lobby significa que cuando obtengan un partido jugarán en el mismo equipo) entonces actualmente hay 1 jugador haciendo cola solo y 2 jugadores en un equipo, la cantidad total de jugadores necesarios para hacer una partida sería 4, por lo que aún no se encontraría una partida, luego otro jugador solo ingresa a la cola en este punto él debe emparejarse con el otro jugador en solitario y enfrentarse a los 2 jugadores en un equipo. Cada lobby también tiene parámetros, por ejemplo, modo de juego y región, y solo los jugadores con los mismos parámetros pueden enfrentarse entre sí. Hay al menos 3 regiones y 3 modos de juego, por ejemplo, 1 en 1, 2 en 2, 3 en 3, etc. Actualmente estoy colocando todos los lobbies que ingresan en la cola en una matriz
{ "size":2, }así es como se vería un lobby 2 contra 2 y puede haber miles de este tipo de lobbys en la matriz, todos buscando un juego. No estoy seguro de cómo haría un algoritmo que sea el más efectivo y dinámico y que coincida con todos los lobbies en la matriz, incluso si tienen diferentes parámetros.
No he llegado muy lejos con la codificación de esto.
} console.log(n) } }Estoy atascado en este punto y no tengo idea de cómo ir más allá o qué hacer, por ejemplo, para emparejar jugadores que juegan juntos contra jugadores que están separados. También estaba pensando si es mejor tener una matriz separada para cada región con un parámetro . Estoy usando Node.js para lograr esto.
Si mantuvo todos los vestíbulos en una matriz de objetos como su primer ejemplo de código, podría recorrer ese conjunto cada pocos segundos y procesar cada vestíbulo de esta manera:
Sin embargo, estoy de acuerdo: todas las respuestas a esta pregunta están inherentemente basadas en opiniones.
Algorítmicamente esto no suena muy desafiante. Esperaría que la variedad de vestíbulos sirviera como algo similar a una cola FIFO. Cuando se agrega un nuevo jugador, revisamos los lobbies en orden, agregando al jugador al primer lobby coincidente con un espacio disponible. Si ahora tenemos suficientes jugadores para comenzar el juego, creamos un nuevo juego y eliminamos el lobby. Podría verse algo como esto:
const onPlayerEnter = ({games, lobbies, ...rest}, player) => { let lobby = lobbies .find (playerFits (player)) if (lobby) { let updatedLobby = addPlayer (lobby, player) lobbies = replaceLobby (lobbies, lobby, updatedLobby) } else { lobby = createLobby (player) lobbies = addLobby (lobbies, lobby) } if (gameReady (lobby)) { games = games .concat (makeGame (lobby)) lobbies = removeLobby (lobbies, lobby) } return {games, lobbies, ...rest} } const playerFits = (player) => (lobby) => { // Your logic on whether this player matches the lobby requirments, return boolean // This would have to do with number of players, the mode, the region, maybe ratings ranges... } const addPlayer = (lobby, player) => { /* ... */ } const replaceLobby = (lobbies, oldLobby, newLobby) => { /* ... */ } const createLobby = (player) => { /* ... */ } const addLobby = (lobbies, lobby) => { /* ... */ } const gameReady = (lobby) => { /* ... */ } const makeGame = (lobby) => { /* ... */ } const removeLobby = (lobbies, lobby) => { /* ... */ }Esto tomaría un estado del sistema y un nuevo jugador y devolvería un estado del sistema actualizado, que tiene ese jugador agregado a un lobby existente o iniciando uno nuevo, y si el lobby está lleno, convirtiéndolo en un juego.
Sugeriría que su propiedad de mode debería ser más sofisticada que una simple cadena, tal vez algo como:
mode: { display: '2v2', teams: [ {minPlayers: 2, maxPlayers: 2}, {minPlayers: 2, maxPlayers: 2} ] }Esto sería fácilmente ampliable para permitir funciones adicionales.