예제 #1
0
    /**
     *	fonction IsNear:
     *	determine si un terrain de type t
     *	se trouve à côté d'une coordonnée _case
     */
    public static bool IsNear(Plateau d, Tuple <Coordonnee, Terrain> _case, TypeTerrain t)
    {
        List <Coordonnee> voisins = d.Adjacent(_case.Item1);

        foreach (Coordonnee voisin in voisins)
        {
            if (d[voisin].Type == t)
            {
                return(true);
            }
        }
        return(false);
    }
예제 #2
0
 public void RecupererBonus(Plateau plateau)
 {
     foreach (KeyValuePair <Coordonnee, Terrain> terrain in plateau)
     {
         if (terrain.Value.Couleur == m_couleur)
         {
             TypeTerrain bonus = plateau.RecupererBonus(plateau.Adjacent(terrain.Key));
             if (bonus != TypeTerrain.AUCUN && !m_listeBonus.Contains(bonus))
             {
                 m_listeBonus.Add(bonus);
             }
         }
     }
 }
예제 #3
0
    /**
     *	Algorithme de l'ouvrier:
     *	1 point par maison de couleur c
     *	à côté d'un lieu spécial
     *	de coordonneé co (chateau, case bonus)
     *
     *	la méthode ne teste qu'un seul lieu,
     *	elle est appelée dans une boucle qui teste
     *	tous les lieux spéciaux
     */
    public static int Ouvrier(Plateau p, Tuple <Coordonnee, Terrain> co, Couleur c)
    {
        int score = 0;
        List <Coordonnee> voisins = p.Adjacent(co.Item1);

        foreach (Coordonnee voisin in voisins)
        {
            if (p[voisin].Couleur == c)
            {
                score++;
            }
        }
        //score obtenu par le joueur autour de ce lieu
        return(score);
    }
예제 #4
0
    /// <summary>
    /// Construit un batiment sur une case Terrain adjacente de type prairie.
    /// </summary>
    /// <param name="coordonnee">Coordonnee du terrain à construire la maison</param>
    /// <param name="joueur">Joueur qui lance le bonus</param>
    /// <param name="plateau">Plateau de jeu</param>
    /// <returns>True si bonus bien activé, false sinon.</returns>
    public static bool Ferme(Coordonnee coordonnee, Joueur joueur, Plateau plateau)
    {
        if (coordonnee == null)
        {
            return(false);
        }

        if (!joueur.ListeBonus.Contains(TypeTerrain.FERME))
        {
            return(false);
        }

        if (plateau[coordonnee].Couleur != Couleur.AUCUNE)
        {
            return(false);
        }

        if (plateau[coordonnee].Type != TypeTerrain.PRAIRIE)
        {
            return(false);
        }

        // Recuperation de la liste des terrains adjacents du joueur
        List <Coordonnee> m_listeTerrainPosable = new List <Coordonnee>();

        foreach (KeyValuePair <Coordonnee, Terrain> terrain in plateau)
        {
            if (terrain.Value.Couleur == joueur.Couleur)
            {
                m_listeTerrainPosable.AddRange(plateau.Adjacent(terrain.Key));
            }
        }

        for (int i = 0; i < m_listeTerrainPosable.Count; i++)
        {
            if (plateau[m_listeTerrainPosable[i]].Type != TypeTerrain.PRAIRIE)
            {
                m_listeTerrainPosable.RemoveAt(i);
                i--;
            }
        }
        // Si aucun terrain n'est disponible (adjacent)
        if (m_listeTerrainPosable.Count == 0)
        {
            plateau[coordonnee].Couleur = joueur.Couleur;
            joueur.NbMaisons--;
            joueur.m_maisonsPlacees.Add(coordonnee);
            return(true);
        }
        else // sinon on voit si la coordonnee de destination correspond a un des terrains adjacents
        {
            foreach (Coordonnee coord in m_listeTerrainPosable)
            {
                if (coord.Equals(coordonnee))
                {
                    plateau[coordonnee].Couleur = joueur.Couleur;
                    joueur.NbMaisons--;
                    joueur.m_maisonsPlacees.Add(coordonnee);
                    return(true);
                }
            }
        }

        return(false);
    }
