From 3856db81efe0eb39277d289d00a104e54ab5cc8e Mon Sep 17 00:00:00 2001 From: alexis Date: Fri, 2 Oct 2026 10:40:01 +0200 Subject: [PATCH] Add sincronizacion de jugadores en partida --- clases/clasePartida.php | 54 +++++---- controladores/controladorJuego.php | 2 +- controladores/controladorPartida.php | 46 +++++++- js/juego.js | 101 +++++++++++++++-- js/sala.js | 157 +++++++++++++++++++-------- 5 files changed, 278 insertions(+), 82 deletions(-) diff --git a/clases/clasePartida.php b/clases/clasePartida.php index 57f1df0..aa52944 100644 --- a/clases/clasePartida.php +++ b/clases/clasePartida.php @@ -132,27 +132,43 @@ class Partida } - public function iniciarPartida(){ - $conexion = conexionBD(); - if (is_array($conexion)){ - return $conexion; - } - try { - $consulta = $conexion->prepare("UPDATE partida SET fechaInicio=NOW() WHERE idPartida=:idPartida AND fechaInicio IS NULL"); - $consulta->bindParam(":idPartida", $this->idPartida); - $consulta->execute(); - return [ - "exito" => "La partida ha comenzado.", - "exito_tecnico" => $this->idPartida - ]; - } catch (PDOException $error) { - return [ - "error" => "Ocurrió un error al iniciar la partida.", - 'error_tecnico' => $error->getMessage() - ]; - } +public function iniciarPartida() +{ + $conexion = conexionBD(); + + if (is_array($conexion)) { + return $conexion; } + try { + + $consulta = $conexion->prepare(" + UPDATE partida + SET fechaInicio = NOW() + WHERE idPartida = :idPartida + AND fechaInicio IS NULL + "); + + $consulta->bindParam( + ":idPartida", + $this->idPartida + ); + + $consulta->execute(); + + return [ + "exito" => "La partida ha comenzado.", + "exito_tecnico" => $this->idPartida + ]; + + } catch (PDOException $error) { + + return [ + "error" => "ERROR REAL: " . $error->getMessage() + ]; + } +} + public function finalizar(){ $conexion = conexionBD(); diff --git a/controladores/controladorJuego.php b/controladores/controladorJuego.php index 62d80e3..7c8e522 100644 --- a/controladores/controladorJuego.php +++ b/controladores/controladorJuego.php @@ -80,7 +80,7 @@ switch ($orden) { !isset($_POST['tiempoRespuesta']) ) { echo json_encode([ - 'error' => 'Faltan datos para registrar la respuesta.' + 'error' => 'Faltan datos para registrar la respuestfdfa.' ]); break; diff --git a/controladores/controladorPartida.php b/controladores/controladorPartida.php index 2ffb9b3..78707a2 100644 --- a/controladores/controladorPartida.php +++ b/controladores/controladorPartida.php @@ -164,7 +164,7 @@ switch ($_POST['orden']) { break; } - /* + /* * ========================================== * 3. INSERTAMOS LOS EQUIPOS CON SU PARTIDA EN EQUIPOXPARTIDA * ========================================== @@ -220,9 +220,9 @@ switch ($_POST['orden']) { * 5. ASIGNAMOS 10 PREGUNTAS ALEATORIAS A LA PARTIDA * ========================================== */ - + // Obtenemos todos los IDs de las preguntas - + $listaPreguntas = Pregunta::getTodosIds(); $totalPreguntas = count($listaPreguntas); @@ -246,7 +246,7 @@ switch ($_POST['orden']) { // Asignamos el ID real de la pregunta a la partida $partida->asignarPregunta($idPreguntaAleatoria); } - }//fin shile + } //fin shile /* @@ -795,13 +795,47 @@ switch ($_POST['orden']) { */ - $resultado = $partida->iniciar(); + $resultado = $partida->iniciarPartida(); echo json_encode($resultado); break; + case 'comprobarInicio': + + if (!isset($_POST['idPartida'])) { + + echo json_encode([ + 'error' => 'No se ha indicado la partida.' + ]); + + break; + } + + $partida = new Partida(); + + $partida->idPartida = + intval($_POST['idPartida']); + + $datosPartida = $partida->buscar(); + + if (!$datosPartida || isset($datosPartida['error'])) { + + echo json_encode([ + 'error' => 'La partida no existe.' + ]); + + break; + } + + echo json_encode([ + 'iniciada' => $datosPartida['fechaInicio'] !== null + ]); + + break; + + // OBTENER LA PREGUNTA ACTUAL @@ -933,7 +967,7 @@ switch ($_POST['orden']) { ) { echo json_encode([ - 'error' => 'Faltan datos para registrar la respuesta.' + 'error' => 'Faltan datos para registrar la respuestadd.' ]); break; diff --git a/js/juego.js b/js/juego.js index b8f2698..8424668 100644 --- a/js/juego.js +++ b/js/juego.js @@ -118,7 +118,12 @@ function mostrarPregunta() { // 3. El usuario pulsa una respuesta: se guarda y se enseña si ha acertado function responder($botonPulsado) { clearInterval(intervaloTiempo); - console.log("Tiempo de respuesta: " + tiempoRespuesta / 10 + " segundos"); + + console.log( + "Tiempo de respuesta: " + + tiempoRespuesta / 10 + + " segundos" + ); if (bloqueado) { return; @@ -127,7 +132,29 @@ function responder($botonPulsado) { bloqueado = true; const pregunta = preguntas[indice]; - const idRespuesta = parseInt($botonPulsado.attr("data-id-respuesta"), 10); + + const idRespuesta = parseInt( + $botonPulsado.attr("data-id-respuesta"), + 10 + ); + + console.log("PREGUNTA ACTUAL:", pregunta); + console.log( + "idPartidaxPregunta:", + pregunta.idPartidaxPregunta + ); + console.log( + "idRespuesta:", + idRespuesta + ); + console.log( + "tiempoRespuesta:", + tiempoRespuesta + ); + console.log( + "idPartida:", + idPartida + ); $("#respuestas").addClass("bloqueado"); @@ -135,46 +162,96 @@ function responder($botonPulsado) { url: URL_CONTROLADOR, type: "POST", dataType: "json", + data: { orden: "responder", idPartida: idPartida, idPartidaxPregunta: pregunta.idPartidaxPregunta, - idRespuesta: idRespuesta, - tiempoRespuesta: tiempoRespuesta, + idRespuesta: idRespuesta, + tiempoRespuesta: tiempoRespuesta }, + success: function (datos) { + + console.log("RESPUESTA DEL SERVIDOR:", datos); + if (datos.error) { - // No se guardó: dejamos que vuelva a intentarlo - $("#feedback").text(datos.error).removeClass("ok").addClass("ko"); + + $("#feedback") + .text(datos.error) + .removeClass("ok") + .addClass("ko"); + $("#respuestas").removeClass("bloqueado"); + bloqueado = false; + return; } pregunta.respondida = true; - mostrarFeedback($botonPulsado, datos); + + mostrarFeedback( + $botonPulsado, + datos + ); setTimeout(function () { - if (datos.terminada || indice >= preguntas.length - 1) { + + if ( + datos.terminada || + indice >= preguntas.length - 1 + ) { terminar(); } else { + indice++; - $("#respuestas").removeClass("bloqueado"); + + $("#respuestas") + .removeClass("bloqueado"); + mostrarPregunta(); } + }, PAUSA_FEEDBACK); }, - error: function () { + + error: function (xhr, status, error) { + + console.error( + "ERROR AJAX RESPONDER" + ); + + console.error( + "HTTP:", + xhr.status + ); + + console.error( + "ERROR:", + error + ); + + console.error( + "RESPUESTA:", + xhr.responseText + ); + $("#feedback") - .text("No se pudo guardar la respuesta. Inténtalo de nuevo.") + .text( + "No se pudo guardar la respuesta. Inténtalo de nuevo." + ) .removeClass("ok") .addClass("ko"); + $("#respuestas").removeClass("bloqueado"); + bloqueado = false; - }, + } }); } + // Marca la respuesta correcta en verde y atenúa el resto function mostrarFeedback($botonPulsado, datos) { $("#respuestas .btn-answer").each(function () { diff --git a/js/sala.js b/js/sala.js index 42c0d8f..2345fb7 100644 --- a/js/sala.js +++ b/js/sala.js @@ -263,15 +263,16 @@ function mostrarSala(partida, equipos, jugadores) { if (esHost) { botonIniciarHTML = ` - + + `; } const salaHTML = ` @@ -313,8 +314,98 @@ function mostrarSala(partida, equipos, jugadores) { `; contenedor.html(salaHTML); + if (!partida.fechaInicio) { + iniciarComprobacionPartida(partida.idPartida); + } } +let intervaloComprobarPartida = null; + +function iniciarComprobacionPartida(idPartida) { + if (intervaloComprobarPartida) { + clearInterval(intervaloComprobarPartida); + } + + intervaloComprobarPartida = setInterval(function () { + $.ajax({ + url: "controladores/controladorPartida.php", + + type: "POST", + + dataType: "json", + + data: { + orden: "comprobarInicio", + idPartida: idPartida, + }, + + success: function (respuesta) { + if (respuesta.iniciada) { + clearInterval(intervaloComprobarPartida); + + window.location.href = "juego.php?idPartida=" + idPartida; + } + }, + }); + }, 1000); +} + +$(document).on("click", ".btn-iniciar-partida", function () { + const boton = $(this); + + const idPartida = boton.data("id-partida"); + + boton.prop("disabled", true); + + boton.html(` + + Iniciando... + `); + + $.ajax({ + url: "controladores/controladorPartida.php", + + type: "POST", + + dataType: "json", + + data: { + orden: "iniciar", + + idPartida: idPartida, + }, + + success: function (respuesta) { + if (respuesta.error) { + alert(respuesta.error); + + boton.prop("disabled", false); + + boton.html(` + + ¡Iniciar Partida! + `); + + return; + } + + // El host entra directamente + window.location.href = "juego.php?idPartida=" + idPartida; + }, + + error: function () { + alert("Ocurrió un error al iniciar la partida."); + + boton.prop("disabled", false); + + boton.html(` + + ¡Iniciar Partida! + `); + }, + }); +}); + $(document).on("click", ".btn-unirse-equipo", function () { const boton = $(this); @@ -364,8 +455,7 @@ $(document).on("click", ".btn-abandonar-sala", function () { botonAbandonarReferencia = $(this); const esHost = - $(this).data("es-host") === true || - $(this).data("es-host") === "true"; + $(this).data("es-host") === true || $(this).data("es-host") === "true"; const titulo = $("#modalAbandonarSalaLabel"); @@ -384,9 +474,7 @@ $(document).on("click", ".btn-abandonar-sala", function () { } else { titulo.text("¿Abandonar la sala?"); - mensaje.text( - "Si sales de la sala, perderás tu lugar en el equipo.", - ); + mensaje.text("Si sales de la sala, perderás tu lugar en el equipo."); botonConfirmar.text("Sí, salir"); } @@ -399,17 +487,13 @@ $(document).on("click", ".btn-abandonar-sala", function () { }); $(document).on("click", "#btnConfirmarAbandonar", function () { - const modalEl = - document.getElementById("modalAbandonarSala"); + const modalEl = document.getElementById("modalAbandonarSala"); - const modalInstance = - bootstrap.Modal.getInstance(modalEl); + const modalInstance = bootstrap.Modal.getInstance(modalEl); const btnConfirmar = $(this); - btnConfirmar - .prop("disabled", true) - .text("Saliendo..."); + btnConfirmar.prop("disabled", true).text("Saliendo..."); $.ajax({ url: "controladores/controladorEquipoxUsuario.php", @@ -421,9 +505,7 @@ $(document).on("click", "#btnConfirmarAbandonar", function () { }, success: function (respuesta) { - btnConfirmar - .prop("disabled", false) - .text("Sí, salir"); + btnConfirmar.prop("disabled", false).text("Sí, salir"); if (modalInstance) { modalInstance.hide(); @@ -449,16 +531,11 @@ $(document).on("click", "#btnConfirmarAbandonar", function () { }, error: function (xhr, status, error) { - console.error( - "Error al salir de la sala:", - error - ); + console.error("Error al salir de la sala:", error); alert("No se pudo salir de la sala."); - btnConfirmar - .prop("disabled", false) - .text("Sí, salir"); + btnConfirmar.prop("disabled", false).text("Sí, salir"); if (modalInstance) { modalInstance.hide(); @@ -473,25 +550,19 @@ function escapeHTML(texto) { .html(); } -function mostrarEquipos( - partida, - equipos, - jugadores -) { +function mostrarEquipos(partida, equipos, jugadores) { let equiposHTML = ""; equipos.forEach(function (equipo) { - const jugadoresEquipo = - jugadores.filter(function (jugador) { - return jugador.idEquipo == equipo.idEquipo; - }); + const jugadoresEquipo = jugadores.filter(function (jugador) { + return jugador.idEquipo == equipo.idEquipo; + }); let jugadoresHTML = ""; if (jugadoresEquipo.length > 0) { jugadoresEquipo.forEach(function (jugador) { - const esHost = - jugador.idUsuario == partida.idUsuario; + const esHost = jugador.idUsuario == partida.idUsuario; jugadoresHTML += `