1 Commits

Author SHA1 Message Date
dbvictor2002 5446352cf9 Fix inicia partida todos los usuarios 2026-09-30 10:21:43 +02:00
4 changed files with 125 additions and 130 deletions
+35 -79
View File
@@ -1,118 +1,79 @@
<?php <?php
session_start(); session_start();
require_once '../clases/claseJuego.php'; require_once '../clases/claseJuego.php';
header('Content-Type: application/json; charset=utf-8'); header('Content-Type: application/json; charset=utf-8');
// Comprobamos que haya un usuario conectado // Hay que estar logueado y decir de qué partida se trata
if (!isset($_SESSION['idUsuario'])) { if (!isset($_SESSION['idUsuario'])) {
echo json_encode([ echo json_encode(['error' => 'Debes iniciar sesión para jugar.']);
'error' => 'Debes iniciar sesión para jugar.'
]);
exit; exit;
} }
$idUsuario = (int) $_SESSION['idUsuario']; $idUsuario = (int)$_SESSION['idUsuario'];
$idPartida = intval($_POST['idPartida'] ?? 0);
// Comprobamos que se haya indicado la partida
if (!isset($_POST['idPartida'])) {
echo json_encode([
'error' => 'No se ha indicado la partida.'
]);
exit;
}
$idPartida = intval($_POST['idPartida']);
if ($idPartida <= 0) { if ($idPartida <= 0) {
echo json_encode([ echo json_encode(['error' => 'No se ha indicado la partida.']);
'error' => 'La partida indicada no es válida.'
]);
exit; exit;
} }
// Comprobamos que el usuario pertenezca a la partida // Solo pueden jugar los usuarios que están en uno de los equipos de la partida
$perteneceAPartida = Juego::usuarioEnPartida($idPartida, $idUsuario);
$perteneceAPartida = Juego::usuarioEnPartida($idPartida,$idUsuario);
if (is_array($perteneceAPartida)) { if (is_array($perteneceAPartida)) {
echo json_encode($perteneceAPartida); echo json_encode($perteneceAPartida);
exit; exit;
} }
if (!$perteneceAPartida) { if (!$perteneceAPartida) {
echo json_encode([ echo json_encode(['error' => 'No formas parte de esta partida.']);
'error' => 'No formas parte de esta partida.'
]);
exit; exit;
} }
// Comprobamos la orden
$orden = $_POST['orden'] ?? ''; switch ($_POST['orden'] ?? '') {
switch ($orden) {
// CARGAR LAS PREGUNTAS DE LA PARTIDA
// Devuelve las 10 preguntas con sus respuestas (sin marcar la correcta)
case 'cargarPreguntas': case 'cargarPreguntas':
$resultado = Juego::cargarPreguntas($idPartida, $idUsuario); echo json_encode(Juego::cargarPreguntas($idPartida, $idUsuario));
echo json_encode($resultado);
break; break;
// REGISTRAR RESPUESTA
// Guarda la respuesta del usuario y dice si ha acertado
case 'responder': case 'responder':
if (!isset($_POST['idPartidaxPregunta']) || !isset($_POST['idRespuesta'])){ $idPartidaxPregunta = intval($_POST['idPartidaxPregunta'] ?? 0);
echo json_encode([ $idRespuesta = intval($_POST['idRespuesta'] ?? 0);
'error' => 'Faltan datos para registrar la respuesta.'
]);
break; if ($idPartidaxPregunta <= 0 || $idRespuesta <= 0) {
echo json_encode(['error' => 'Faltan datos para registrar la respuesta.']);
break;
} }
$idPartidaxPregunta = intval($_POST['idPartidaxPregunta']); echo json_encode(
Juego::registrarRespuesta(
$idRespuesta = intval($_POST['idRespuesta']); $idPartida,
$idUsuario,
if ($idPartidaxPregunta <= 0 || $idRespuesta <= 0){ $idPartidaxPregunta,
$idRespuesta
echo json_encode([ )
'error' => 'Los datos de la respuesta no son válidos.' );
]);
break; break;
}
// Registramos la respuesta del usuario
$resultado = Juego::registrarRespuesta($idPartida, $idUsuario, $idPartidaxPregunta, $idRespuesta);
echo json_encode($resultado);
break;
// Finalizar la partida y registrar los aciertos del usuario
// Recibe los aciertos del jugador al terminar sus 10 preguntas,
// para que resultados.php los pueda usar al montar la hoja de resultados
case 'finalizarPartida': case 'finalizarPartida':
$aciertos = intval($_POST['aciertos'] ?? 0); $aciertos = intval($_POST['aciertos'] ?? 0);
// Guardamos los aciertos en la sesión
if (!isset($_SESSION['aciertosPorPartida'])) { if (!isset($_SESSION['aciertosPorPartida'])) {
$_SESSION['aciertosPorPartida'] = []; $_SESSION['aciertosPorPartida'] = [];
} }
@@ -120,21 +81,16 @@ switch ($orden) {
echo json_encode([ echo json_encode([
'exito' => 'Aciertos registrados correctamente.', 'exito' => 'Aciertos registrados correctamente.',
'idPartida' => $idPartida, 'idPartida' => $idPartida,
'aciertos' => $aciertos 'aciertos' => $aciertos
]); ]);
break; break;
default: default:
echo json_encode([ echo json_encode(['error' => 'La orden indicada no existe.']);
'error' => 'La orden indicada no existe.'
]);
break; break;
} }
?>
+65 -10
View File
@@ -3,6 +3,43 @@ let usuarioYaEstaEnEquipo = false;
$(document).ready(function () { $(document).ready(function () {
comprobarSalaUsuario(); comprobarSalaUsuario();
}); });
// ==========================================================================
// DETECTOR DE INICIO DE PARTIDA PARA JUGADORES INVITADOS (1 VS 1)
// ==========================================================================
$(document).ready(function () {
// Solo activamos el vigilante si estamos en la página del buscador de salas
if (window.location.pathname.includes("buscadorSala.php")) {
setInterval(function () {
// 1. Preguntamos al servidor en qué partida está metido el usuario actual
$.ajax({
url: "controladores/controladorEquipoxUsuario.php",
type: "POST",
dataType: "json",
data: { orden: "obtenerSalaUsuario" },
success: function (sala) {
// Si el usuario está metido en una sala/partida activa...
if (sala.asociado && sala.idPartida) {
// 2. Comprobamos si el anfitrión ya ha iniciado esa partida concreta
$.ajax({
url: "controladores/controladorPartida.php",
type: "POST",
dataType: "json",
data: { orden: "buscar", idPartida: sala.idPartida },
success: function (partida) {
// Si 'fechaInicio' ya no es null, significa que el host le dio a "Jugar"
if (partida && partida.fechaInicio !== null) {
// Redirigimos instantáneamente al invitado a la pantalla del juego
window.location.href =
"juego.php?idPartida=" + sala.idPartida;
}
},
});
}
},
});
}, 2000); // Comprueba el estado de la partida automáticamente cada 2 segundos
}
});
// 1. Comprobar si el usuario actual ya pertenece a una sala // 1. Comprobar si el usuario actual ya pertenece a una sala
function comprobarSalaUsuario() { function comprobarSalaUsuario() {
@@ -179,12 +216,12 @@ function mostrarSala(partida, equipos, jugadores) {
// Solo el host puede iniciar la partida // Solo el host puede iniciar la partida
if (esHost) { if (esHost) {
// Así debe renderizarse el botón del host dentro de tu función mostrarSala() para que el AJAX funcione:
botonIniciarHTML = ` botonIniciarHTML = `
<a href="juego.php?idPartida=${partida.idPartida}" <button type="button" id="btnInicioJuego" data-id-partida="${partida.idPartida}" class="btn btn-success btn-lg px-4">
class="btn btn-success btn-lg px-4"> <i class="bi bi-controller"></i> ¡Iniciar Partida!
<i class="bi bi-controller"></i> ¡Iniciar Partida! </button>
</a> `;
`;
} }
accionesSalaHTML = ` accionesSalaHTML = `
@@ -266,7 +303,8 @@ let botonAbandonarReferencia = null;
$(document).on("click", ".btn-abandonar-sala", function () { $(document).on("click", ".btn-abandonar-sala", function () {
botonAbandonarReferencia = $(this); botonAbandonarReferencia = $(this);
const esHost = $(this).data("es-host") === true || $(this).data("es-host") === "true"; const esHost =
$(this).data("es-host") === true || $(this).data("es-host") === "true";
const titulo = $("#modalAbandonarSalaLabel"); const titulo = $("#modalAbandonarSalaLabel");
const mensaje = $("#modalAbandonarSalaMensaje"); const mensaje = $("#modalAbandonarSalaMensaje");
const botonConfirmar = $("#btnConfirmarAbandonar"); const botonConfirmar = $("#btnConfirmarAbandonar");
@@ -279,9 +317,7 @@ $(document).on("click", ".btn-abandonar-sala", function () {
botonConfirmar.text("Sí, abandonar"); botonConfirmar.text("Sí, abandonar");
} else { } else {
titulo.text("¿Abandonar la sala?"); titulo.text("¿Abandonar la sala?");
mensaje.text( mensaje.text("Si sales de la sala, perderás tu lugar en el equipo.");
"Si sales de la sala, perderás tu lugar en el equipo.",
);
botonConfirmar.text("Sí, salir"); botonConfirmar.text("Sí, salir");
} }
@@ -292,7 +328,6 @@ $(document).on("click", ".btn-abandonar-sala", function () {
modal.show(); modal.show();
}); });
// B. Al hacer clic en "Sí, salir" dentro del modal Kahoot // B. Al hacer clic en "Sí, salir" dentro del modal Kahoot
$(document).on("click", "#btnConfirmarAbandonar", function () { $(document).on("click", "#btnConfirmarAbandonar", function () {
const modalEl = document.getElementById("modalAbandonarSala"); const modalEl = document.getElementById("modalAbandonarSala");
@@ -403,6 +438,7 @@ $("#btnCrearSala").on("click", function () {
if (respuesta.exito) { if (respuesta.exito) {
$("#modalCrearSala").modal("hide"); $("#modalCrearSala").modal("hide");
location.reload(); location.reload();
} }
}, },
@@ -433,3 +469,22 @@ $(document).on("input", ".input-kahoot", function () {
$(this).removeClass("is-invalid"); $(this).removeClass("is-invalid");
$(this).next(".mensaje-error-sala").remove(); $(this).next(".mensaje-error-sala").remove();
}); });
$(document).on("click", "#btnInicioJuego", function () {
// 1. Capturamos el id de la partida de forma dinámica desde el botón que se ha pulsado
const idPartida = $(this).data("id-partida");
// 2. Enviamos la petición AJAX adecuada con TODOS los datos que el controlador espera recibir
$.ajax({
url: "controladores/controladorPartida.php",
type: "POST",
dataType: "json",
data: {
orden: "iniciar",
idPartida: idPartida,
},
error: function (error) {
console.error("Error al iniciar el juego por AJAX:", error);
},
});
});
+2 -14
View File
@@ -20,18 +20,7 @@ let bloqueado = false; // true mientras se envía una respuesta o se ve el feedb
let numeroAciertos = 0; // número de aciertos del jugador let numeroAciertos = 0; // número de aciertos del jugador
$(document).ready(function () { $(document).ready(function () {
idPartida = parseInt($("body").data("id-partida"), 10);
// Obtenemos el idPartida de la URL
// Ejemplo: juego.php?idPartida=3
const parametros = new URLSearchParams(window.location.search);
idPartida = parseInt(parametros.get("idPartida"), 10);
if (!idPartida || idPartida < 1) {
mostrarError("La partida indicada no es válida.");
return;
}
// Un solo listener para todos los botones de respuesta // Un solo listener para todos los botones de respuesta
$("#respuestas").on("click", ".btn-answer", function () { $("#respuestas").on("click", ".btn-answer", function () {
@@ -114,7 +103,6 @@ function responder($botonPulsado) {
if (bloqueado) { if (bloqueado) {
return; return;
} }
bloqueado = true; bloqueado = true;
const pregunta = preguntas[indice]; const pregunta = preguntas[indice];
@@ -228,4 +216,4 @@ function mostrarError(mensaje) {
$("#feedback").html( $("#feedback").html(
'<a href="buscadorSala.php">Volver al buscador de salas</a>', '<a href="buscadorSala.php">Volver al buscador de salas</a>',
); );
} }
+23 -27
View File
@@ -1,6 +1,22 @@
<?php
session_start();
// Hay que estar logueado para jugar
if (!isset($_SESSION['idUsuario'])) {
header('Location: index.php');
exit;
}
// La partida llega por la URL: juego.php?idPartida=3
$idPartida = filter_input(INPUT_GET, 'idPartida', FILTER_VALIDATE_INT);
if (!$idPartida || $idPartida < 1) {
header('Location: buscadorSala.php');
exit;
}
?>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="es"> <html lang="es">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
@@ -8,48 +24,28 @@
<title>Proyecto Trivial</title> <title>Proyecto Trivial</title>
<link rel="stylesheet" href="css/juego.css"> <link rel="stylesheet" href="css/juego.css">
<link rel="icon" type="image/svg+xml" href="img/favicon/favicon.svg"> <link rel="icon" type="image/svg+xml" href="img/favicon/favicon.svg">
</head> </head>
<body data-id-partida="<?= (int)$idPartida ?>">
<body> <!-- Progreso: "Pregunta 3 de 10" + barra -->
<!-- CABECERA Y PROGRESO -->
<div class="game-header"> <div class="game-header">
<span id="contadorPregunta">Cargando…</span>
<span id="contadorPregunta">
Cargando…
</span>
</div> </div>
<div class="progress-track"> <div class="progress-track">
<div class="progress-fill" id="barraProgreso"></div> <div class="progress-fill" id="barraProgreso"></div>
</div> </div>
<!-- PREGUNTA --> <!-- Contenedor de la Pregunta (lo rellena js/juego.js) -->
<div class="question-container"> <div class="question-container">
<div id="textoPregunta">Cargando preguntas…</div>
<div id="textoPregunta">
Cargando preguntas…
</div>
<div id="feedback" class="feedback" aria-live="polite"></div> <div id="feedback" class="feedback" aria-live="polite"></div>
</div> </div>
<!-- RESPUESTAS --> <!-- Contenedor de Respuestas (Estilo Kahoot, lo rellena js/juego.js) -->
<div class="answers-grid" id="respuestas"></div> <div class="answers-grid" id="respuestas"></div>
<!-- JAVASCRIPT -->
<script src="js/jquery-4.0.0.min.js"></script> <script src="js/jquery-4.0.0.min.js"></script>
<script src="js/juego.js"></script> <script src="js/juego.js"></script>
</body> </body>
</html> </html>