/// <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); } }
/// <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; }
/// <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; }
/// <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"); } }