NW/SE, case=5 => NE/SW * On gère d'abord N et S puis, si la case est = 5, on inverse les sorties (side = 1-side) * avant de tester W et E */ if ($laby[$y][$x]>3) { if (($dir == "N") && ($side == 1)) { header("Location: display.php"); exit(); } if (($dir == "S") && ($side == 0)) { header("Location: display.php"); exit(); } if ($laby[$y][$x] == 5) { $side = 1 - $side; } if (($dir == "W") && ($side == 1)) { header("Location: display.php"); exit(); } if (($dir == "E") && ($side == 0)) { header("Location: display.php"); exit(); } } /* [7h] on peut donner une valeur à side indépendemment du type de case. * on va donc ajouter des $side = ... dans le switch. * Dans le cas des chemins, pour E et W il faudra inverser side si le type * de la case atteinte est 5. On utilisera l'opérateur ternaire * ATTENTION : si on va vers le sud, on entre par le côté nord de la case etc. */ switch($dir) { case "N": $nx = $x; $ny = ($y + 5) % 6; $side=1; break; case "S": $nx = $x; $ny = ($y + 1) % 6; $side=0; break; case "W": $nx = ($x + 7) % 8; $ny = $y; $side = ($laby[$ny][$nx] == 5) ? 0 : 1; break; case "E": $nx = ($x + 1) % 8; $ny = $y; $side = ($laby[$ny][$nx] == 5) ? 1 : 0; break; } if ($laby[$ny][$nx] == 6) { // Puit header("Location: lose.php?r=puit"); exit(); } if ($laby[$ny][$nx] == 7) { // Wumpus header("Location: lose.php?r=wumpus"); exit(); } /* [4d] Marquer comme vu et sauver le tableau modifié dans la session */ $view[$ny][$nx] = 1; /* [5] Gestion des chauve-souris * - detection si une chauve-souris à la position du joueur * - une chance sur 2 qu'elle se réveille * - si réveillée, nouvelle position au hasard et on l'efface (position -1,-1) * - si déplacé, marquer la nouvelle case comme vue * - sauver bat dans la session */ for ($k = 0; $k < count($bat); $k++) { if (($bat[$k]["x"] == $nx) && ($bat[$k]["y"] == $ny)) { if (rand(0,1) == 0) { $bat[$k]["x"] = -1; $bat[$k]["y"] = -1; $nx=rand(0,7); $ny=rand(0,5); while($laby[$ny][$nx] != 0) { $nx=rand(0,7); $ny=rand(0,5); } $view[$ny][$nx] = 1; /* [9] On ajoute le message flash */ $_SESSION["flash"]="Vous avez réveillé une chauve-souris"; } } } /* [7i] On sauve $side dans la session */ $_SESSION["bat"] = $bat; $_SESSION["x"]=$nx; $_SESSION["y"]=$ny; $_SESSION["view"] = $view; $_SESSION["side"] = $side; header("Location: display.php"); exit(); } /* [6] Tir * - on calcule la destination (avec suivi des chemins) * - si c'est le Wumpus, gagné. Sinon, perdu */ /* [8] Suivre chemin (copier/coller de init.php) : * Le calcul est mis dans un do-while (executé au moins une fois) * la nouvelle position est recopiée dans $x et $y pour être prêt pour le déplacement suivant * Selon la tuile où on est arrivé, on modifie la direction. sur les tuiles 4 il faudra remplacer les N par W, * les S par E, les W par N et les E par S. On fait une recherche dans une chaîne contenant les origines et on * l'utilise pour lire la destination dans une deuxième chaîne. * La boucle s'arrêtera quand on tombera sur une case différente d'un chemin. * Ne pas oublier que si on entre en allant vers le sud, on est du côté de la sortie nord de la case suivante et * on doit donc prendre la direction associée au nord (l'ouest pour une case 4). */ do { switch ($dir) { case "N": $nx = $x; $ny = ($y + 5) % 6; break; case "S": $nx = $x; $ny = ($y + 1) % 6; break; case "W": $nx = ($x + 7) % 8; $ny = $y; break; case "E": $nx = ($x + 1) % 8; $ny = $y; break; } $x=$nx; $y=$ny; if ($laby[$ny][$nx] == 4) { $dir="WENS"[strpos("SNEW",$dir)]; } if ($laby[$ny][$nx] == 5) { // pour les tuiles 5, on permute E et W $dir="EWNS"[strpos("SNWE",$dir)]; } } while (($laby[$ny][$nx] == 4) || ($laby[$ny][$nx] == 5)); if ($laby[$ny][$nx] == 7) { header("Location: win.php"); exit(); } else { header("Location: lose.php?r=tir"); exit(); }