예제 #5
0
    /// <summary>
    /// Déplace 1 batiment sur une case Terrain de type eau, Adjacent si possible.
    /// </summary>
    /// <param name="coordonneeDepart">Coordonnées de la maison à déplacer</param>
    /// <param name="coordonneeArrivee">Coordonnées de la case où déplacer la maison</param>
    /// <param name="joueur">Joueur qui lance le bonus</param>
    /// <param name="plateau">Plateau de jeu</param>
    /// <returns>True si bonus bien activé, false sinon.</returns>
    public static bool Port(Coordonnee coordonneeDepart, Coordonnee coordonneeArrivee, Joueur joueur, Plateau plateau)
    {
        if (coordonneeDepart == null || coordonneeArrivee == null)
        {
            return(false);
        }

        if (!joueur.ListeBonus.Contains(TypeTerrain.PORT))
        {
            return(false);
        }

        if (plateau[coordonneeDepart].Couleur != joueur.Couleur)
        {
            return(false);
        }

        if (plateau[coordonneeArrivee].Type != TypeTerrain.EAU)
        {
            return(false);
        }

        if (plateau[coordonneeArrivee].Couleur != Couleur.AUCUNE)
        {
            return(false);
        }

        List <Coordonnee> m_listeTerrainPosable = new List <Coordonnee>();

        foreach (KeyValuePair <Coordonnee, Terrain> terrain in plateau)
        {
            if (terrain.Value.Couleur == joueur.Couleur)
            {
                m_listeTerrainPosable.AddRange(plateau.Adjacent(terrain.Key));
            }
        }

        for (int i = 0; i < m_listeTerrainPosable.Count; i++)
        {
            if (plateau[m_listeTerrainPosable[i]].Type != TypeTerrain.EAU)
            {
                m_listeTerrainPosable.RemoveAt(i);
                i--;
            }
        }

        if (m_listeTerrainPosable.Count == 0)
        {
            plateau[coordonneeArrivee].Couleur = joueur.Couleur;
            plateau[coordonneeDepart].Couleur  = Couleur.AUCUNE;
            joueur.m_maisonsPlacees.Remove(coordonneeDepart);
            joueur.m_maisonsPlacees.Add(coordonneeArrivee);
            return(true);
        }
        else
        {
            foreach (Coordonnee coordonnee in m_listeTerrainPosable)
            {
                if (coordonnee.Equals(coordonneeArrivee))
                {
                    plateau[coordonnee].Couleur       = joueur.Couleur;
                    plateau[coordonneeDepart].Couleur = Couleur.AUCUNE;
                    joueur.m_maisonsPlacees.Remove(coordonneeDepart);
                    joueur.m_maisonsPlacees.Add(coordonnee);
                    return(true);
                }
            }
        }

        return(false);
    }
예제 #6
0
    /// <summary>
    /// Deplace un batiment sur une case Terrain adjacente au type de la carte Terrain du joueur.
    /// </summary>
    /// <param name="coordonneeDepart">Coordonnées de la maison à déplacer</param>
    /// <param name="coordonneeArrivee">Coordonnées de la case où déplacer la maison</param>
    /// <param name="joueur">Joueur qui lance le bonus</param>
    /// <param name="plateau">Plateau de jeu</param>
    /// <returns>True si bonus bien activé, false sinon.</returns>
    public static bool Grange(Coordonnee coordonneeDepart, Coordonnee coordonneeArrivee, Joueur joueur, Plateau plateau)
    {
        if (coordonneeDepart == null || coordonneeArrivee == null)
        {
            return(false);
        }

        if (!joueur.ListeBonus.Contains(TypeTerrain.GRANGE))
        {
            return(false);
        }

        // Est ce bien une maison au joueur que l'on va déplacer ?
        if (plateau[coordonneeDepart].Couleur != joueur.Couleur)
        {
            return(false);
        }

        // Est ce bien une case (destination) qui correspond a la carte terrain du joueur ?
        if (plateau[coordonneeArrivee].Type != joueur.CarteTerrain)
        {
            return(false);
        }

        // La case a t'elle déjà une maison de posée ?
        if (plateau[coordonneeArrivee].Couleur != Couleur.AUCUNE)
        {
            return(false);
        }

        // Recuperation de la liste des terrains adjacents du joueur
        List <Coordonnee> m_listeTerrainPosable = new List <Coordonnee>();

        foreach (KeyValuePair <Coordonnee, Terrain> terrain in plateau)
        {
            if (terrain.Value.Couleur == joueur.Couleur)
            {
                m_listeTerrainPosable.AddRange(plateau.Adjacent(terrain.Key));
            }
        }

        for (int i = 0; i < m_listeTerrainPosable.Count; i++)
        {
            if (plateau[m_listeTerrainPosable[i]].Type != joueur.CarteTerrain)
            {
                m_listeTerrainPosable.RemoveAt(i);
                i--;
            }
        }

        // Si aucun terrain n'est disponible (adjacent)
        if (m_listeTerrainPosable.Count == 0)
        {
            plateau[coordonneeArrivee].Couleur = joueur.Couleur;
            plateau[coordonneeDepart].Couleur  = Couleur.AUCUNE;
            joueur.m_maisonsPlacees.Remove(coordonneeDepart);
            joueur.m_maisonsPlacees.Add(coordonneeArrivee);
            return(true);
        }
        else // sinon on voit si la coordonnee de destination correspond a un des terrains adjacents
        {
            foreach (Coordonnee coordonnee in m_listeTerrainPosable)
            {
                if (coordonnee.Equals(coordonneeArrivee))
                {
                    plateau[coordonnee].Couleur       = joueur.Couleur;
                    plateau[coordonneeDepart].Couleur = Couleur.AUCUNE;
                    joueur.m_maisonsPlacees.Remove(coordonneeDepart);
                    joueur.m_maisonsPlacees.Add(coordonnee);
                    return(true);
                }
            }
        }

        return(false);
    }
