/// <summary> /// Déplacement des armées : met à jour vdcible avec la meilleure cible pour une armée & une ville choisie /// </summary> /// <param name="armee">armee</param> /// <param name="vd">ville</param> private void choisitCibleArmee(Armee armee, VilleDescription vd) { // Choisit la ville la plus proche et l'attaque si on peut gagner if (vd.faction != _jeu.tourFaction) { // Regarde d'abord si elle n'est pas trop loin... Taille max const int DISTANCE_MAX = 25; if (Math.Max(Math.Abs(vd.positionMap.X - armee.positionCarte.X), Math.Abs(vd.positionMap.Y - armee.positionCarte.Y)) < DISTANCE_MAX) { // Regarde d'abord si on gagnerait pour éviter de calculer des trajectoires pour rien // peut-on gagner le combat ? List <Armee> garnison = new List <Armee>(); foreach (Armee arme in _jeu.armees) { if (vd.contains(arme.positionCarte)) { garnison.Add(arme); } } bool gagne; if (garnison.Count != 0) { Combat combat = new Combat(_jeu, armee, garnison); gagne = combat.simulationCombat(); } else { gagne = true; } if (gagne) { // Accessible ? // choisit un point accessible près de la ville Point?cible = getPointPresDeVille(armee, vd.positionMap); if (cible != null) // sinon inaccessible // Déjà là ? { if (armee.positionCarte == cible) { minChemin = 0; vdcible = vd; } else { armee.moveTarget = cible; if ((armee.trajectoire != null) && (armee.trajectoire.chemin != null)) { int lenChem = armee.trajectoire.chemin.Count; if (lenChem != 0 && lenChem < minChemin) { if (minChemin > lenChem) { minChemin = lenChem; vdcible = vd; } } } } } } } } }
/// <summary> /// Déplacement des armées : met à jour vdcible avec la meilleure cible pour une armée & une armée ennemie choisie /// </summary> /// <param name="armee">armee</param> /// <param name="cible">armée ciblée</param> private void choisitCibleArmee(Armee armee, Armee cible) { // Choisit la ville la plus proche et l'attaque si on peut gagner if (cible.faction != _jeu.tourFaction) { // Regarde d'abord si elle n'est pas trop loin... Taille max const int DISTANCE_MAX = 25; if (Math.Max(Math.Abs(cible.positionCarte.X - armee.positionCarte.X), Math.Abs(cible.positionCarte.Y - armee.positionCarte.Y)) < DISTANCE_MAX) { // Regarde ensuite si elle est dans une ville, si oui on l'ignore car c'est pris en compte dans le choix des cibles villes bool dansVille = false; foreach (VilleDescription vd in _jeu.villes.villeDesc) { if (vd.contains(cible.positionCarte)) { dansVille = true; break; } } if (!dansVille) { // Regarde d'abord si on gagnerait pour éviter de calculer des trajectoires pour rien // peut-on gagner le combat ? bool gagne; List <Armee> garnison = new List <Armee>(); garnison.Add(cible); Combat combat = new Combat(_jeu, armee, garnison); gagne = combat.simulationCombat(); if (gagne) { // Accessible ? // choisit un point accessible près de la cible Point?pcible = getPointPresDeArmee(armee, cible.positionCarte); if (pcible != null) // sinon inaccessible // Déjà là ? { if (armee.positionCarte == pcible) { minCheminArmee = 0; armeeCible = cible; } else { armee.moveTarget = pcible; if ((armee.trajectoire != null) && (armee.trajectoire.chemin != null)) { int lenChem = armee.trajectoire.chemin.Count; if (lenChem != 0 && lenChem < minCheminArmee) { if (minCheminArmee > lenChem) { minCheminArmee = lenChem; armeeCible = cible; } } } } } } } } } }