예제 #1
0
 /// <summary>
 /// Método privado que ativa a cor para um agente, dependendo das suas
 /// caraterísticas.
 /// </summary>
 /// <param name="kind">Género do agente (humano ou zombie).</param>
 /// <param name="mov">Tipo de movimento do agente (jogador ou IA).</param>
 private void SetAgentColor(AgentKind kind, AgentMovement mov)
 {
     if (kind == AgentKind.Zombie && mov == AgentMovement.AI)
     {
         // Ativar cor para zombie movido pela IA
         SetColor(colAIZombieFg, colAIZombieBg);
     }
     else if (kind == AgentKind.Zombie && mov == AgentMovement.Player)
     {
         // Ativar cor para zombie movido pelo jogador
         SetColor(colPlayerZombieFg, colPlayerZombieBg);
     }
     else if (kind == AgentKind.Human && mov == AgentMovement.AI)
     {
         // Ativar cor para humano movido pela IA
         SetColor(colAIHumanFg, colAIHumanBg);
     }
     else if (kind == AgentKind.Human && mov == AgentMovement.Player)
     {
         // Ativar cor para humano movido pelo jogador
         SetColor(colPlayerHumanFg, colPlayerHumanBg);
     }
 }
예제 #2
0
        /// <summary>
        /// Método privado que cria um novo agente no mundo de jogo.
        /// </summary>
        /// <param name="kind">Género do agente (zombie ou humano).</param>
        /// <param name="movement">Tipo de movimento (jogador ou IA).</param>
        /// <param name="id">ID único do agente.</param>
        private void NewAgent(AgentKind kind, AgentMovement movement, int id)
        {
            // Posição inicial do agente
            Coord pos;
            // Referência ao agente
            Agent agent;

            // Escolher um local aleatório desocupado para colocar o agente
            do
            {
                pos = new Coord(
                    rand.Next((int)options.XDim),
                    rand.Next((int)options.YDim));
                // Este ciclo continua até que um local desocupado tenha sido
                // encontrado
            } while (world.IsOccupied(pos));

            // Instanciar novo agente
            agent = new Agent(id, pos, kind, movement, (World)world);

            // Guardar agente no array de agentes
            agents[id] = agent;
        }
예제 #3
0
 /// <summary>
 /// Método construtor.
 /// </summary>
 /// <param name="enemy">Agentes inimigos, a perseguir ou evitar.</param>
 /// <param name="runAway">
 /// Indica se os agentes inimigos devem ser evitados (<c>true</c>)
 /// ou perseguidos (<c>false</c>).</param>
 /// <param name="world">
 /// Referência, só de leitura, ao mundo de simulação.
 /// </param>
 public AIMovement(AgentKind enemy, bool runAway, IReadOnlyWorld world)
     : base(world)
 {
     this.enemy   = enemy;
     this.runAway = runAway;
 }
예제 #4
0
        /// <summary>
        /// Método construtor, instancia um novo agente.
        /// </summary>
        /// <param name="id">ID único do agente.</param>
        /// <param name="pos">Posição inicial do agente.</param>
        /// <param name="kind">
        /// Género inicial do agente (zombie ou humano).
        /// </param>
        /// <param name="movement">Tipo de movimento inicial do agente (por
        /// "inteligência artificial" ou controlado pelo jogador).
        /// </param>
        /// <param name="world">Referência ao mundo de simulação.</param>
        public Agent(int id, Coord pos,
                     AgentKind kind, AgentMovement movement, World world)
        {
            // Género dos agentes considerados inimigos do agente a ser criado
            AgentKind enemy;
            // Indica se o agente a ser criado deve fugir (true) ou não (false)
            // dos inimigos
            bool runaway;

            // Guardar as referências passadas no construtor
            ID         = id;
            Pos        = pos;
            Kind       = kind;
            Movement   = movement;
            this.world = world;

            // Adicionar o agente ao mundo de simulação
            world.AddAgent(this);

            // Definir género dos inimigos e se o agente deve ou não fugir
            // deles, dependendo do género de agente a ser criado
            switch (kind)
            {
            case AgentKind.Zombie:
                // Se agente for zombie os seus inimigos são humanos e
                // não deve fugir deles (antes pelo contrário)
                enemy   = AgentKind.Human;
                runaway = false;
                break;

            case AgentKind.Human:
                // Se agente for humando os seus inimigos são zombies e
                // deve fugir deles
                enemy   = AgentKind.Zombie;
                runaway = true;
                break;

            default:
                // Lançar uma exceção caso seja um género desconhecido de
                // agente
                throw new InvalidEnumArgumentException(
                          "Unknown agent kind");
            }

            // Definir classe concreta que define o movimento dos agentes
            switch (movement)
            {
            case AgentMovement.Player:
                // Movimento controlado pelo jogador
                moveBehavior = new PlayerMovement(world);
                break;

            case AgentMovement.AI:
                // Movimento controlado por IA
                moveBehavior = new AIMovement(enemy, runaway, world);
                break;

            default:
                // Movimento desconhecido, lançar exceção
                throw new InvalidEnumArgumentException(
                          "Unknown movement type");
            }
        }