Por Dalton Lopes Martins
Após a explosão do uso doméstico da Internet, na metade dos 90, uma tecnologia tornou-se a coqueluche dos desenvolvedores de software para ambientes de rede e sistemas distribuídos: os agentes de software. No entanto, agentes não são programas que rodam apenas em ambientes voltados para redes, como veremos a seguir, mas podem ser utilizados em várias situações, como agentes de interface (lembram-se do “chato” clip do Word?), gerenciadores de desktop, entre outras aplicações.
Mas, o que define, o que determina que um programa seja um agente de software? Um agente é, antes de mais nada, um programa desenvolvido em uma linguagem de programação qualquer. No entanto, há algumas características na implementação de um agente que o diferenciam de um programa clássico.
O agente deve possuir alguns requisitos necessários para que seja considerado como tal: um ciclo de vida contínuo no tempo, um ambiente de atuação, sensores que recolham informações do ambiente, atuadores que causem mudanças no ambiente e autonomia, ou seja, funcionamento independente da interferência do usuário. Agora, podemos definir melhor cada um desses requisitos.
O ambiente é a área de atuação do agente e pode ser, teoricamente, qualquer parte independente que possamos identificar num sistema. Podemos considerar como ambiente o sistema de arquivos local onde podemos ter rodando um agente de mirror, que espelha o conteúdo de um diretório em outro; podemos considerar como ambiente a Internet no caso de agentes spider, que caminham de site em site verificando a validade de links; podemos considerar como ambiente uma LAN (Local Area Network) no caso de um agente que verifique os usuários conectados e as aplicações que usam; ou, até mesmo podemos considerar um ambiente a própria área de desktop do sistema operacional no caso de um agente de interface.
Os sensores são os mecanismos que utilizamos para captar as mudanças que ocorrem no ambiente, como os sockets (mecanismo que cria uma conexão entre duas máquinas através de uma porta de comunicação e do IP de ambas) e os métodos que permitem obter informações do sistema, como rotinas para obtenção de data, hora, listagem de um diretório, etc.
Os atuadores são os mecanismos que utilizamos para efetuar alguma alteração no ambiente, como os próprios sockets (a conexão criada é bi-direcional, permitindo tanto ler quanto escrever), métodos para apagar arquivos, para desenhar algum objeto na tela, exibir informações, etc.
O ciclo de vida de um agente representa o tempo em que ele se encontra em execução no objetivo de realizar uma determinada tarefa. Após esse tempo, o processo que executa o agente irá morrer ou ficará “dormindo” durante outro intervalo de tempo. Como exemplo, podemos imaginar um agente que realiza backup de um servidor FTP para o disco local da máquina de um usuário. Se o agente ficar o tempo todo lendo o servidor, a máquina do usuário irá ficar praticamente paralisada. No entanto, o agente lê as informações de arquivos do servidor, atualiza no cliente e dorme por um tempo, retornando após para novamente procurar por mudanças no ambiente.
A autonomia é a principal característica de um programa que o torna um agente. Ela indica que o programa será executado independente da intervenção do usuário, ou seja, ele será capaz de controlar seu próprio fluxo de ações.
Desta forma, temos caracterizado os requisitos que tornam um programa um agente. A partir disso, podemos imaginar diferentes aplicações e tecnologias que possam servir como motivação e base de apoio no desenvolvimento de programas orientado a agentes na programação de jogos de computador.
Agentes de software e desenvolvimento de Jogos
No desenvolvimento de jogos, um fator importante e essencial é a inteligência que há por trás da interface, ou seja, o mecanismo que vai processar as ações tomadas pelo usuário e gerar uma reação por parte do sistema ao usuário. A programação clássica dessa inteligência se dá através do paradigma comportamental, ou seja, o programa supõe uma série de comportamentos possíveis por parte do usuário e, com base nisto, irá gerar uma reação também previamente determinada. O problema dessa forma de lidar com a inteligência do sistema é que ela limita as ações possíveis por parte do usuário e permite que o mesmo descubra o padrão de análise de movimentos utilizado pelo programa, gerando aquelas cômicas situações onde o usuário cria mecanismos para burlar o sistema e assim avançar no jogo.
Os agentes podem ser utilizados para resolver esses problemas e criar jogos mais dinâmicos e interativos. A autonomia de execução de um agente pode ter vários níveis de complexidade, permitindo desde o nível mais básico onde o agente possa controlar suas próprias ações, até o nível mais alto, onde o agente possa tomar decisões orientado a metas específicas e utilizar mecanismos de análise para verificar se está sendo bem sucedido ou não.
Esse nível de programação exige por parte do programador o conhecimento de alguns conceitos que possam auxiliar no modelamento do agente, como processamento distribuído, threads que permitam a execução paralela de pedaços de um programa, construção paralela de sensores e atuadores que permitam o nível de interação desejada, entre outros fatores.
Iremos trabalhar cada um desses conceitos ao longo do tempo e fornecer exemplos de aplicações desenvolvidas na linguagem JAVA. Por enquanto, fica a idéia e a motivação inicial para se considerar uma nova forma de programação no desenvolvimento de jogos para computadores.