Commit d1a12693 authored by etienne912's avatar etienne912
Browse files

correction de bugs, optimisations multiples et ajout de PHPDoc

parent 7ea95ae9
<?php
/**
* Classe Ville
*/
class Ville {
// permet d'identifier de manière unique la ville
private $id;
private $nombrePontsMax;
private $nombrePonts;
// un tableau associatif qui stocke les villes qui sont reliées à la ville cible et le nombre de ponts qui les relient (ce nombre de ponts doit être <=2)
private $villesLiees;
private static $nbVilles = 0;
// constructeur qui permet de valuer les 2 attributs de la classe
function __construct($nombrePontsMax, $nombrePonts) {
$this->id = self::$nbVilles++;
/**
* Contructeur de la classe Ville
* @param $id String l'id de la ville
* @param $nombrePontsMax int le nombre de ponts maximal de la ville
* @param $nombrePonts int le nombre de ponts au départ
*/
function __construct($id, $nombrePontsMax, $nombrePonts) {
$this->id = intval($id);
$this->nombrePontsMax = $nombrePontsMax;
$this->nombrePonts = $nombrePonts;
$this->villesLiees = array();
}
// sélecteur qui retourne la valeur de l'attribut id
......@@ -23,7 +25,6 @@ class Ville {
return $this->id;
}
// sélecteur qui retourne la valeur de l'attribut nombrePontsMax
function getNombrePontsMax() {
return $this->nombrePontsMax;
......@@ -39,28 +40,23 @@ class Ville {
$this->nombrePonts = $nb;
}
function lierVilles($villeALier) {
$idVille = $villeALier->getId();
if (isset($this->villesLiees[$idVille])) {
if ($this->villesLiees[$idVille] == 0 || $this->villesLiees[$idVille] == 1) {
$this->villesLiees[$idVille]++;
} else {
$this->villesLiees[$idVille] = 0;
}
} else {
$this->villesLiees[$idVille] = 1;
}
}
/**
* Cette méthode nous indique si une ville à le bon nombre de ponts
* @return bool vrai si le nombre de ponts actuel est égal aux nombre de ponts maximal
*/
function estFinie() {
return $this->nombrePonts == $this->nombrePontsMax;
}
function aTropPonts(){
/**
* Cette méthode nous indique si une ville à trop de ponts
* @return bool vrai si le nombre de ponts actuel est supérieur aux nombre de ponts maximal
*/
function aTropPonts() {
return $this->nombrePonts > $this->nombrePontsMax;
}
}
?>
\ No newline at end of file
......@@ -6,40 +6,47 @@ class Villes {
private $villes;
private $villesLiees;
/**
* Constructeur de la classe Villes.
*/
function __construct() {
// tableau représentatif d'un jeu qui servira à développer votre code
$this->villes[0][0] = new Ville(3, 0);
$this->villes[0][6] = new Ville(2, 0);
$this->villes[3][0] = new Ville(6, 0);
$this->villes[3][5] = new Ville(2, 0);
$this->villes[5][1] = new Ville(1, 0);
$this->villes[5][6] = new Ville(2, 0);
$this->villes[6][0] = new Ville(2, 0);
$this->villes[0][0] = new Ville("0", 3, 0);
$this->villes[0][6] = new Ville("1", 2, 0);
$this->villes[3][0] = new Ville("2", 6, 0);
$this->villes[3][5] = new Ville("3", 2, 0);
$this->villes[5][1] = new Ville("4", 1, 0);
$this->villes[5][6] = new Ville("5", 2, 0);
$this->villes[6][0] = new Ville("6", 2, 0);
$this->villesLiees = array();
}
// sélecteur qui retourne la ville en position $i et $j
// précondition: la ville en position $i et $j existe
/**
* Méthode qui retourne la ville à un emplacement donné
* @param $i int la position en abscisse
* @param $j int la position en ordonnée
* @return Ville la ville
*/
function getVille($i, $j) {
return $this->villes[$i][$j];
}
/**
* @return int le nombre de villes
*/
function getnbVilles() {
$nb = 0;
for ($i = 0; $i <= 6; ++$i) {
for ($j = 0; $j <= 6; ++$j) {
if (isset($this->villes[$i][$j])) {
$nb++;
}
}
foreach ($this->villes as $ligne) {
$nb += count($ligne);
}
return $nb;
}
/**
* Cette méthode retourne une ville en fonction d'un Id
* @param $id int de la ville
* @return Ville|null la ville
*/
function getVilleId($id) {
foreach ($this->villes as $ligne) {
foreach ($ligne as $ville) {
......@@ -51,6 +58,11 @@ class Villes {
return null;
}
/**
* Cette méthode retourne l'abscisse d'une ville en fonction de son ID
* @param $id int l'identifiant unique de la ville
* @return int son abscisse
*/
function getX($id) {
for ($i = 0; $i <= 6; ++$i) {
for ($j = 0; $j <= 6; ++$j) {
......@@ -58,11 +70,15 @@ class Villes {
return $i;
}
}
}
return -1;
}
/**
* Cette méthode retourne l'ordonnée d'une ville en fonction de son ID
* @param $id int l'identifiant unique de la ville
* @return int son ordonnée
*/
function getY($id) {
for ($i = 0; $i <= 6; ++$i) {
for ($j = 0; $j <= 6; ++$j) {
......@@ -75,23 +91,24 @@ class Villes {
return -1;
}
// modifieur qui value le nombre de ponts de la ville en position $i et $j;
// précondition: la ville en position $i et $j existe
function setVille($i, $j, $nombrePonts) {
$this->villes[$i][$j]->setNombrePonts($nombrePonts);
}
// permet de tester si la ville en position $i et $j existe
// postcondition: vrai si la ville existe, faux sinon
/**
* Cette méthode permet de savoir si une ville existe
* @param $i int abscisse de la ville
* @param $j int ordonnée de la ville
* @return bool si la ville est présente dans la matrice
*/
function existe($i, $j) {
return isset($this->villes[$i][$j]);
}
/**
* Cette méthode permet de savoir si le jeu est fini
* Le jeu est fini lorsque toutes les villes ont le bon nombre de ponts
* @return bool vrai si le jeu est fini
*/
function estFini() {
foreach ($this->villes as $ligne) {
foreach ($ligne as $ville) {
......@@ -105,6 +122,10 @@ class Villes {
return true;
}
/**
* Cette méthode permet de savoir si le jeux est perdu
* @return bool vrai si une ville a trop de ponts
*/
function estPerdu() {
foreach ($this->villes as $ligne) {
foreach ($ligne as $ville) {
......@@ -118,38 +139,57 @@ class Villes {
return false;
}
/**
* @return array la matrice de liaison des villes
*/
function getVillesLiees() {
return $this->villesLiees;
}
/**
* Cette méthode permet de savoir si deux villes sont liées
* @param $vilAX int la valeur en abscisse de la villeA
* @param $vilAY int la valeur en ordonnée de la villeA
* @param $vilBX int la valeur en abscisse de la villeB
* @param $vilBY int la valeur en ordonnée de la villeB
* @return bool si la villeA est liée à la villeB
*/
function estLiee($vilAX, $vilAY, $vilBX, $vilBY) {
$villeA = $this->getVille($vilAX, $vilAY);
$villeB = $this->getVille($vilBX, $vilBY);
$villeAId = $villeA->getId();
$villeBId = $villeB->getId();
return $this->villesLiees[$villeAId][$villeBId] != 0;
return isset($this->villesLiees[$villeAId][$villeBId]) && $this->villesLiees[$villeAId][$villeBId] != 0;
}
/**
* Cette méthode permet de liéer deux villes entre elles
* @param $vilAX int la valeur en abscisse de la villeA
* @param $vilAY int la valeur en ordonnée de la villeA
* @param $vilBX int la valeur en abscisse de la villeB
* @param $vilBY int la valeur en ordonnée de la villeB
*/
function lierVilles($vilAX, $vilAY, $vilBX, $vilBY) {
$villeA = $this->getVille($vilAX, $vilAY);
$villeB = $this->getVille($vilBX, $vilBY);
$villeAId = $villeA->getId();
$villeBId = $villeB->getId();
if (isset($this->villesLiees[$villeAId][$villeBId])) {
if (isset($this->villesLiees[$villeAId][$villeBId])) { // si le nombre de ponts est deja entré dans la matrice
// si le nombre de ponts entre les deux villes est de 0 ou 1
if ($this->villesLiees[$villeAId][$villeBId] == 0 || $this->villesLiees[$villeAId][$villeBId] == 1) {
$this->villesLiees[$villeAId][$villeBId]++;
$this->villesLiees[$villeBId][$villeAId]++;
$villeA->setNombrePonts($villeA->getNombrePonts() + 1);
$villeB->setNombrePonts($villeB->getNombrePonts() + 1);
} else {
} else { // une ville ne peut pas déposser 2 ponts alors on repasse à 0
$this->villesLiees[$villeAId][$villeBId] = 0;
$this->villesLiees[$villeBId][$villeAId] = 0;
$villeA->setNombrePonts($villeA->getNombrePonts() - 2);
$villeB->setNombrePonts($villeB->getNombrePonts() - 2);
}
} else {
} else { // s'il n'y avait encore aucun ponts
$this->villesLiees[$villeAId][$villeBId] = 1;
$this->villesLiees[$villeBId][$villeAId] = 1;
$villeA->setNombrePonts($villeA->getNombrePonts() + 1);
......
......@@ -2,6 +2,14 @@
class VueJeu {
/**
* Cette méthode permet d'afficher le jeu
* @param $villes Villes les villes du jeu
* @param $actX int l'abscisse d'une ville qui serait actuellement sélectionné
* @param $actY int l'ordonnée d'une ville qui serait actuellement sélectionné
* @param $actMauvX int l'ordonnée d'une ville qui aurait été séléctionne mais qui n'aurait pas été valide
* @param $actMauvY int l'ordonnée d'une ville qui aurait été séléctionne mais qui n'aurait pas été valide
*/
function afficherJeu($villes, $actX, $actY, $actMauvX, $actMauvY) {
header("Content-type: text/html; charset=utf-8");
?>
......@@ -53,30 +61,35 @@ class VueJeu {
<table>
<?php
// si le jeu est fini
if ($villes->estFini()) {
$_SESSION['etatDernierePartie'] = "gagne";
header('Location: index.php?statistiques');
unset($_SESSION["villes"]);
unset($_SESSION["villes_old"]);
} else if ($villes->estPerdu()) {
} else if ($villes->estPerdu()) { // si le jeu est perdu
$_SESSION['etatDernierePartie'] = "perdu";
header('Location: index.php?statistiques');
unset($_SESSION["villes"]);
unset($_SESSION["villes_old"]);
} else { // si mon jeu n'est pas fini
} else {
/* ---------- Ajout des ponts sur le plateau ---------- */
$pontSimpleHorizontal = "<td class='simplehorizontal'></td>";
// les templates pour les différents type de ponts
$pontSimpleHorizontal = "<td class='simplehorizontal'></td>";
$pontDoubleHorizontal = "<td class='doublehorizontal'></td>";
$pontSimpleVertical = "<td class='simplevertical'></td>";
$pontDoubleVertical = "<td class='doublevertical'></td>";
$ponts = $villes->getVillesLiees();
$ponts = $villes->getVillesLiees(); // on recupère la matrice des ponts
$nbVilles = $villes->getnbVilles();
// on part du principe que les ids des villes sont croissant de 1 en 1
for ($i = 0; $i < $nbVilles; ++$i) {
for ($j = $i; $j < $nbVilles; ++$j) {
// s'il y a un pont entre la ville ou id=$i et la ville ou id=$j
if (isset($ponts[$i][$j]) && $ponts[$i][$j] != 0) {
$vAX = $villes->getX($i);
$vAY = $villes->getY($i);
......@@ -104,6 +117,7 @@ class VueJeu {
}
}
/* ---------- Ajout des villes sur le plateau ---------- */
for ($i = 0; $i <= 6; ++$i) { // pour chage ligne de ma matrice villes
for ($j = 0; $j <= 6; ++$j) { // pour chaque colonne de ma matrice villes
......@@ -166,6 +180,8 @@ class VueJeu {
}
/* ---------- Affichage du plateau de jeu ---------- */
for ($i = 0; $i <= 6; ++$i) { // pour chage ligne de ma matrice villes
echo "<tr>";
for ($j = 0; $j <= 6; ++$j) { // pour chaque colonne de ma matrice villes
......
......@@ -209,7 +209,6 @@ div.jeu > table > tbody > tr > td {
height: 71px;
display: inline-flex;
flex: 1 1 auto;
border-radius: 100%;
}
td > a {
......@@ -227,38 +226,41 @@ td > a {
td.show {
border: 1px solid black;
background-color: #f5ffbf;
border-radius: 100%;
}
td.active {
border: 1px solid black;
background-color: #ffe385;
border-radius: 100%;
}
td.activeMauvais {
border: 1px solid black;
background-color: #ff2742;
border-radius: 100%;
}
td.simplehorizontal {
border-radius: 0;
background: url("trait.png") center no-repeat;
background: url("../img/trait.png") center no-repeat;
transform: rotate(90deg);
}
td.doublehorizontal {
border-radius: 0;
background: url("traits.png") center no-repeat;
background: url("../img/traits.png") center no-repeat;
transform: rotate(90deg);
}
td.simplevertical {
border-radius: 0;
background: url("trait.png") center no-repeat;
background: url("../img/trait.png") center no-repeat;
}
td.doublevertical {
border-radius: 0;
background: url("traits.png") center no-repeat;
background: url("../img/traits.png") center no-repeat;
}
td.ok {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment