示例#1
0
        /// <summary>
        /// Evaluation du board avec plusieurs coefficients heuristiques.
        /// Ces coefficients sont déterminés selon des techniques permettant
        /// d'indiquer quels facteurs de jeu garanti un meilleur
        /// pourcentage de réussite.
        /// </summary>
        public double Eval()
        {
            //Déclaration des variables
            int maxPlayerCoin, minPlayerCoin, maxPlayerMove, minPlayerMove, coinParity,
                mobility, whiteCorners, blackCorners, whiteStability, blackStability,
                maxCorners, minCorners, corners, maxStability, minStability, stability;

            //Initialisation des variables
            maxPlayerCoin      = minPlayerCoin = maxPlayerMove = minPlayerMove = coinParity =
                mobility       = whiteCorners = blackCorners = whiteStability = blackStability =
                    maxCorners = minCorners = corners = maxStability = minStability = stability = 0;

            //Initialisation de la matrice de valeurs pour valoriser les coins.
            int[,] mat_corner_weight = new int[, ] {
                { 20, -10, 1, 1, 1, 1, -10, 20 },
                { -10, -7, 1, 1, 1, 1, -7, -10 },
                { 1, 1, 1, 1, 1, 1, 1, 1 },
                { 1, 1, 1, 1, 1, 1, 1, 1 },
                { 1, 1, 1, 1, 1, 1, 1, 1 },
                { 1, 1, 1, 1, 1, 1, 1, 1 },
                { -10, -7, 1, 1, 1, 1, -7, -10 },
                { 20, -10, 1, 1, 1, 1, -10, 20 }
            };

            //Initialiation de la matrice de stabilité
            //La stabilité est définie en fonction du fait qu'un pion pourra être
            //retourné dans le tour même, dans un des tours à venir ou qu'il soit
            //impossible à être retourné.
            int[,] mat_stability_weight = new int[, ] {
                { 4, -3, 2, 2, 2, 2, -3, 4 },
                { -3, -4, -1, -1, -1, -1, -4, -3 },
                { 2, -1, 1, 0, 0, 1, -1, 2 },
                { 2, -1, 0, 1, 1, 0, -1, 2 },
                { 2, -1, 0, 1, 1, 0, -1, 2 },
                { 2, -1, 1, 0, 0, 1, -1, 2 },
                { -3, -4, -1, -1, -1, -1, -4, -3 },
                { 4, -3, 2, 2, 2, 2, -3, 4 }
            };


            //Récupère le nombre de pions des joueurs à maximiser et à minimiser
            maxPlayerCoin = isWhite ? board.GetWhiteScore() : board.GetBlackScore();
            minPlayerCoin = isWhite ? board.GetBlackScore() : board.GetWhiteScore();

            //Retourne une valeur entre -100 et 100 du rapport du nombre de pion à maximiser sur le total des deux joueurs
            if (maxPlayerCoin > minPlayerCoin && (maxPlayerCoin + minPlayerCoin) != 0)
            {
                coinParity = (100 * maxPlayerCoin) / (maxPlayerCoin + minPlayerCoin);
            }
            else if (maxPlayerCoin < minPlayerCoin && (maxPlayerCoin + minPlayerCoin) != 0)
            {
                coinParity = -(100 * minPlayerCoin) / (maxPlayerCoin + minPlayerCoin);
            }

            //Nombre de coups possibles des blancs et des noirs
            int nbrOfPlayableMoveWhite = Ops(true).Count;
            int nbrOfPlayableMoveBlack = Ops(false).Count;

            //Assigne le nombre de coups en fonction de qui maximiser/minimiser
            maxPlayerMove = isWhite ? nbrOfPlayableMoveWhite : nbrOfPlayableMoveBlack;
            minPlayerMove = isWhite ? nbrOfPlayableMoveBlack : nbrOfPlayableMoveWhite;

            //Retourne une valeur entre -100 et 100 du rapport du nombre de coups à maximiser sur le total des deux joueurs
            if (maxPlayerMove > minPlayerMove && (maxPlayerMove + minPlayerMove) != 0)
            {
                mobility = (100 * maxPlayerMove) / (maxPlayerMove + minPlayerMove);
            }
            else if (maxPlayerMove < minPlayerMove && (maxPlayerMove + minPlayerMove) != 0)
            {
                mobility = -(100 * minPlayerMove) / (maxPlayerMove + minPlayerMove);
            }

            //Retourne une valeur en fonction des pions posés sur le damier
            whiteCorners = EvaluateMatriceValue(mat_corner_weight, true);
            blackCorners = EvaluateMatriceValue(mat_corner_weight, false);

            //Détermine quel poids de case est adressé au joueur à maximiser
            maxCorners = isWhite ? whiteCorners : blackCorners;
            minCorners = isWhite ? blackCorners : whiteCorners;

            //Retourne une valeur entre -100 et 100 du rapport du poids des cases à maximiser sur le total des deux joueurs

            if (maxCorners > minCorners && (maxCorners + minCorners) != 0)
            {
                corners = (100 * maxCorners) / (maxCorners + minCorners);
            }
            else if (maxCorners < minCorners && (maxCorners + minCorners) != 0)
            {
                corners = -(100 * minCorners) / (maxCorners + minCorners);
            }

            //Retourne une valeur en fonction de la stabilité des pions placés sur le damier
            whiteStability = EvaluateMatriceValue(mat_stability_weight, true);
            blackStability = EvaluateMatriceValue(mat_stability_weight, false);

            //Détermine quelle stabilité est adressé au joueur à maximiser
            maxStability = isWhite ? whiteStability : blackStability;
            minStability = isWhite ? blackStability : whiteStability;

            //Retourne une valeur entre -100 et 100 du rapport de stabilité à maximiser sur le total des deux joueurs
            if (maxStability > minStability && (maxStability + minStability) != 0)
            {
                stability = (100 * maxStability) / (maxStability + minStability);
            }
            else if (maxStability < minStability && (maxStability + minStability) != 0)
            {
                stability = -(100 * minStability) / (maxStability + minStability);
            }

            //Retourne ces dernières valeurs avec des coéfficients selon leur importance
            return(2 * coinParity + 5 * mobility + 10 * corners + 15 * stability);
        }
示例#2
0
 static void PrintFinish(Board board)
 {
     Console.WriteLine(TITLE);
     Console.WriteLine($"FINI ! Score : {BLACK} : {board.GetBlackScore()}; {WHITE}: {board.GetWhiteScore()}");
     Console.WriteLine(TITLE);
 }