Programando tu propio TRIVIAL paso a paso (II)

Creando juego trivial con PHP

Seguimos con la programación de nuestro propio juego de preguntas y respuestas.

En la entrada anterior, nos registramos o legueamos, entramos en el juego, cargamos preguntas y mostramos el tablero de juego.

Ahora ya sólo nos queda, recibir la respuesta que ha seleccionado el jugador con el archivo respuesta.php

Este archivo se limita a recoger el resultado, mandarlo a la Base de datos utilizando la funcion guardaResultado() y devolvernos la puntuación actual mediante la función getPuntuacion()

<?php
require_once 'libreria.php';
session_start();
//Recuperamos los datos
$idUsuario= $_SESSION['idUsuario'];
$idPregunta= filter_input(INPUT_POST, 'idPregunta');
$puntos= filter_input(INPUT_POST, 'puntos');
//Y guardamos el resultado
$puntos=guardaResultado($idUsuario,$idPregunta,$puntos);
//Devolvemos los puntos
echo $puntos;

Y ahora ya sólo nos queda ver el archivo libreria.php en la que se encuentran las funciones que acceden a la base de datos. Se compone de 5 funciones muy simples:

  • conectar() se conecta a la base de datos.
  • getPregunta($idUsuario) Busca una pregunta que no se haya hecho anteriormente a ese usuario.
  • getPuntuacion($idUsuario) Devuelve la puntuación actual del usuario.
  • comprobarUsuario($nombre, $password) Comprueba que los datos introducidos son correctos.
  • guardaResultado($idUsuario, $idPregunta, $puntos) Guarda el resultado de cada respuesta.
<?php
 
function conectar() {
    $server = "localhost";
    $user = "root";
    $password = "";
    $db = "trivial";
    try {
        $conn = new PDO("mysql:host=$server;dbname=$db", $user, $password, [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"]);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $conn;
    } catch (Exception $ex) {
        echo $ex->getMessage();
    }
}
 
function getPregunta($idUsuario) {
    try {
        $conn = conectar();
        //Buscamos una pregunta que no se haya hecho a este usuario al azar
        $sql = "SELECT * FROM preguntas where idpreguntas not in (select idpreguntas from resultados where idusuarios=$idUsuario) order by rand() limit 1";
        $resul = $conn->query($sql);
        $fila = $resul->fetch();
        return $fila;
    } catch (Exception $ex) {
        echo $ex->getMessage();
    }
}
 
function getPuntuacion($idUsuario) {
    try {
        $conn = conectar();
        $sql = "SELECT ifnull(sum(puntos),0) puntuacion FROM resultados where idusuarios=:id";
        $st = $conn->prepare($sql);
        $st->execute(['id' => $idUsuario]);
        $fila = $st->fetch();
        return $fila['puntuacion'];
    } catch (Exception $ex) {
        echo $ex->getMessage();
    }
}
 
function comprobarUsuario($nombre, $password) {
    try {
        $conn = conectar();
        //Buscamos un usuario con el nombre solicitado
        $sql = "select * from usuarios where nombre=:nombre";
        $st = $conn->prepare($sql);
        $st->execute(['nombre' => $nombre]);
        $usuario = $st->fetch();
        //Si no existe es un alta, lo insertamos en la BD
        if (!$usuario) {
            $st = $conn->prepare("insert into usuarios (nombre,password) values (:nombre,:password)");
            $st->execute(['nombre' => $nombre, 'password' => md5($password)]);
            //Y devolvemos el id del usuario insertado
            return $conn->lastInsertId();
        } else {
            //Si el usuario existe miramos si la contrasela coincide, si es así devolvemos el id
            if (md5($password) == $usuario['password']) {
                return $usuario['idusuarios'];
            }
        }
        //Si no se da ninguna de las condiciones devolvemos falso
        return false;
    } catch (Exception $ex) {
        echo $ex->getMessage();
        return false;
    }
}
 
function guardaResultado($idUsuario, $idPregunta, $puntos) {
    try {
        $conn = conectar();
        $sql = "insert into resultados (idusuarios,idpreguntas,puntos) values (:idu,:idp,:puntos)";
        $st = $conn->prepare($sql);
        $st->execute(['idu' => $idUsuario, 'idp' => $idPregunta, 'puntos' => $puntos]);
        return getPuntuacion($idUsuario);
    } catch (Exception $ex) {
        echo $ex->getMessage();
    }
}

Y con estas lineas, llegamos al final de esta entrada.

Si creas los archivos necesarios e insertas el código que te he dejado, podrás hacer tu propio juego de preguntas y respuestas. El resultado final, con un poco de Bootstrap, puede quedar de la siguiente manera.

tablero trivial PHP

 


Puedes ver el sistema en funcionamiento AQUI


Puedes descargar el sistema completo desde este enlace.


 

Es un programa muy sencillo con el que podemos usar los conocimientos básicos que tenemos de programación. Usamos SQL, PHP, HTML e introducimos algo de AJAX.

Ahora te propongo un ejercicio para mejorar el resultado de este juego.

Seguro que eres capaz de hacerlo.

Estaría muy bien que añadieras un nuevo campo de CATEGORÍAS a la base de datos para poder incluir preguntas de varios temas y poder seleccionar el tema deseado desde el tablero inicial.

De esa manera, podemos jugar compitiendo en varios temas y acercarnos más al formato TRIVIAL  de este juego.

También podrías poner una cuenta atrás al mostrar la pregunta para hacer el juego más trepidante. Y restar algún punto al fallar alguna respuesta.

También se puede mostrar una tabla con las puntuaciones más altas, organizada por categorías…

Como puede ver, las posibilidades son infinitas. Lo dejo en tus manos.

En cualquier caso, déjame un comentario.

Hasta pronto!

Compartir esta entrada.

10 thoughts on “Programando tu propio TRIVIAL paso a paso (II)

  1. Hola una vez creada la tabla categorías ¿que función habría que agregar o modificar en el archivo librerías?
    Gracias por adelantado

      1. En primer lugar agregar el campo idcategoria a la tabla preguntas y después poder jugar bien seleccionando una categoría determinada o todas las categorías aleatoriamente.
        Para obtener las categorías no veo problema pero si para poder adaptar todo al diseño del juego

    1. Qué error aparece?
      Ya he añadido la opción de verlo en funcionamiento y de descargar el sistema completo para que lo desarrolles tú mismo.

    1. Hola Luis, no deberia hacertelo ya qque cada pregunta que te muestra la obtiene de la base de datos eliminando las que ya están respondidas.

      Esta es la funcion que genera cada pregunta:

      function getPregunta($idUsuario) {
      try {
      $conn = conectar();
      //Buscamos una pregunta que no se haya hecho a este usuario al azar
      $sql = «SELECT * FROM preguntas where idpreguntas not in (select idpreguntas from resultados where idusuarios=$idUsuario) order by rand() limit 1»;

      }

      Por lo que debes tener un error en el código. O quizás hayas repetido alguna pregunta.
      Ya me dirás.
      Saludos.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

CAPTCHA ImageChange Image