ADD(to fix): Jeu "Science Quizz"

/!\ Encore non fonctionnel, problème de lien avec la DB. /!\
php
Tom 1 year ago
parent 9a535b017e
commit f6583259d2

@ -5,6 +5,7 @@ namespace config;
use model\ConfigurationJeu; use model\ConfigurationJeu;
use model\Joueur; use model\Joueur;
use model\MdlPendu; use model\MdlPendu;
use model\MdlScienceQuizz;
use model\ValidationException; use model\ValidationException;
class Validation class Validation
@ -90,4 +91,14 @@ class Validation
return $pendu; return $pendu;
} }
public static function valMdlScienceQuizz($scienceQuizz, array &$dVueErreur): MdlScienceQuizz
{
if(! $scienceQuizz instanceof MdlScienceQuizz){
$role = NULL;
$dVueErreur[] = 'Erreur, mauvais jeu en utilisation';
throw new ValidationException('Erreur, mauvais jeu en utilisation');
}
return $scienceQuizz;
}
} }

@ -4,12 +4,15 @@ namespace config;
$config = [ $config = [
"rep" => __DIR__.'/../', "rep" => __DIR__.'/../',
"db" => ["dsn" => 'pgsql:host=localhost;dbname=dbrebeuret', "db" => ["dsn" => 'pgsql:host=localhost;dbname=postgres',
"login" => 'rebeuret', "login" => 'postgres',
"mdp" => 'achanger'], "mdp" => 'root'],
"templates" => ["index" => 'vues/index.php', "templates" => ["index" => 'vues/index.php',
"pseudo" => 'pseudo.html', "pseudo" => 'pseudo.html',
"jouer" => "jouer.html", "jouer" => "jouer.html",
"pendu" => "pendu.html", "pendu" => "pendu.html",
"penduScore" => 'penduScore.html'] "penduScore" => 'penduScore.html',
"scienceQuizz" => 'scienceQuizz.html',
"scienceQuizzReponse" => 'scienceQuizzReponse.html',
"scienceQuizzRecap" => 'scienceQuizzRecap.html',]
]; ];

@ -39,7 +39,11 @@ class FrontController
$router->map('GET|POST','/admin/[a:action]','AdminController'); $router->map('GET|POST','/admin/[a:action]','AdminController');
$router->map('GET|POST','/[a:action]?','UserController'); $router->map('GET|POST','/[a:action]?','UserController');
try {
session_start(); session_start();
} catch (Exception $e) {
die('Session start failed: ' . $e->getMessage());
}
if(isset($_SESSION['pseudo'])) if(isset($_SESSION['pseudo']))
$dVue['pseudo'] = $_SESSION['pseudo']; $dVue['pseudo'] = $_SESSION['pseudo'];

