Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

112
Vistas
Evite múltiples movimientos en el juego de mesa multijugador socket.io

Estoy creando un juego de mesa multijugador por turnos con socket.io. Si un cliente se movió en el tablero, quiero deshabilitar el movimiento una vez más, pero no sé cómo lograrlo.

Cuando un cliente se mueve, envía el estado de la placa al servidor, luego el servidor envía el estado de la placa a cada cliente conectado. Incluso para el que hizo el movimiento.

Así es como envío el estado de la placa al servidor desde el lado del cliente:

 sock.emit("message", board, turn); // Sending the board state to the server canvas.removeEventListener("click", game);

Así es como el servidor obtiene el estado actualizado de la placa y lo envía a cada cliente:

 // If we recieve the board state from a client sock.on("message", (board, turn) => { io.emit("message", board, turn); // Sending the board state to every client who is connected });

Y así es como se maneja el código del cliente cuando obtiene un nuevo estado de placa del servidor:

 sock.on("message", (board, turn) => { this.board = board; this.turn = turn; render(board); canvas.addEventListener("click", game); setTimeout(function () { if (winningMove(board)) { // disable click event on both client // tell the server that the game ended sock.emit("end"); sock.on("end", () => { window.alert("Game Over..."); window.location.reload(); }); } }, 100); });
about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Puede usar el valor socket.id para identificar de forma única a cada cliente conectado (jugador/tablero en su caso) y agregar lógica en el lado del servidor para evitar múltiples movimientos del mismo cliente.

Opción 1

Realice un seguimiento del cliente que realizó el último movimiento e ignore cualquier movimiento nuevo del mismo cliente. La implementación se vería así:

 // Variable to track last played client let lastPlayedClient = null; // If we recieve the board state from a client sock.on("message", (board, turn) => { // Ensure move is made by different client if (lastPlayedClient !== sock.id) { // Update last played client to current client id lastPlayedClient = sock.id; io.emit("message", board, turn); // Sending the board state to every client who is connected } });

opcion 2

En el lado del servidor, agregue lógica para identificar al cliente que debe realizar el próximo movimiento. Luego permita que solo ese cliente haga el siguiente movimiento. Ignora los movimientos realizados por cualquier otro cliente. La implementación se vería así:

 // Variable to track client id of next player let nextPlayer = yourLogicToIdentifyNextPlayer(); // If we recieve the board state from a client sock.on("message", (board, turn) => { // Ensure move is made by the identified client only if (nextPlayer === sock.id) { io.emit("message", board, turn); // Sending the board state to every client who is connected } });

Para mejorar la experiencia del usuario, puede deshabilitar la entrada en el tablero en la interfaz tan pronto como se realice el primer movimiento.

Ref: Socket#id

about 4 years ago · Juan Pablo Isaza Denunciar

0

Si entendí su pregunta correctamente, desea enviar la señal de move a todos los clientes, excepto al cliente que realizó la solicitud (movimiento), ¿verdad?

luego use socket.broadcast.emit para eso

 // If we recieve the board state from a client sock.on("message", (board, turn) => { // io.emit("message", board, turn); // Sending the board state to every client who is connected socket.broadcast.emit("message", board, turn) // sends to every client except the client who made this request (socket.id). });
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda