diff --git a/clases/ClaseJuego.php b/clases/ClaseJuego.php index 2a3834f..c071528 100644 --- a/clases/ClaseJuego.php +++ b/clases/ClaseJuego.php @@ -1,9 +1,9 @@ 'Sesión no iniciada']); - exit; -} - -$idPartida = intval($_POST['idPartida'] ?? 0); -$orden = $_POST['orden'] ?? ''; - -if ($idPartida <= 0) { - echo json_encode(['error' => 'Partida no válida']); - exit; -} - -$conexion = conexionBD(); -if (is_array($conexion)) { - echo json_encode($conexion); - exit; -} - -switch ($orden) { - case 'comprobarEstado': - try { - // Contar jugadores totales apuntados en los equipos de esta partida - $stmt = $conexion->prepare(" - SELECT COUNT(exu.idUsuario) AS total_jugadores - FROM equipoxpartida exp - INNER JOIN equipoxusuario exu ON exp.idEquipo = exu.idEquipo - WHERE exp.idPartida = :idPartida - "); - $stmt->execute([':idPartida' => $idPartida]); - $totalJugadores = (int)$stmt->fetchColumn(); - - $preguntasTotalesEsperadas = $totalJugadores * 10; - - // Contar respuestas dadas en la partida - $stmtRespuestas = $conexion->prepare(" - SELECT COUNT(*) - FROM respuestaalmacenada ra - INNER JOIN partidaxpregunta pxp ON ra.idPartidaxPregunta = pxp.idPartidaxPregunta - WHERE pxp.idPartida = :idPartida - "); - $stmtRespuestas->execute([':idPartida' => $idPartida]); - $respuestasRespondidas = (int)$stmtRespuestas->fetchColumn(); - - $terminada = ($respuestasRespondidas >= $preguntasTotalesEsperadas && $preguntasTotalesEsperadas > 0); - - // Cuando la partida finaliza, se actualizan los históricos - if ($terminada && !isset($_SESSION['partidas_procesadas'][$idPartida])) { - - $conexion->beginTransaction(); - - // CÁLCULO DE VELOCIDAD PREGUNTA A PREGUNTA EN SESIÓN - if (!isset($_SESSION['primeros_en_acertar'][$idPartida])) { - $_SESSION['primeros_en_acertar'][$idPartida] = []; - } - - // Vemos quién fue el primero - $stmtVelocidad = $conexion->prepare(" - SELECT ra.idPartidaxPregunta, ra.idUsuario - FROM respuestaalmacenada ra - INNER JOIN respuesta r ON ra.idRespuesta = r.idRespuesta - INNER JOIN partidaxpregunta pxp ON ra.idPartidaxPregunta = pxp.idPartidaxPregunta - WHERE pxp.idPartida = :idPartida AND r.correcta = 1 - ORDER BY ra.idRespuestaAlmacenada ASC - "); - $stmtVelocidad->execute([':idPartida' => $idPartida]); - $todosLosAciertos = $stmtVelocidad->fetchAll(PDO::FETCH_ASSOC); - - foreach ($todosLosAciertos as $acierto) { - $idPxp = $acierto['idPartidaxPregunta']; - $idU = $acierto['idUsuario']; - - if (!isset($_SESSION['primeros_en_acertar'][$idPartida][$idPxp])) { - $_SESSION['primeros_en_acertar'][$idPartida][$idPxp] = $idU; - } - } - - // Actualizamos la base de datos - // Buscamos los aciertos de cada jugador en la partida actual - $stmtAciertos = $conexion->prepare(" - SELECT ra.idUsuario, exu.idEquipo, COUNT(*) as aciertos_partida - FROM respuestaalmacenada ra - INNER JOIN partidaxpregunta pxp ON ra.idPartidaxPregunta = pxp.idPartidaxPregunta - INNER JOIN respuesta r ON ra.idRespuesta = r.idRespuesta - INNER JOIN equipoxusuario exu ON ra.idUsuario = exu.idUsuario - WHERE pxp.idPartida = :idPartida AND r.correcta = 1 - GROUP BY ra.idUsuario - "); - $stmtAciertos->execute([':idPartida' => $idPartida]); - $jugadoresPartida = $stmtAciertos->fetchAll(PDO::FETCH_ASSOC); - - $updateAciertosGlobales = $conexion->prepare(" - UPDATE usuario - SET aciertos = aciertos + :nuevos_aciertos - WHERE idUsuario = :idUsuario - "); - - $puntosEquipos = []; - foreach ($jugadoresPartida as $jp) { - $idU = (int)$jp['idUsuario']; - $idE = (int)$jp['idEquipo']; - $nuevosAciertos = (int)$jp['aciertos_partida']; - - // Sumamos los aciertos al perfil del usuario - $updateAciertos->execute([ - ':nuevos_aciertos' => $nuevosAciertos, - ':idUsuario' => $idU - ]); - - if (!isset($puntosEquipos[$idE])) { - $puntosEquipos[$idE] = 0; - } - $puntosEquipos[$idE] += $nuevosAciertos; - } - - // Determinamos qué equipo ha obtenido más aciertos en la partida - arsort($puntosEquipos); - $idEquipoGanador = key($puntosEquipos); - - // Obtenemos todos los usuarios de la partida para asignar victorias/derrotas - $stmtMiembros = $conexion->prepare(" - SELECT exu.idUsuario, exu.idEquipo - FROM equipoxpartida exp - INNER JOIN equipoxusuario exu ON exp.idEquipo = exu.idEquipo - WHERE exp.idPartida = :idPartida - "); - $stmtMiembros->execute([':idPartida' => $idPartida]); - $todosLosMiembros = $stmtMiembros->fetchAll(PDO::FETCH_ASSOC); - - $updateVictoria = $conexion->prepare("UPDATE usuario SET victorias = victorias + 1 WHERE idUsuario = :idUsuario"); - $updateDerrota = $conexion->prepare("UPDATE usuario SET derrotas = derrotas + 1 WHERE idUsuario = :idUsuario"); - - foreach ($todosLosMiembros as $miembro) { - $idU = (int)$miembro['idUsuario']; - $idE = (int)$miembro['idEquipo']; - - if ($idE === $idEquipoGanador) { - $updateVictoria->execute([':idUsuario' => $idU]); - } else { - $updateDerrota->execute([':idUsuario' => $idU]); - } - } - - $conexion->commit(); - $_SESSION['partidas_procesadas'][$idPartida] = true; - } - - echo json_encode(['terminada' => $terminada]); - } catch (PDOException $e) { - if ($conexion->inTransaction()) { - $conexion->rollBack(); - } - echo json_encode(['error' => $e->getMessage()]); - } - break; - - default: - echo json_encode(['error' => 'Acción no permitida']); - break; + 'Sesión no iniciada']); + exit; +} + +$idPartida = intval($_POST['idPartida'] ?? 0); +$orden = $_POST['orden'] ?? ''; + +if ($idPartida <= 0) { + echo json_encode(['error' => 'Partida no válida']); + exit; +} + +$conexion = conexionBD(); +if (is_array($conexion)) { + echo json_encode($conexion); + exit; +} + +switch ($orden) { + case 'comprobarEstado': + try { + // Contar jugadores totales apuntados en los equipos de esta partida + $stmt = $conexion->prepare(" + SELECT COUNT(exu.idUsuario) AS total_jugadores + FROM equipoxpartida exp + INNER JOIN equipoxusuario exu ON exp.idEquipo = exu.idEquipo + WHERE exp.idPartida = :idPartida + "); + $stmt->execute([':idPartida' => $idPartida]); + $totalJugadores = (int)$stmt->fetchColumn(); + + $preguntasTotalesEsperadas = $totalJugadores * 10; + + // Contar respuestas dadas en la partida + $stmtRespuestas = $conexion->prepare(" + SELECT COUNT(*) + FROM respuestaalmacenada ra + INNER JOIN partidaxpregunta pxp ON ra.idPartidaxPregunta = pxp.idPartidaxPregunta + WHERE pxp.idPartida = :idPartida + "); + $stmtRespuestas->execute([':idPartida' => $idPartida]); + $respuestasRespondidas = (int)$stmtRespuestas->fetchColumn(); + + $terminada = ($respuestasRespondidas >= $preguntasTotalesEsperadas && $preguntasTotalesEsperadas > 0); + + // Cuando la partida finaliza, se actualizan los históricos + if ($terminada && !isset($_SESSION['partidas_procesadas'][$idPartida])) { + + $conexion->beginTransaction(); + + // CÁLCULO DE VELOCIDAD PREGUNTA A PREGUNTA EN SESIÓN + if (!isset($_SESSION['primeros_en_acertar'][$idPartida])) { + $_SESSION['primeros_en_acertar'][$idPartida] = []; + } + + // Vemos quién fue el primero + $stmtVelocidad = $conexion->prepare(" + SELECT ra.idPartidaxPregunta, ra.idUsuario + FROM respuestaalmacenada ra + INNER JOIN respuesta r ON ra.idRespuesta = r.idRespuesta + INNER JOIN partidaxpregunta pxp ON ra.idPartidaxPregunta = pxp.idPartidaxPregunta + WHERE pxp.idPartida = :idPartida AND r.correcta = 1 + ORDER BY ra.idRespuestaAlmacenada ASC + "); + $stmtVelocidad->execute([':idPartida' => $idPartida]); + $todosLosAciertos = $stmtVelocidad->fetchAll(PDO::FETCH_ASSOC); + + foreach ($todosLosAciertos as $acierto) { + $idPxp = $acierto['idPartidaxPregunta']; + $idU = $acierto['idUsuario']; + + if (!isset($_SESSION['primeros_en_acertar'][$idPartida][$idPxp])) { + $_SESSION['primeros_en_acertar'][$idPartida][$idPxp] = $idU; + } + } + + // Actualizamos la base de datos + // Buscamos los aciertos de cada jugador en la partida actual + $stmtAciertos = $conexion->prepare(" + SELECT ra.idUsuario, exu.idEquipo, COUNT(*) as aciertos_partida + FROM respuestaalmacenada ra + INNER JOIN partidaxpregunta pxp ON ra.idPartidaxPregunta = pxp.idPartidaxPregunta + INNER JOIN respuesta r ON ra.idRespuesta = r.idRespuesta + INNER JOIN equipoxusuario exu ON ra.idUsuario = exu.idUsuario + WHERE pxp.idPartida = :idPartida AND r.correcta = 1 + GROUP BY ra.idUsuario + "); + $stmtAciertos->execute([':idPartida' => $idPartida]); + $jugadoresPartida = $stmtAciertos->fetchAll(PDO::FETCH_ASSOC); + + $updateAciertosGlobales = $conexion->prepare(" + UPDATE usuario + SET aciertos = aciertos + :nuevos_aciertos + WHERE idUsuario = :idUsuario + "); + + $puntosEquipos = []; + foreach ($jugadoresPartida as $jp) { + $idU = (int)$jp['idUsuario']; + $idE = (int)$jp['idEquipo']; + $nuevosAciertos = (int)$jp['aciertos_partida']; + + // Sumamos los aciertos al perfil del usuario + $updateAciertos->execute([ + ':nuevos_aciertos' => $nuevosAciertos, + ':idUsuario' => $idU + ]); + + if (!isset($puntosEquipos[$idE])) { + $puntosEquipos[$idE] = 0; + } + $puntosEquipos[$idE] += $nuevosAciertos; + } + + // Determinamos qué equipo ha obtenido más aciertos en la partida + arsort($puntosEquipos); + $idEquipoGanador = key($puntosEquipos); + + // Obtenemos todos los usuarios de la partida para asignar victorias/derrotas + $stmtMiembros = $conexion->prepare(" + SELECT exu.idUsuario, exu.idEquipo + FROM equipoxpartida exp + INNER JOIN equipoxusuario exu ON exp.idEquipo = exu.idEquipo + WHERE exp.idPartida = :idPartida + "); + $stmtMiembros->execute([':idPartida' => $idPartida]); + $todosLosMiembros = $stmtMiembros->fetchAll(PDO::FETCH_ASSOC); + + $updateVictoria = $conexion->prepare("UPDATE usuario SET victorias = victorias + 1 WHERE idUsuario = :idUsuario"); + $updateDerrota = $conexion->prepare("UPDATE usuario SET derrotas = derrotas + 1 WHERE idUsuario = :idUsuario"); + + foreach ($todosLosMiembros as $miembro) { + $idU = (int)$miembro['idUsuario']; + $idE = (int)$miembro['idEquipo']; + + if ($idE === $idEquipoGanador) { + $updateVictoria->execute([':idUsuario' => $idU]); + } else { + $updateDerrota->execute([':idUsuario' => $idU]); + } + } + + $conexion->commit(); + $_SESSION['partidas_procesadas'][$idPartida] = true; + } + + echo json_encode(['terminada' => $terminada]); + } catch (PDOException $e) { + if ($conexion->inTransaction()) { + $conexion->rollBack(); + } + echo json_encode(['error' => $e->getMessage()]); + } + break; + + default: + echo json_encode(['error' => 'Acción no permitida']); + break; } \ No newline at end of file diff --git a/js/buscadorSala.js b/js/buscadorSala.js index 40ced89..c258d97 100644 --- a/js/buscadorSala.js +++ b/js/buscadorSala.js @@ -9,7 +9,7 @@ function comprobarSalaUsuario() { $("#cargandoSalas").remove(); $.ajax({ - url: "controladores/ControladorEquipoxUsuario.php", + url: "controladores/controladorEquipoxUsuario.php", type: "POST", dataType: "json", data: { orden: "obtenerSalaUsuario" }, @@ -231,7 +231,7 @@ $(document).on("click", ".btn-unirse-equipo", function () { boton.prop("disabled", true).text("Uniéndose..."); $.ajax({ - url: "controladores/ControladorEquipoxUsuario.php", + url: "controladores/controladorEquipoxUsuario.php", type: "POST", dataType: "json", data: { @@ -302,7 +302,7 @@ $(document).on("click", "#btnConfirmarAbandonar", function () { btnConfirmar.prop("disabled", true).text("Saliendo..."); $.ajax({ - url: "controladores/ControladorEquipoxUsuario.php", + url: "controladores/controladorEquipoxUsuario.php", type: "POST", dataType: "json", data: { orden: "salirDeSala" }, diff --git a/js/juego.js b/js/juego.js index 8b6df8d..4d4df09 100644 --- a/js/juego.js +++ b/js/juego.js @@ -2,7 +2,7 @@ // Carga las preguntas de la partida, las muestra de una en una, // guarda cada respuesta en el servidor y al terminar lleva a resultados.php -const URL_CONTROLADOR = "controladores/ControladorJuego.php"; +const URL_CONTROLADOR = "controladores/controladorJuego.php"; const PAUSA_FEEDBACK = 1800; // ms que se ve si has acertado o fallado // Colores y formas de los botones (estilo Kahoot, definidos en juego.css) diff --git a/js/resultados.js b/js/resultados.js index 4ecd202..267d676 100644 --- a/js/resultados.js +++ b/js/resultados.js @@ -10,7 +10,7 @@ $(document).ready(function () { function comprobarEstadoPartida(idPartida, intervalo = null) { $.ajax({ - url: "controladores/ControladorResultados.php", + url: "controladores/controladorResultados.php", type: "POST", dataType: "json", data: {