@ -29,6 +29,9 @@ class JouerController{
if(count($dVueErreur) == 0){ if(count($dVueErreur) == 0){
$idJeu = $configurationJeu->getJeu()->getId(); $idJeu = $configurationJeu->getJeu()->getId();
switch($idJeu){ switch($idJeu){
case 2:
new ScienceQuizzController($role, $configurationJeu);
break;
case 3: case 3:
new PenduController($role, $configurationJeu); new PenduController($role, $configurationJeu);
break; break;

@ -0,0 +1,134 @@
<?php
namespace controller;
use Exception;
use model\ConfigurationJeu;
use model\Connection;
use model\Joueur;
use model\MdlScienceQuizz;
use model\MdlScientifique;
use config\Validation;
use model\ScientifiqueGateway;
use model\ValidationException;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Error\SyntaxError;
class ScienceQuizzController
{
private array $dVue;
private array $dVueErreur;
private MdlScienceQuizz $scienceQuizz;
private Connection $con;
/**
* @throws RuntimeError
* @throws SyntaxError
* @throws LoaderError
* @throws Exception
*/
public function __construct(Joueur $role, ConfigurationJeu $configJeu)
{
$this->dVue = [];
$this->dVueErreur = [];
if (isset($_SESSION['scienceQuizz']) && Validation::valMdlScienceQuizz($_SESSION['scienceQuizz'], $this->dVueErreur)) {
$this->scienceQuizz = $_SESSION['scienceQuizz'];
} else {
$this->reInit();
}
if ($this->scienceQuizz->partieTerminee()) {
$this->vueRecap();
}
else {
$this->vueJeu();
}
}
/**
* @throws Exception
*/
private function reInit()
{
$mdlScientifique = new MdlScientifique();
$scientifique = $mdlScientifique->getRandom();
$idScientifique = $scientifique->getId();
$questions = $mdlScientifique->getQuestions($idScientifique);
$this->scienceQuizz = new MdlScienceQuizz($idScientifique,$questions);
$_SESSION['scienceQuizz'] = $this->scienceQuizz;
}
/**
* @throws SyntaxError
* @throws RuntimeError
* @throws LoaderError
*/
private function vueJeu()
{
global $twig, $config;
$dStatJeu['numQuestion'] = $this->scienceQuizz->getNumQuestion();
$questions = $this->scienceQuizz->getQuestions();
if ($questions) {
$dStatJeu['question'] = $this->scienceQuizz->getRandomQuestion($questions);
} else {
// Gérer le cas où aucune question n'est disponible
$this->dVueErreur[] = "Aucune question disponible.";
echo $twig->render('erreur.html', ['dVueErreur' => $this->dVueErreur]);
return;
}
$this->dVue['statJeu'] = $dStatJeu;
$this->dVue['Jeu'] = $this->scienceQuizz->getJeu();
echo $twig->render($config['templates']['scienceQuizz'], ['dVue' => $this->dVue, 'dVueErreur' => $this->dVueErreur]);
?>
<script>
setTimeout(function() {
window.location.href = "/ScienceQuizzReponse.php";
}, 10000);
</script>
<?php
}
/**
* @throws RuntimeError
* @throws SyntaxError
* @throws LoaderError
*/
private function vueReponse()
{
global $twig, $config;
$dScientifique['nom'] = $this->scienceQuizz->getNom();
$dScientifique['prenom'] = $this->scienceQuizz->getPrenom();
$dScientifique['dateNaissance'] = $this->scienceQuizz->getDateNaissance();
$this->dVue['scientifique'] = $dScientifique;
echo $twig->render($config['templates']['scienceQuizzReponse'], ["dVue" => $this->dVue]);
}
/**
* @throws RuntimeError
* @throws SyntaxError
* @throws LoaderError
*/
private function vueRecap()
{
global $twig, $config;
$dStatJoueur ['bonneReponse'] = $this->scienceQuizz->getBonneReponse();
$dStatJoueur ['nbPoints'] = $this->scienceQuizz->getNbPoints();
$this->dVue['statJoueur'] = $dStatJoueur;
unset($_SESSION['scienceQuizz']);
echo $twig->render($config['templates']['scienceQuizzRecap'], ["dVue" => $this->dVue]);
}
}

@ -53,6 +53,9 @@ class UserController {
if(count($dVueErreur) == 0){ if(count($dVueErreur) == 0){
$idJeu = $configurationJeu->getJeu()->getId(); $idJeu = $configurationJeu->getJeu()->getId();
switch($idJeu){ switch($idJeu){
case 2:
new ScienceQuizzController($role, $configurationJeu);
break;
case 3: case 3:
new PenduController($role, $configurationJeu); new PenduController($role, $configurationJeu);
break; break;

@ -2,7 +2,9 @@
namespace model; namespace model;
use Exception;
use PDO; use PDO;
use PDOException;
use PDOStatement; use PDOStatement;
class Connection extends PDO { class Connection extends PDO {
@ -10,24 +12,44 @@ class Connection extends PDO {
private PDOStatement $stmt; private PDOStatement $stmt;
public function __construct(string $dsn, string $username, string $password) { public function __construct(string $dsn, string $username, string $password) {
try {
parent::__construct($dsn,$username,$password); parent::__construct($dsn, $username, $password);
$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Connection failed: " . $e->getMessage());
}
} }
/** * @param string $query /** *
* @param array $parameters * * @param string $query
* @return bool Returns `true` on success, `false` otherwise * @param array $params
* @return bool|null Returns `true` on success, `false` otherwise
*/
/**
* @param string $query
* @param array $params
* @return PDOStatement|false Returns `PDOStatement` on success, `false` otherwise
* @throws Exception
*/ */
public function executeQuery(string $query, array $params = [])
{
try {
$stmt = $this->prepare($query);
public function executeQuery(string $query, array $parameters = []) : bool{ foreach ($params as $param => $value) {
$this->stmt = parent::prepare($query); $stmt->bindValue($param, $value[0], $value[1]);
foreach ($parameters as $name => $value) {
$this->stmt->bindValue($name, $value[0], $value[1]);
} }
return $this->stmt->execute(); $stmt->execute();
$this->stmt = $stmt;
return $stmt;
} catch (PDOException $e) {
throw new Exception($e->getMessage());
}
} }
public function getResults() : array { public function getResults() : array {
@ -37,4 +59,5 @@ class Connection extends PDO {
public function getOneResult() { public function getOneResult() {
return $this->stmt->fetch(); return $this->stmt->fetch();
} }
} }

@ -2,6 +2,8 @@
namespace model; namespace model;
use Exception;
class ScientifiqueGateway class ScientifiqueGateway
{ {
private Connection $con; private Connection $con;
@ -18,6 +20,7 @@ class ScientifiqueGateway
/** /**
* @return array|bool * @return array|bool
* @throws Exception
*/ */
public function getRandom() { // PHP 7.4 public function getRandom() { // PHP 7.4
$this->con->executeQuery( $this->con->executeQuery(
@ -26,6 +29,9 @@ class ScientifiqueGateway
return $this->con->getOneResult(); return $this->con->getOneResult();
} }
/**
* @throws Exception
*/
public function addScientifique(Scientifique $sci): bool{ public function addScientifique(Scientifique $sci): bool{
return $this->con->executeQuery( return $this->con->executeQuery(
"INSERT INTO Scientifique(nom, prenom, photo, dateNaissance, descriptif, ratioTrouvee, idThematique, idDifficulte, idSexe) VALUES (:nom, :prenom, :photo, :dateNaissance, :descriptif, :ratioTrouvee, :idThematique, :idDifficulte, :idSexe);" "INSERT INTO Scientifique(nom, prenom, photo, dateNaissance, descriptif, ratioTrouvee, idThematique, idDifficulte, idSexe) VALUES (:nom, :prenom, :photo, :dateNaissance, :descriptif, :ratioTrouvee, :idThematique, :idDifficulte, :idSexe);"
@ -41,6 +47,10 @@ class ScientifiqueGateway
":idSexe"=>[$sci->getSexe()->getId(),$this->con::PARAM_STR] ":idSexe"=>[$sci->getSexe()->getId(),$this->con::PARAM_STR]
]); ]);
} }
/**
* @throws Exception
*/
public function editScientifique(Scientifique $sci): bool{ public function editScientifique(Scientifique $sci): bool{
return $this->con->executeQuery( return $this->con->executeQuery(
"UPDATE Scientifique SET nom = :nom, prenom = :prenom, photo = :photo, dateNaissance = :dateNaissance, descriptif = :descriptif, ratioTrouvee = :ratioTrouvee, idThematique = :idThematique, idDifficulte = :idDifficulte, idSexe = :idSexe WHERE id=:id;" "UPDATE Scientifique SET nom = :nom, prenom = :prenom, photo = :photo, dateNaissance = :dateNaissance, descriptif = :descriptif, ratioTrouvee = :ratioTrouvee, idThematique = :idThematique, idDifficulte = :idDifficulte, idSexe = :idSexe WHERE id=:id;"
@ -57,6 +67,10 @@ class ScientifiqueGateway
":id"=>[$sci->getId(),$this->con::PARAM_INT] ":id"=>[$sci->getId(),$this->con::PARAM_INT]
]); ]);
} }
/**
* @throws Exception
*/
public function deleteScientifique(int $id): bool{ public function deleteScientifique(int $id): bool{
return $this->con->executeQuery( return $this->con->executeQuery(
"DELETE FROM Scientifique WHERE id=:id;" "DELETE FROM Scientifique WHERE id=:id;"
@ -65,6 +79,9 @@ class ScientifiqueGateway
]); ]);
} }
/**
* @throws Exception
*/
public function getScientifique(int $id) { public function getScientifique(int $id) {
$this->con->executeQuery( $this->con->executeQuery(
"SELECT id, nom, prenom, photo, dateNaissance, descriptif, ratioTrouvee, idThematique, idDifficulte, idSexe FROM Scientifique WHERE id=:id;" "SELECT id, nom, prenom, photo, dateNaissance, descriptif, ratioTrouvee, idThematique, idDifficulte, idSexe FROM Scientifique WHERE id=:id;"
@ -73,4 +90,21 @@ class ScientifiqueGateway
]); ]);
return $this->con->getOneResult(); return $this->con->getOneResult();
} }
/**
* @throws Exception
*/
public function getQuestions(int $idScientifique): array
{
$query = "SELECT q.* FROM Question q
JOIN Reponse r ON q.id = r.idQuestion
WHERE r.idScientifique = :idScientifique
ORDER BY RANDOM() LIMIT 5";
$params = [":idScientifique" => [$idScientifique, $this->con::PARAM_INT]];
$this->con->executeQuery($query, $params);
return $this->con->getResults();
}
} }

@ -0,0 +1,109 @@
<?php
namespace model;
use Exception;
class MdlScienceQuizz
{
private int $bonneReponse;
private string $nbPoints;
private int $numQuestion;
private array $reponses;
private array $questions;
private array $questionsPass;
private bool $partieTerminee;
private int $scientifique;
public function __construct(int $scientifique, array $questions)
{
$this->bonneReponse = 0;
$this->nbPoints = 0;
$this->numQuestion = 0;
$this->reponses = [];
$this->scientifique = $scientifique;
$this->questions = $questions;
$this->questionsPass = [];
$this->partieTerminee = false;
}
/**
* @return array
*/
public function getQuestions(): array
{
var_dump($this->questions);
return $this->questions;
}
public function getScientifique(): int
{
return $this->scientifique;
}
/**
* @return int
*/
public function getBonneReponse(): int
{
return $this->bonneReponse;
}
/**
* @return string
*/
public function getNbPoints(): string
{
return $this->nbPoints;
}
/**
* @return int
*/
public function getNumQuestion(): int
{
return $this->numQuestion;
}
/**
* @return array
*/
public function getReponses(): array
{
return $this->reponses;
}
/**
* @param int $bonneReponse
*/
public function setBonneReponse(int $bonneReponse): void
{
$this->bonneReponse = $bonneReponse;
}
// Sélectionne une question aléatoire
/**
* @throws Exception
*/
public function getRandomQuestion(array $questions): array
{
$randomNum=random_int(0, count($questions)-1);
$question=$questions[$randomNum];
$this->questionsPass[]=$question;
if (count($this->questionsPass)==count($questions))
{
$this->partieTerminee=true;
}
return $question;
}
public function partieTerminee(): bool
{
return $this->partieTerminee;
}
}

@ -41,14 +41,28 @@ class MdlScientifique extends MdlBase{
$difficulte, $difficulte,
$sexe); $sexe);
} }
public function addScientifique(Scientifique $s){
/**
* @throws Exception
*/
public function addScientifique(Scientifique $s): bool
{
return $this->gw->addScientifique($s); return $this->gw->addScientifique($s);
} }
public function editScientifique(Scientifique $s){
/**
* @throws Exception
*/
public function editScientifique(Scientifique $s): bool
{
return $this->gw->editScientifique($s); return $this->gw->editScientifique($s);
} }
public function getScientifique(int $id){ /**
* @throws Exception
*/
public function getScientifique(int $id): Scientifique
{
$t=$this->gw->getScientifique($id); $t=$this->gw->getScientifique($id);
if(gettype($t)!="array"){ if(gettype($t)!="array"){
throw new Exception("Scientifique non trouvé"); throw new Exception("Scientifique non trouvé");
@ -75,7 +89,24 @@ class MdlScientifique extends MdlBase{
$diff, $diff,
$sexe $sexe
); );
}
/**
* @throws Exception
*/
public function getQuestions(int $id): array
{
$t = $this->gw->getQuestions($id);
if (gettype($t) != "array") {
throw new Exception("Scientifique non trouvé");
}
$questions = [];
foreach ($t as $question) {
$questions[] = $question["libelle"];
}
return $questions;
} }
} }

@ -16,6 +16,7 @@ class Scientifique
private Thematique $thematique; private Thematique $thematique;
private Difficulte $difficulte; private Difficulte $difficulte;
private Sexe $sexe; private Sexe $sexe;
private array $questions;
/** /**
* @param int $id * @param int $id
@ -28,6 +29,7 @@ class Scientifique
* @param Thematique $thematique * @param Thematique $thematique
* @param Difficulte $difficulte * @param Difficulte $difficulte
* @param Sexe $sexe * @param Sexe $sexe
* @param array $questions
*/ */
public function __construct(int $id, public function __construct(int $id,
string $nom, string $nom,
@ -38,7 +40,8 @@ class Scientifique
float $ratioTrouvee, float $ratioTrouvee,
Thematique $thematique, Thematique $thematique,
Difficulte $difficulte, Difficulte $difficulte,
Sexe $sexe) Sexe $sexe,
array $questions = [])
{ {
$this->id = $id; $this->id = $id;
$this->nom = $nom; $this->nom = $nom;
@ -50,6 +53,7 @@ class Scientifique
$this->thematique = $thematique; $this->thematique = $thematique;
$this->difficulte = $difficulte; $this->difficulte = $difficulte;
$this->sexe = $sexe; $this->sexe = $sexe;
$this->questions = $questions;
} }
/** /**

@ -0,0 +1,57 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Science Quizz</title>
<!-- CSS -->
<style>
body {
display: flex;
align-items: center;
justify-content: center;
height: 100vh;
margin: 0;
}
.game-container {
text-align: center;
}
.answer-button {
padding: 10px 20px;
font-size: 16px;
cursor: pointer;
}
</style>
</head>
<body>
<div class="game-container">
<h1>Science Quizz</h1>
<div>
<p>Question {{ dVue.statJeu.numQuestion }}:</p>
<p>{{ dVue.statJeu.question.question }}</p>
<!-- Boutons des réponses -->
<button class="answer-button" type="submit" name="reponse" value="{{ dVue.statJeu.question.answer }}">
Show Answer
</button>
</div>
<!-- Gestion des erreurs -->
{% if dVueErreur %}
<div style="color: red;">
<ul>
{% for error in dVueErreur %}
<li>{{ error }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
</div>
<!-- JS -->
</body>
</html>

@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Science Quizz Recap</title>
</head>
<body>
</body>
</html>

@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Science Quizz 2</title>
</head>
<body>
</body>
</html>
Loading…
Cancel
Save