示例#1
0
    protected override double GetStateEvaluation(AIGameState state)
    {
        double    score  = 1000;
        RawPlayer winner = state.IsGameEndedAndWinner();

        if (winner != null && winner.GetId() == playerId)
        {
            score += 10000;                                              // if it wins
        }
        else if (winner != null || state.GetPlayerById(playerId) == null)
        {
            score -= 10000;                                                              // if it loses
        }
        else
        {
            RawPlayer player = state.GetPlayerById(playerId);

            // INFO sobre el JUGADOR
            int    playerSlimes          = player.GetSlimes().Count;
            double totalPlayerMass       = 0;
            int    playerSlimesSplitable = 0;
            int    playersOverConquered  = 0;

            foreach (RawSlime sl in player.GetSlimes())
            {
                totalPlayerMass += sl.GetMass();
                if (sl.canSplit)
                {
                    playerSlimesSplitable++;
                }
                if (player.GetConqueredTiles().Contains(sl.GetActualTile()))
                {
                    playersOverConquered++;
                }
            }

            // INFO sobre los ENEMIGOS
            List <RawPlayer> enemies = state.GetPlayers().FindAll(p => true);
            enemies.Remove(player);
            int   enemiesSlimes          = 0;
            float totalEnemiesMass       = 0;
            int   enemiesThatCanAttackMe = 0;
            float minimumMass            = Int16.MaxValue;
            foreach (RawPlayer enemy in enemies)
            {
                foreach (RawSlime sl in enemy.GetSlimes())
                {
                    enemiesSlimes++;
                    totalEnemiesMass += sl.GetMass();

                    enemiesThatCanAttackMe += state.GetSlimesInAttackRange(sl).FindAll(r => r.GetPlayer().GetId() == player.GetId()).Count;
                    minimumMass             = Mathf.Min(sl.GetMass(), minimumMass);
                }
            }


            score += playerSlimes * 100;
            score += 4 * totalPlayerMass * GetAIError();
            score += playerSlimesSplitable * 40 * GetAIError();
            score += playersOverConquered * 40 * GetAIError();

            score -= 200 * (enemies.Count); // Cuanto menos jugadores, mejor.
            score -= 10 * enemiesSlimes;
            score -= 2 * totalEnemiesMass;
            score -= enemiesThatCanAttackMe * 3;
            score -= minimumMass;
        }

        Debug.Log(score);
        return(score * GetAIError());
    }
示例#2
0
    protected override double GetStateEvaluation(AIGameState state)
    {
        double    score  = 1000;
        RawPlayer winner = state.IsGameEndedAndWinner();

        if (winner != null && winner.GetId() == playerId)
        {
            score += 10000;                                              // if it wins
        }
        else if (winner != null || state.GetPlayerById(playerId) == null)
        {
            score -= 10000;                                                              // if it loses
        }
        else
        {
            RawPlayer player      = state.GetPlayerById(playerId);
            int       plConquered = player.GetConqueredTiles().Count;
            int       plSlimes    = player.GetSlimes().Count;

            double totalPlayerMass       = 0;
            int    playerSlimesSplitable = 0;

            foreach (RawSlime sl in player.GetSlimes())
            {
                totalPlayerMass += sl.GetMass();
                if (sl.canSplit)
                {
                    playerSlimesSplitable++;
                }
            }

            // INFO sobre los ENEMIGOS
            List <RawPlayer> enemies = state.GetPlayers().FindAll(p => true);
            enemies.Remove(player);
            int   enemiesSlimes          = 0;
            float totalEnemiesMass       = 0;
            int   enemiesThatCanAttackMe = 0;
            float minimumMass            = Int16.MaxValue;
            foreach (RawPlayer enemy in enemies)
            {
                foreach (RawSlime sl in enemy.GetSlimes())
                {
                    enemiesSlimes++;
                    totalEnemiesMass += sl.GetMass();

                    enemiesThatCanAttackMe += state.GetSlimesInAttackRange(sl).FindAll(r => r.GetPlayer().GetId() == player.GetId()).Count;
                    minimumMass             = Mathf.Min(sl.GetMass(), minimumMass);
                }
            }

            score += plConquered * 12;
            score += plSlimes * 10;
            score += playerSlimesSplitable * 5;

            score -= 200 * (enemies.Count);      // Cuanto menos jugadores, mejor.
            score -= totalEnemiesMass;           // Predileccio per atacar
            score -= enemiesSlimes * 100;        // slime morta
            score -= enemiesThatCanAttackMe * 2; // Com menys enemics puguin atacarme, millor
            score -= minimumMass * 5;            // Predileccio per atacar al que esta mes fluix
        }
        return(score * GetAIError());
    }
示例#3
0
    protected override double GetStateEvaluation(AIGameState state)
    {
        /*
         * CONTRINCANTES:
         * - Cuanto más masa, peor
         * - Cuanto menos slimes, mejor (me atacaran menos)
         * - Cuanto menos me puedan atacar, mejor
         * YO:
         * - Cuanto más masa, mejor
         * - Cuanto más slimes
         * - Cuanto más cerca de una slime enemiga con menos masa, mejor
         * CONQUERIR???
         */
        //bool hasRange = false;


        double    score  = 1000;
        RawPlayer winner = state.IsGameEndedAndWinner();

        if (winner != null && winner.GetId() == playerId)
        {
            score += 10000; // if it wins
        }
        else if (winner != null || state.GetPlayerById(playerId) == null)
        {
            score -= 10000; // if it loses
        }
        else
        {
            RawPlayer player = state.GetPlayerById(playerId);

            // Contrincantes
            List <RawPlayer> enemies = state.GetPlayers().FindAll(p => true);
            enemies.Remove(player);

            // INFO sobre el JUGADOR
            int    playerSlimes    = player.GetSlimes().Count;
            double totalPlayerMass = 0;

            int distanceToEnemy = Int16.MaxValue;
            foreach (RawSlime sl in player.GetSlimes())
            {
                totalPlayerMass += sl.GetMass();
                distanceToEnemy  = Mathf.Min(distanceToEnemy, state.GetDistanceToCloserEnemy(sl));
            }


            // INFO sobre los ENEMIGOS
            int   enemiesSlimes          = 0;
            float totalEnemiesMass       = 0;
            int   enemiesThatCanAttackMe = 0;
            float minimumMass            = Int16.MaxValue;
            foreach (RawPlayer enemy in enemies)
            {
                foreach (RawSlime sl in enemy.GetSlimes())
                {
                    enemiesSlimes++;
                    totalEnemiesMass += sl.GetMass();

                    enemiesThatCanAttackMe += state.GetSlimesInAttackRange(sl).FindAll(r => r.GetPlayer().GetId() == player.GetId()).Count;
                    minimumMass             = Mathf.Min(sl.GetMass(), minimumMass);
                }
            }

            //Debug.Log("TOTAL AI MASS: " + totalPlayerMass);
            score += totalPlayerMass;            // Ens interessa tenir molta massa.
            score += playerSlimes * 5;           // Si pot dividirse per arribar al objectiu, ho fara

            score -= totalEnemiesMass * 10;      // Predileccio per atacar
            score -= enemiesSlimes * 100;        // slime morta
            score -= distanceToEnemy;            // Com menys distancia millor
            score -= enemiesThatCanAttackMe * 2; // Com menys enemics puguin atacarme, millor
            score -= minimumMass * 5;            // Predileccio per atacar al que esta mes fluix
            score -= enemies.Count * 200;        // Predileccio per acabar amb un jugador.
        }

        return(score * GetAIError());
    }