예제 #7
0
    public bool PlacerMaison(Coordonnee coordonnee, Plateau plateau)
    {
        // Pour savoir si c'est pas a NULL
        if (coordonnee == null)
        {
            return(false);
        }

        // Si la coordonnée existe dans le plateau
        if (!plateau.ContainsKey(coordonnee))
        {
            return(false);
        }

        // Si c'est bien un terrain de sa carte terrain
        if (plateau[coordonnee].Type != m_carteTerrain)
        {
            return(false);
        }

        // Pour verifier si il y a pas déjà une maison dessus.
        if (plateau[coordonnee].Couleur != Couleur.AUCUNE)
        {
            return(false);
        }

        // Pour savoir si il y a encore des maisons de dispo
        if (m_nbMaisons == 0)
        {
            return(false);
        }

        // TEST MAISON ADJACENTE

        List <Coordonnee> m_listeTerrainObligatoire = new List <Coordonnee>();
        List <Coordonnee> m_listeTerrainSecondaire  = new List <Coordonnee>();
        List <Coordonnee> m_listeTerrainTernaire    = new List <Coordonnee>();

        // On parcours notre liste de maison deja placees et on ajoute a notre liste ternaire les terrains ou il est possible de poser une maison
        foreach (Coordonnee coord in m_maisonsPlacees)
        {
            m_listeTerrainTernaire.AddRange(plateau.Adjacent(coord));
        }

        for (int i = 0; i < m_listeTerrainTernaire.Count; i++)
        {
            if (plateau[m_listeTerrainTernaire[i]].Type != m_carteTerrain || plateau[m_listeTerrainTernaire[i]].Couleur != Couleur.AUCUNE)
            {
                m_listeTerrainTernaire.RemoveAt(i);
                i--;
            }
        }

        // On parcours tout le plateau a la recherche d'adjacences des maisons déjà posées. Il existera des doublons dans la
        // Collection.
        foreach (KeyValuePair <Coordonnee, Terrain> terrain in plateau)
        {
            if (terrain.Value.Couleur == m_couleur && terrain.Value.Type == m_carteTerrain)
            {
                m_listeTerrainObligatoire.AddRange(plateau.Adjacent(terrain.Key));
            }
            if (terrain.Value.Type == m_carteTerrain && terrain.Value.Couleur == Couleur.AUCUNE)
            {
                m_listeTerrainSecondaire.Add(terrain.Key);
            }
        }

        // On parcours notre liste d'adjacence et on retire les terrains qui ne sont pas concernés.
        for (int i = 0; i < m_listeTerrainObligatoire.Count; i++)
        {
            if (plateau[m_listeTerrainObligatoire[i]].Type != m_carteTerrain || plateau[m_listeTerrainObligatoire[i]].Couleur != Couleur.AUCUNE)
            {
                m_listeTerrainObligatoire.RemoveAt(i);
                i--;
            }
        }

        if (m_listeTerrainObligatoire.Count == 0)
        {
            if (m_listeTerrainTernaire.Count == 0)
            {
                foreach (Coordonnee coord in m_listeTerrainSecondaire)
                {
                    if (coord.Equals(coordonnee))
                    {
                        plateau[coordonnee].Couleur = m_couleur;
                        m_maisonsPlacees.Add(coordonnee);
                        m_nbMaisons--;

                        return(true);
                    }
                }
            }
            else
            {
                foreach (Coordonnee coord in m_listeTerrainTernaire)
                {
                    if (coord.Equals(coordonnee))
                    {
                        plateau[coordonnee].Couleur = m_couleur;
                        m_maisonsPlacees.Add(coordonnee);
                        m_nbMaisons--;

                        return(true);
                    }
                }
            }
        }
        else // sinon on voit si la coordonnee de destination correspond a un des terrains adjacents
        {
            foreach (Coordonnee coord in m_listeTerrainTernaire)
            {
                if (coord.Equals(coordonnee))
                {
                    plateau[coordonnee].Couleur = m_couleur;
                    m_maisonsPlacees.Add(coordonnee);
                    m_nbMaisons--;

                    return(true);
                }
            }

            foreach (Coordonnee coord in m_listeTerrainObligatoire)
            {
                if (coord.Equals(coordonnee))
                {
                    plateau[coordonnee].Couleur = m_couleur;
                    m_maisonsPlacees.Add(coordonnee);
                    m_nbMaisons--;

                    return(true);
                }
            }
        }

        return(false);
    }