Je suis donc en train de créer un mini jeu de stratégie pour le plaisir, et je suis tombé sur un problème que je n'arrive pas à résoudre.
Je pensais que ce serait facile, mais il semble que j'avais tort, ou peut-être que la solution est juste sous mon nez, mais je cherche un autre point de vue sur mon problème.
J'ai une base de données avec une liste de territoires enregistrés sur une carte. Chacun de ces territoires contient une liste de territoires adjacents.
ID | name | adjacent | faction 1 | Name1 | 2;7;10;24 | 5 2 | Name2 | 1;3;7;8 | 4 3 | Name3 | 2;4;5;8 | 8
adjacent étant une liste d'ID séparés par des points-virgules
Mon objectif est de trouver le chemin le plus court vers un territoire à partir de tous les territoires détenus par une certaine faction. La distance est calculée en fonction du nombre d'étapes nécessaires pour atteindre le territoire.
De cette façon, je peux rapidement obtenir la distance et appliquer des modificateurs à cet égard.
Par exemple, dans l'extrait de données ci-dessus :
-
Le territoire 1 est à distance 0 du 2, puisqu'ils sont adjacents.
-
Le territoire 1 est à 1 distance de 3, puisque 3 est adjacent à 2 (et 2 est adjacent à 1).
-
Le territoire 1 est à une distance de 2 de 4, puisque 4 est adjacent à 3, qui est adjacent à 2.
Actuellement, mon code ressemble à ceci ;
function getProximity($connexion, $faction, $terrain)
{
$query = "SELECT id, adjacent FROM worldmap WHERE faction = ".$faction;
$result = mysqli_query($connexion, $query);
$proximity = 10;
while ($row = mysqli_fetch_row($result))
{
$adjacent = explode(";", $row[1]);
if (in_array($terrain, $adjacent))
{
//territory is adjacent, stop looking
return 0;
}
else
{
//if not directly adjacent, seek through the list
foreach($adjacent as $adj)
{
$prox = getSubProximity($connexion, array($row[0]), $adj, $terrain, 1);
if ($prox < $proximity)
{
$proximity = $prox;
}
}
}
}
return $proximity;
}
function getSubProximity($connexion, $from, $terrain, $terrain2, $proximity)
{
//Attempt to break weird loops... not succesful...
if ($proximity > 10)
{
return $proximity;
}
$query = "SELECT id, adjacent FROM worldmap WHERE id = ".$terrain;
$result = mysqli_query($connexion, $query);
while ($row = mysqli_fetch_row($result))
{
$adjacent = explode(";", $row[1]);
if (in_array($terrain2, $adjacent))
{
//territory is adjacent, stop looping
return $proximity;
}
else
{
foreach($adjacent as $adj)
{
//check if we've been through there
if (!in_array($adj, $from))
{
array_push($from, $terrain);
$prox = getSubProximity($connexion, $from, $adj, $terrain2, $proximity+1);
if ($prox < $proximity)
{
$proximity = $prox;
}
}
}
}
}
}
Merci pour votre aide, et n'hésitez pas si vous avez d'autres moyens d'obtenir le même résultat ; la structure de la base de données n'est pas statique et entièrement sous mon contrôle.