Exemplo n.º 1
0
    /// <summary>
    /// Indique si les unités sélectionnées peuvent attaquer ensemble. Pour cela, elles doivent être
    /// </summary>
    /// <returns>bool true si les unités sont compatibles, false autrement.</returns>
    protected bool CanAttackTogether(Territoire toAttack)
    {
        if (this.GetType().Name == "Infanterie" || this.GetType().Name == "Tank")
        {
            // On vérifie pour chaque unité si elle est d'un type compatible (Tank ou Infanterie) et stationnée à la
            // frontière de la cible
            foreach (Unite unit in selectedList)
            {
                if (unit.GetType().Name == "Infanterie" || unit.GetType().Name == "Tank")
                {
                    Terrestre terrestre = unit as Terrestre;

                    // Une des unités sélectionnées n'est pas stationnée à la frontière de la cible
                    // Si une route maritime qui ne soit pas bloquée ne connecte pas la cible à la base de l'unité
                    // Elle ne peut attaquer
                    if (!toAttack.GetVoisinsNDegree(1, true, false).Contains(terrestre.territoire))
                    {
                        return(false);
                    }
                }
                else // Si l'unité n'est pas une infanterie ou un tank, le groupe ne peut attaquer de façon coordonnées
                {
                    return(false);
                }
            }
        }
        else if (this.GetType().Name == "Artillerie")
        {
            if (toAttack.unites.Count > 1)
            {
                // On vérifie pour chaque unité si elle est du même type et stationnée à portée de tire de la cible.
                foreach (Unite unit in selectedList)
                {
                    if (unit.GetType().Name != "Artillerie")
                    {
                        return(false);
                    }

                    Artillerie artie = unit as Artillerie;

                    // Si la cible n'est pas à moins de 3 territoires d'écart l'unité ne peut ouvrir le feu.
                    if (!toAttack.GetVoisinsNDegree(2, false, true).Contains(artie.territoire))
                    {
                        return(false);
                    }
                }
            }
        }
        else // Une DCA ne peut pas attaquer
        {
            return(false);
        }

        return(true);
    }
Exemplo n.º 2
0
    /// <summary>
    /// Indique si les unités sélectionnées peuvent attaquer ensemble. Pour cela, elles doivent être
    /// </summary>
    /// <returns>bool true si les unités sont compatibles, false autrement.</returns>
    protected bool CanAttackTogether(Territoire toAttack)
    {
        if (this.GetType().Name == "Bombardier")
        {
            if (toAttack.unites.Count > 0)
            {
                // On vérifie pour chaque unité si elle est du même type et stationnée à portée de tire de la cible
                foreach (Unite unit in selectedList)
                {
                    if (unit.GetType().Name != "Bombardier")
                    {
                        return(false);
                    }

                    Bombardier bombardier = unit as Bombardier;

                    if (!toAttack.GetVoisinsNDegree(3, true, true).Contains(bombardier.territoire))
                    {
                        return(false);
                    }
                }
            }
        }
        else // Seuls les bombardiers peuvent poursuivre
        {
            return(false);
        }

        return(true);
    }
Exemplo n.º 3
0
    protected List <Unite> GetUnitToAttack(Territoire toAttack)
    {
        List <Territoire> .Enumerator voisins3DegresEnum = toAttack.GetVoisinsNDegree(3, true, true).GetEnumerator();
        List <Territoire> .Enumerator voisins2DegresEnum = toAttack.GetVoisinsNDegree(2, false, true).GetEnumerator();
        List <Territoire> .Enumerator voisinsEnum        = toAttack.GetVoisinsNDegree(1, true, false).GetEnumerator();
        bool attacking = false;

        List <Unite> unitToAttack = new List <Unite>();

        // S'il y a plus d'une unité sur la cible il est possible d'attaquer à distance
        if (toAttack.unites.Count > 1)
        {
            // S'il est possible d'attaquer avec au moins un bombardier on les sélectionne
            while (!attacking && voisins3DegresEnum.MoveNext())
            {
                if (voisins3DegresEnum.Current.joueur.Equals(this))
                {
                    List <Unite> unitesVoisin = voisins3DegresEnum.Current.unites;
                    attacking = true;

                    foreach (Unite unit in unitesVoisin)
                    {
                        if (unit.GetType().Name == "Bombardier" && unit.canAct)
                        {
                            unitToAttack.Add(unit);
                            unit.selected = true;
                        }
                    }
                }
            }

            // Il n'y a pas de bombardier à proximité alors il faut chercher les éventuelles artilleries
            if (!attacking)
            {
                while (!attacking && voisins2DegresEnum.MoveNext())
                {
                    List <Unite> unitesVoisin = voisins2DegresEnum.Current.unites;
                    attacking = true;

                    foreach (Unite unit in unitesVoisin)
                    {
                        if (unit.GetType().Name == "Artillerie" && unit.canAct)
                        {
                            unitToAttack.Add(unit);
                            unit.selected = true;
                        }
                    }
                }
            }
        }

        // Il n'y a pas non plus d'artillerie il faut se rabattre sur les unités d'assaut
        if (!attacking)
        {
            while (!attacking && voisinsEnum.MoveNext())
            {
                // Il s'agit d'un territoire de l'IA dont c'est le tour et plus d'une d'unité y est stationnée
                // ces dernières sont ajoutées à la liste de celles partant à l'assaut, sauf une.
                if (voisinsEnum.Current.joueur.Equals(this) && voisinsEnum.Current.unites.Count > 1)
                {
                    List <Tank>       tanks       = new List <Tank>();
                    List <Infanterie> infanteries = new List <Infanterie>();

                    foreach (Unite unit in voisinsEnum.Current.unites)
                    {
                        if (unit.GetType().Name == "Infanterie")
                        {
                            infanteries.Add(unit as Infanterie);
                        }
                        else if (unit.GetType().Name == "Tank")
                        {
                            tanks.Add(unit as Tank);
                        }
                    }

                    foreach (Tank tank in tanks)
                    {
                        if (unitToAttack.Count < voisinsEnum.Current.unites.Count - 1 && tank.canAct)
                        {
                            unitToAttack.Add(tank);
                            tank.selected = true;
                        }
                    }

                    foreach (Infanterie infanterie in infanteries)
                    {
                        if (unitToAttack.Count < voisinsEnum.Current.unites.Count - 1 && infanterie.canAct)
                        {
                            unitToAttack.Add(infanterie);
                            infanterie.selected = true;
                        }
                    }

                    if (unitToAttack.Count > 0)
                    {
                        attacking = true;
                    }
                }
            }
        }

        return(unitToAttack);
    }