public List <TuileManager> CreerGrapheTuilesAPortee(TuileManager tuileOrigine, float portee, bool peutEmbarquer) { ReinitGraphe(); List <TuileManager> grapheAPortee = new List <TuileManager>(); Queue <TuileManager> fileTuiles = new Queue <TuileManager>(); fileTuiles.Enqueue(tuileOrigine); tuileOrigine.parcouru = true; //Parcours en largeur (BFS) while (fileTuiles.Count > 0) { TuileManager tuileObservee = fileTuiles.Dequeue(); tuileObservee.EstAPortee(); if (tuileObservee.distance < portee) { for (int i = 0; i < tuileObservee.connections.Count; i++) { if (tuileObservee.connections[i] != null) { TuileManager tuileFille = tuileObservee.connections[i]; if (!tuileFille.parcouru && tuileFille.estOccupee == false) //On demande si la tuile a déjà été explorée par l'algo et si elle est occupée { if (peutEmbarquer) // si on peut embarquer, aucune restriction concernant l'eau { tuileFille.parcouru = true; tuileFille.predecesseur = tuileObservee; tuileFille.distance += tuileObservee.connectionsDistance[i] + tuileObservee.distance; fileTuiles.Enqueue(tuileFille); grapheAPortee.Add(tuileFille); } else if (!tuileFille.terrainTuile.ettendueEau)// si on ne peut peux pas embarquer, alors l'algo ne prend pas en compte les tuiles d'eau { tuileFille.parcouru = true; tuileFille.predecesseur = tuileObservee; tuileFille.distance += tuileObservee.connectionsDistance[i] + tuileObservee.distance; fileTuiles.Enqueue(tuileFille); grapheAPortee.Add(tuileFille); } } } } } } return(grapheAPortee); }
//Génère le graphe de toutes les tuiles à portée public List <TuileManager> CreerGrapheTuilesAPortee(TuileManager tuileOrigine, float portee) { ReinitGraphe(); List <TuileManager> grapheAPortee = new List <TuileManager>(); Queue <TuileManager> fileTuiles = new Queue <TuileManager>(); fileTuiles.Enqueue(tuileOrigine); tuileOrigine.parcouru = true; //Parcours en largeur (BFS) while (fileTuiles.Count > 0) { TuileManager tuileObservee = fileTuiles.Dequeue(); tuileObservee.EstAPortee(); if (tuileObservee.distance < portee) { for (int i = 0; i < tuileObservee.connections.Count; i++) { if (tuileObservee.connections[i] != null) { TuileManager tuileFille = tuileObservee.connections[i]; if (!tuileFille.parcouru && tuileFille.estOccupee == false)//On demande si la tuile a déjà été explorée par l'algo et si elle est occupée { tuileFille.parcouru = true; tuileFille.predecesseur = tuileObservee; tuileFille.distance += tuileObservee.connectionsDistance[i] + tuileObservee.distance; fileTuiles.Enqueue(tuileFille); grapheAPortee.Add(tuileFille); } } } } } return(grapheAPortee); }