01-10-2008, 11:45 PM
Salut,
Un algo tout bête, imaginé sur le pouce :
Un algo tout bête, imaginé sur le pouce :
Code PHP :
<?php
$carte_ombre = array_fill(0, 23, array_fill(0, 16, true));
// Donc ici on a $carte_ombre qui est un tableau contenant uniquement des true.
// On va passer la case où est le joueur à false : il peut toujours se voir lui-même.
$carte_ombre[$x_joueur][$y_joueur] = false;
// Ensuite le joueur a droit de se voir sur une certaine portée
$portee = 3;
// On va donc déjà déterminer horizontalement et verticalement, ce qu'il voit
// Pour ça très simple : on va utiliser deux boucles for pour chaque direction.
// Le principe est : on part du joueur et on va dans la direction voulue.
// Si un obstacle bloque le joueur, il ne voit pas plus loin.
$bloque = false;
for($i = $x_joueur; $i <= $x_joueur + $portee; $i++)
{
if(obstacle($i, $y_joueur) || $bloque)
{
$bloque = true;
} else {
$carte_ombre[$i][$y_joueur] = false;
}
}
$bloque = false;
for($i = $x_joueur; $i >= $x_joueur - $portee; $i--)
{
if(obstacle($i, $y_joueur) || $bloque)
{
$bloque = true;
} else {
$carte_ombre[$i][$y_joueur] = false;
}
}
$bloque = false;
for($i = $y_joueur; $i <= $y_joueur + $portee; $i++)
{
if(obstacle($x_joueur, $i) || $bloque)
{
$bloque = true;
} else {
$carte_ombre[$x_joueur][$i] = false;
}
}
$bloque = false;
for($i = $y_joueur; $i >= $y_joueur + $portee; $i--)
{
if(obstacle($x_joueur, $i) || $bloque)
{
$bloque = true;
} else {
$carte_ombre[$x_joueur][$i] = false;
}
}
Voila pour les directions "simples". Maintenant, il va falloir complexifier un petit peu les choses pour les directions en diagonal. Là, ça dépends vraiment de comment tu veux gérer ton ombre. La manière la plus simple, pour moi, est de gérer ça en décalant le joueur, ce qui implique de coder le tout en fonction récursive :
Code PHP :
<?php
$carte_ombre = array_fill(0, 23, array_fill(0, 16, true));
function decouvre_carte($carte_ombre, $x_joueur, $y_joueur, $portee)
{
// On calcule comme expliqué précédement les directions "de base"
$bloque = false;
for($i = $x_joueur; $i <= $x_joueur + $portee; $i++)
{
if(obstacle($i, $y_joueur) || $bloque)
{
$bloque = true;
} else {
$carte_ombre[$i][$y_joueur] = false;
}
}
$bloque = false;
for($i = $x_joueur; $i >= $x_joueur - $portee; $i--)
{
if(obstacle($i, $y_joueur) || $bloque)
{
$bloque = true;
} else {
$carte_ombre[$i][$y_joueur] = false;
}
}
$bloque = false;
for($i = $y_joueur; $i <= $y_joueur + $portee; $i++)
{
if(obstacle($x_joueur, $i) || $bloque)
{
$bloque = true;
} else {
$carte_ombre[$x_joueur][$i] = false;
}
}
$bloque = false;
for($i = $y_joueur; $i >= $y_joueur + $portee; $i--)
{
if(obstacle($x_joueur, $i) || $bloque)
{
$bloque = true;
} else {
$carte_ombre[$x_joueur][$i] = false;
}
}
// On regarde pour chaque diagonale si on peut y voir
if($portee > 1)
{
if(!obstacle($x_joueur - 1, $y_joueur - 1))
{
$carte_ombre = decouvre_carte($carte_ombre, $x_joueur - 1, $y_joueur - 1, $portee - 1);
}
if(!obstacle($x_joueur - 1, $y_joueur + 1))
{
$carte_ombre = decouvre_carte($carte_ombre, $x_joueur - 1, $y_joueur + 1, $portee - 1);
}
if(!obstacle($x_joueur + 1, $y_joueur + 1))
{
$carte_ombre = decouvre_carte($carte_ombre, $x_joueur + 1, $y_joueur + 1, $portee - 1);
}
if(!obstacle($x_joueur + 1, $y_joueur - 1))
{
$carte_ombre = decouvre_carte($carte_ombre, $x_joueur + 1, $y_joueur - 1, $portee - 1);
}
}
return $carte_ombre;
}
$carte_ombre = decouvre_carte($carte_ombre, $x_joueur, $y_joueur, 3); // Pour une portée de 3, bien sûr