Пример #1
0
    // Deep copy of AIGameState
    private AIGameState GetCopy()
    {
        UpdatePlayers();

        Matrix rawMatrix = matrix.GetRawCopy();

        List <RawPlayer> rawPlayers = new List <RawPlayer>();

        foreach (RawPlayer pl in players)
        {
            RawPlayer rawPl = pl.GetCopy();
            rawPlayers.Add(rawPl);

            // Sync dels conqueredtiles
            foreach (TileData tiledata in pl.GetConqueredTiles())
            {
                TileData matrixTile = rawMatrix.getTile((int)tiledata.getPosition().x, (int)tiledata.getPosition().y);
                rawPl.Conquer(matrixTile);
            }
        }

        // Recorrem la llista de RawSlimes actualitzant les tiledata de matrix.
        foreach (RawPlayer pl in rawPlayers)
        {
            foreach (RawSlime sl in pl.GetSlimes())
            {
                // Substituim la RawTileData provisional que te RawSlime per la de la matriu (perque quedin enllaçades)
                TileData slimeTile  = sl.GetTileData();
                TileData matrixTile = rawMatrix.getTile((int)slimeTile.getPosition().x, (int)slimeTile.getPosition().y);
                sl.SetTile(matrixTile);
            }
        }

        return(new AIGameState(condicionVictoria, rawMatrix, rawPlayers, currentTurn, currentPlayer, playerActions, victoryValue));
    }
Пример #2
0
        static void sendMovementToMatchBall(NetworkConnection conn, int playerID)
        {
            ServerDataPackage     s = conn.ReadUDP() as ServerDataPackage;
            PlayerMovementPackage movementPackage = new PlayerMovementPackage();
            RawPlayer             correctPlayer   = null;

            movementPackage.PlayerID = playerID;
            if (s == null)
            {
                return;
            }
            foreach (RawPlayer p in s.Players)
            {
                if (p.ID == playerID)
                {
                    correctPlayer = p;
                    break;
                }
            }
            if (s.Ball.PositionY < correctPlayer.PositionY + GameInitializers.GetPlayerHeight(8) / 2)
            {
                movementPackage.PlayerMovement = ClientMovement.Up;
            }
            else
            {
                movementPackage.PlayerMovement = ClientMovement.Down;
            }
            conn.SendTCP(movementPackage);
        }
Пример #3
0
    public RawPlayer GetCopy()
    {
        RawPlayer       rawPlayer = new RawPlayer(id, turnActions, statsCoreInfo, actionsPerSlime);
        List <RawSlime> rawSlimes = new List <RawSlime>();

        foreach (RawSlime sl in slimes)
        {
            RawSlime rawSl = sl.GetCopy();
            rawSl.SetPlayer(rawPlayer);
            rawSlimes.Add(rawSl);
        }
        rawPlayer.SetSlimes(rawSlimes);
        return(rawPlayer);
    }
Пример #4
0
    public RawPlayer GetRawCopy()
    {
        RawPlayer       rawPlayer = new RawPlayer(id, actions, statsCoreInfo, statsCoreInfo.slimeCountActionGain);
        List <RawSlime> rawSlimes = new List <RawSlime>();

        foreach (Slime sl in slimes)
        {
            RawSlime rawSl = sl.GetRawCopy();
            rawSl.SetPlayer(rawPlayer);
            rawSlimes.Add(rawSl);
        }
        rawPlayer.SetSlimes(rawSlimes);
        return(rawPlayer);
    }
Пример #5
0
    public AIGameState GetGameState()
    {
        Matrix rawMatrix = matrix.GetRawCopy();

        List <RawPlayer> rawPlayers = new List <RawPlayer>();

        foreach (Player pl in players)
        {
            RawPlayer rawPl = pl.GetRawCopy();
            rawPlayers.Add(rawPl);
            // Sync dels conqueredtiles
            foreach (Tile tile in pl.GetConqueredTiles())
            {
                TileData tiledata   = tile.GetTileData();
                TileData matrixTile = rawMatrix.getTile((int)tiledata.getPosition().x, (int)tiledata.getPosition().y);
                rawPl.Conquer(matrixTile);
            }
        }

        // Recorrem la llista de RawSlimes actualitzant les tiledata de matrix.
        foreach (RawPlayer pl in rawPlayers)
        {
            foreach (RawSlime sl in pl.GetSlimes())
            {
                // Substituim la RawTileData provisional que te RawSlime per la de la matriu (perque quedin enllaçades)
                TileData slimeTile  = sl.GetTileData();
                TileData matrixTile = rawMatrix.getTile((int)slimeTile.getPosition().x, (int)slimeTile.getPosition().y);
                sl.SetTile(matrixTile);
                //Debug.Log("SLIME " + sl.GetId() + " ON (" + matrixTile.getPosition().x + " " + matrixTile.getPosition().y + ")");
            }
        }

        /*if(matrix.EqualsTo(rawMatrix)){
         *  Debug.Log("MATRIX COPIED CORRECTLY");
         * }*/

        switch (condicionVictoria)
        {
        case ModosVictoria.CONQUISTA:
            return(new AIGameState(condicionVictoria, rawMatrix, rawPlayers, currentTurn, players.IndexOf(currentPlayer), playerActions, percentageTilesToWin));

        case ModosVictoria.MASA:
            return(new AIGameState(condicionVictoria, rawMatrix, rawPlayers, currentTurn, players.IndexOf(currentPlayer), playerActions, massToWin));

        default:
            return(new AIGameState(condicionVictoria, rawMatrix, rawPlayers, currentTurn, players.IndexOf(currentPlayer), playerActions, 0));
        }
    }
Пример #6
0
    public RawPlayer IsGameEndedAndWinner()
    {
        RawPlayer ret = null; //si no trobem guanyador retornem null
        int       index;
        bool      find;

        //sempre comprovem la condicio de asesinato
        if (players.Count == 1)
        {
            return(players[0]);
        }
        switch (condicionVictoria)
        {
        case ModosVictoria.CONQUISTA:
            find  = false;
            index = 0;
            while (!find && index < players.Count)
            {
                if (players[index].GetConqueredTiles().Count / victoryValue >= matrix.TotalNumTiles())
                {
                    find = true;
                    ret  = players[index];
                }
                index++;
            }
            break;

        case ModosVictoria.MASA:
            find  = false;
            index = 0;
            while (!find && index < players.Count)
            {
                if (players[index].GetTotalMass() >= victoryValue)
                {
                    find = true;
                    ret  = players[index];
                }
                index++;
            }
            break;
        }
        return(ret); //si no troba guanyador retornem null, si hi ha guanyador retornem el guanyador
    }
Пример #7
0
        private void ApplyServerPositions(ServerDataPackage gameState)
        {
            for (int i = 0; i < gameState.Players.Count; i++)
            {
                Player    localPlayer;
                RawPlayer serverPlayer = gameState.Players[i];

                if ((localPlayer = GetPlayerWithID(serverPlayer.ID)) == null)
                {
                    continue;
                }

                localPlayer.PositionX = serverPlayer.PositionX;
                localPlayer.PositionY = serverPlayer.PositionY;
            }

            Structure.Ball.PositionX = gameState.Ball.PositionX;
            Structure.Ball.PositionY = gameState.Ball.PositionY;
        }
Пример #8
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());
    }
Пример #9
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());
    }
Пример #10
0
 public void SetPlayer(RawPlayer player)
 {
     this.player = player;
 }
Пример #11
0
 public void Conquer(RawPlayer pl)
 {
     this.conquerer = pl;
 }
Пример #12
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());
    }