/** * 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); }
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); } } } }
/** * 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); }
/// <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); }
/// <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); }
/// <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); }
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); }