From 00e1c04868cb4195fa4297cc7f7816d8d60a93a5 Mon Sep 17 00:00:00 2001 From: dbvictor2002 Date: Tue, 29 Sep 2026 13:18:33 +0200 Subject: [PATCH] Subir archivos a "controladores" --- controladores/ControladorReusltados.php | 166 ++++++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 controladores/ControladorReusltados.php diff --git a/controladores/ControladorReusltados.php b/controladores/ControladorReusltados.php new file mode 100644 index 0000000..de401f7 --- /dev/null +++ b/controladores/ControladorReusltados.php @@ -0,0 +1,166 @@ + '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