/// <summary>
        /// Ajouter une pièce (s'il y en a déjà de son type, on incrémente le nombre de pièces, sinon on l'ajouter à la liste)
        /// </summary>
        /// <param name="piece">La pièce à ajouter</param>
        public void AjouterPiece(Piece piece)
        {
            bool bTrouve = false;

            foreach (PieceCapturee p in PiecesCapturees)
            {
                if (p.Piece.GetType() == piece.GetType())
                {
                    p.Incrementer();
                    bTrouve = true;
                }
            }
            if (!bTrouve)
            {
                PiecesCapturees.Add(new PieceCapturee(piece, StpParent));
            }
        }
Пример #2
0
        /// <summary>
        /// Calcule le nombre de pièces d'un type (pour une couleur) présentes dans la grille
        /// </summary>
        /// <param name="typePiece">Le type de pièce</param>
        /// <param name="couleur">La couleur des pièce</param>
        /// <returns>Le nombre de pièces</returns>
        public int CalculerNombrePieces(Type typePiece, Couleur couleur)
        {
            int nbPieces = 0;

            for (int x = 0; x < TAILLE_GRILLE_JEU; x++)
            {
                for (int y = 0; y < TAILLE_GRILLE_JEU; y++)
                {
                    Piece piece = ObtenirPiece(new Coordonnee(x, y));
                    if (piece != null && piece.EstDeCouleur(couleur) && piece.GetType() == typePiece)
                    {
                        nbPieces++;
                    }
                }
            }
            return(nbPieces);
        }
        /// <summary>
        /// Calcule la cote du coup
        /// </summary>
        public void CalculerCote()
        {
            if (PieceCible != null)
            {
                if (PieceCible.EstVisible) // Si la cible est visible, on la classe selon le poid de la pièce,
                {                          // positif si on gagne et négatif si on perd
                    if (PieceAttaquant.GetType() == PieceCible.GetType())
                    {
                        Cote = 0;
                    }
                    else
                    {
                        if (DeterminerSiGagne(PieceAttaquant, PieceCible))
                        {
                            Cote = LIST_IMPORTANCE_PIECES[PieceCible.GetType()];
                        }
                        else
                        {
                            Cote = -LIST_IMPORTANCE_PIECES[PieceAttaquant.GetType()];
                        }
                    }
                }
                else // Si elle est invisible, on calcule la probabilité que ce soit de chaque type
                {
                    int nombrePieces = Jeu.CalculerNombrePieces(CouleurIA);
                    List <Tuple <Type, double> > probabilites = new List <Tuple <Type, double> >
                    {
                        new Tuple <Type, double> (
                            typeof(Marechal),
                            (2 * Jeu.CalculerNombrePieces(typeof(Marechal), CouleurIA) - 1) / (double)nombrePieces
                            ),
                        new Tuple <Type, double> (
                            typeof(General),
                            (2 * Jeu.CalculerNombrePieces(typeof(General), CouleurIA) - 1) / (double)nombrePieces
                            ),
                        new Tuple <Type, double> (
                            typeof(Colonel),
                            (2 * Jeu.CalculerNombrePieces(typeof(Colonel), CouleurIA) - 2) / (double)nombrePieces
                            ),
                        new Tuple <Type, double> (
                            typeof(Commandant),
                            (2 * Jeu.CalculerNombrePieces(typeof(Commandant), CouleurIA) - 3) / (double)nombrePieces
                            ),
                        new Tuple <Type, double> (
                            typeof(Capitaine),
                            (2 * Jeu.CalculerNombrePieces(typeof(Capitaine), CouleurIA) - 4) / (double)nombrePieces
                            ),
                        new Tuple <Type, double> (
                            typeof(Lieutenant),
                            (2 * Jeu.CalculerNombrePieces(typeof(Lieutenant), CouleurIA) - 4) / (double)nombrePieces
                            ),
                        new Tuple <Type, double> (
                            typeof(Sergent),
                            (2 * Jeu.CalculerNombrePieces(typeof(Sergent), CouleurIA) - 4) / (double)nombrePieces
                            ),
                        new Tuple <Type, double> (
                            typeof(Demineur),
                            (2 * Jeu.CalculerNombrePieces(typeof(Demineur), CouleurIA) - 5) / (double)nombrePieces
                            ),
                        new Tuple <Type, double> (
                            typeof(Eclaireur),
                            (2 * Jeu.CalculerNombrePieces(typeof(Eclaireur), CouleurIA) - 8) / (double)nombrePieces
                            ),
                        new Tuple <Type, double> (
                            typeof(Espion),
                            (2 * Jeu.CalculerNombrePieces(typeof(Espion), CouleurIA) - 1) / (double)nombrePieces
                            ),
                        new Tuple <Type, double> (
                            typeof(Drapeau),
                            (2 * Jeu.CalculerNombrePieces(typeof(Drapeau), CouleurIA) - 1) / (double)nombrePieces
                            ),
                        new Tuple <Type, double> (
                            typeof(Bombe),
                            (2 * Jeu.CalculerNombrePieces(typeof(Bombe), CouleurIA) - 6) / (double)nombrePieces
                            )
                    };

                    // On classe les résultats en ordre décroissant
                    probabilites.Sort((a, b) => { return((int)((b.Item2 - a.Item2) * 100)); });

                    List <Tuple <Type, double> > meilleursProbabilites = new List <Tuple <Type, double> >();

                    bool   bEstPareil = true;
                    double dScore     = probabilites[0].Item2;
                    for (int i = 0; i < probabilites.Count && bEstPareil; i++)
                    {
                        if (probabilites[i].Item2 != dScore)
                        {
                            bEstPareil = false;
                        }
                        else
                        {
                            meilleursProbabilites.Add(probabilites[i]);
                        }
                    }

                    // On choisi une pièce qui a le résultat le plus grand
                    Random rnd = new Random(DateTime.Now.Millisecond);

                    Type typePiece = meilleursProbabilites[rnd.Next(meilleursProbabilites.Count)].Item1;

                    Piece pieceCibleTemporaire = (Piece)Activator.CreateInstance(typePiece, new object[] { CouleurIA });

                    // Et on applique la logique de cote avec le candidat possible
                    if (PieceAttaquant.GetType() == pieceCibleTemporaire.GetType())
                    {
                        Cote = 0;
                    }
                    else
                    {
                        if (DeterminerSiGagne(PieceAttaquant, pieceCibleTemporaire))
                        {
                            Cote = LIST_IMPORTANCE_PIECES[pieceCibleTemporaire.GetType()];
                        }
                        else
                        {
                            Cote = -LIST_IMPORTANCE_PIECES[PieceAttaquant.GetType()];
                        }
                    }
                }
            }
        }