Integrando Lógica Fuzzy ao Desenvolvimento de Jogos MARCOS ROMERO [email protected] Universidade Federal do Pará – Departamento de Informática Projeto JEDI - Jogos Eletrônicos Distribuídos e Inteligentes Resumo A Inteligência Artificial possui muitas aplicações em jogos. Uma das técnicas usadas é a da lógica Fuzzy, que é uma extensão da lógica booleana. Neste artigo apresentamos noções básicas da lógica Fuzzy; uma biblioteca para integração da lógica Fuzzy em jogos; um formato para modelos Fuzzy e um editor gráfico que facilita a criação dos modelos. Palavras-chaves : Inteligência Artificial; Lógica Fuzzy; Programação de Jogos. 1. Introdução A Inteligência Artificial (IA) pode ser descrita como uma tentativa de modelar aspectos do pensamento humano no computador. A sua aplicação em jogos eletrônicos tem como objetivo fazer com que os jogadores sintam como se estivessem jogando contra oponentes reais e inteligentes. Este tem sido um grande desafio na programação de jogos, mas no futuro os jogos serão principalmente avaliados pela qualidade de sua Inteligência Artificial. Uma das tecnologias de IA que tem sido usada em jogos é a lógica Fuzzy. A lógica Fuzzy é um conjunto maior da lógica convencional (booleana) que foi estendida para lidar com o conceito de verdades parciais, ou seja, valores que estão entre “completamente verdadeiro” e “completamente falso”. Neste artigo iremos examinar diversas ferramentas que possibilitam a implementação da lógica Fuzzy em jogos. A maior parte destas ferramentas foram desenvolvidas pela empresa “Louder Than A Bomb! Software” (www.LouderThanABomb.com ). 2. Fundamentos da lógica Fuzzy Na lógica tradicional, os conjuntos são precisos, ou você pertence 100% a um conjunto ou não pertence. Um conjunto de pessoas jovens pode ser definido como todas as pessoas que têm menos de 25 anos, qualquer um que tiver 25 anos ou mais será classificado como Adulto (ou “não jovem”). A lógica Fuzzy permite que uma pessoa possa ter 100% de participação no conjunto “jovem”, e ao mesmo tempo ter 20% de participação no conjunto “Adulto”. As duas operações mais comuns em conjuntos Fuzzy são o MIN e MAX. O operador MIN retornar o menor valor entre dois ou mais valores, o que equivale ao operador lógico “AND”. O operador MAX retornar o maior valor entre dois ou mais valores, o que equivale ao operador lógico “OR”. As variáveis lingüísticas Fuzzy são conceitos como “Energia”, “Temperatura” e “Distância”. Elas são compostas por conjuntos que define o seu estado, por exemplo, na variável “Temperatura” pode haver os conjuntos “Baixa”, “Média”, “Alta”. Cada conjunto é representado por uma função de participação que define o seu formato. As formas mais comuns de funções são a triangular e a trapezoidal. Depois que as variáveis lingüísticas Fuzzy são definidas para um modelo, é preciso produzir as regras que definirão o que deve ser feito nas diversas situações. As regras consistem basicamente de instruções do tipo Se..Então. Como exemplo usaremos duas variáveis para representar as energias de dois personagens de um jogo e será feito uma análise para definir as diversas ações que um dos personagens deve executar. Ex: Se minha_energia está baixa E energia_oponente está alta Então a Ação é fugir Se minha_energia está alta E energia_oponente está baixa Então a Ação é atacar No final da análise o resultado passa por um processo de defuzzificação que tem como objetivo a conversão de um valor Fuzzy em um valor discreto. Existem dois métodos principais de defuzzificação : Center of Gravity e Mean of Maximum. 3. Biblioteca para lógica Fuzzy Existe uma biblioteca para lógica Fuzzy chamada FFLL (Free Fuzzy Logic Library). Ela tem o código-fonte aberto, foi escrita em C++ e é otimizada para aplicações que requerem alto desempenho, como jogos eletrônicos. A FFLL foi originalmente lançada como parte do livro "AI Game Programming Wisdom". Apresentamos abaixo a hierarquia de classes do FFLL com uma breve descrição de cada uma delas: FFLLBase (classe base para todas as outras classes) ♦ FuzzyModelBase ♦ FuzzyVariableBase (define as variáveis, cada variável possui uma lista de conjuntos) • ♦ ♦ ♦ ♦ FuzzyOutVariable (define as variáveis de saída) FuzzySetBase (define os conjuntos) • ♦ (contém as variáveis e as regras que definem um modelo) FuzzyOutSet (esta classe é usada para os conjuntos das variáveis de saída) MemberFuncBase (classe abstrata que define o tipo de curva que um conjunto possui) • MemberFuncSCurve (esta é a forma de Curva-S, consiste de 7 pontos) • MemberFuncSingle (consiste de apenas um ponto, usada para valores discretos) • MemberFuncTrap (forma de trapézio) • MemberFuncTri (forma triangular) DefuzzVarObj (classe abstrata para as variáveis de defuzzificação) • COGDefuzzVarObj (variáveis usadas na defuzzificação "Center of Gravity") • MOMDefuzzVarObj (variáveis usadas na defuzzificação "Mean of Maximum") DefuzzSetObj (classe abstrata para os conjuntos de defuzzificação) • COGDefuzzSetObj (conjuntos usados na defuzzificação "Center of Gravity") • MOMDefuzzSetObj (conjuntos usados na defuzzificação "Mean of Maximum") RuleArray (Esta classe mantém a lista de regras do modelo) 4. Formato para modelos Fuzzy A biblioteca FFLL usa o FCL (Fuzzy Control Language) como formato para os modelos Fuzzy. As especificações para a sintaxe do FCL estão descritas no documento 61131-7 da IEC (International Electrotechnical Commission). A seguir está um exemplo de modelo devidamente comentado para facilitar o entendimento. (* Os parenteses com os asteristicos são usados para comentários *) FUNCTION_BLOCK (* variáveis de entrada *) VAR_INPUT Our_Heath REAL; Enemy_Health REAL; END_VAR (*variável de saída *) VAR_OUTPUT Aggressiveness END_VAR REAL; (* definição dos conjuntos que compõem as variáveis *) FUZZIFY Our_Health TERM Near_Death := (0,0) (0,1) (50,0) ; TERM Good := (14,0) (50,1) (83,0) ; TERM Excellent := (50,0) (100,1) (100,0) ; END_FUZZIFY FUZZIFY Enemy_Health TERM Near_Death := (0,0) (0,1) (50,0) ; TERM Good := (14,0) (50,1) (83,0) ; TERM Excellent := (50,0) (100,1) (100,0) ; END_FUZZIFY FUZZIFY Aggressiveness TERM Run_Away := 1; TERM Fight_Defensively := 2; TERM All_Out_Attack := 3; END_FUZZIFY (*especifica o método de defuzzificação: MOM - Mean of Maximum *) DEFUZZIFY valve METHOD: MoM; END_DEFUZZIFY (* bloco para especificação das regras do modelo *) RULEBLOCK first AND: MIN; ACCU: MAX; RULE 0: IF (Our_Health IS Near_Death) AND (Enemy_Health IS Near_Death) THEN (Aggressiveness IS Fight_Defensively) RULE 1: IF (Our_Health IS Near_Death) AND (Enemy_Health IS Good) THEN (Aggressiveness IS Run_Away) RULE 2: IF (Our_Health IS Near_Death) AND (Enemy_Health IS Excellent) THEN (Aggressiveness IS Run_Away) RULE 3: IF (Our_Health IS Good) AND (Enemy_Health IS Near_Death) THEN (Aggressiveness IS All_Out_Attack) RULE 4: IF (Our_Health IS Good) AND (Enemy_Health IS Good) THEN (Aggressiveness IS Fight_Defensively) RULE 5: IF (Our_Health IS Good) AND (Enemy_Health IS Excellent) THEN (Aggressiveness IS Fight_Defensively) RULE 6: IF (Our_Health IS Excellent) AND (Enemy_Health IS Near_Death) THEN (Aggressiveness IS All_Out_Attack) RULE 7: IF (Our_Health IS Excellent) AND (Enemy_Health IS Good) THEN (Aggressiveness IS All_Out_Attack) RULE 8: IF (Our_Health IS Excellent) AND (Enemy_Health IS Excellent) THEN (Aggressiveness IS Fight_Defensively) END_RULEBLOCK END_FUNCTION_BLOCK 5. O editor Spark! Spark! é um editor de lógica Fuzzy que facilita a criação e integração da lógica Fuzzy em aplicações. O tempo necessário para a criação e ajuste de um sistema de lógica Fuzzy é drasticamente reduzido em relação aos métodos tradicionais de escrita da lógica Fuzzy. O programa estará disponível em três versões: • Spark! Viewer - Esta é a versão gratuita do programa. Ele permite que os modelos sejam visualizados, e possibilita a alteração de algumas características nos modelos que são definidas durante a criação deles. • Spark! Developer - Versão para os desenvolvedores iniciantes. Permite a criação dos modelos Fuzzy e as definições de elementos que poderão ser alterados pelo usuário final usando o visualizador Spark!Viewer. • Spark! Professional - Semelhante à versão "Developer" porém com mais recursos. Atualmente, apenas a versão Spark!Viewer está disponível. Spark! têm uma simples e intuitiva interface gráfica com o usuário permitindo que os modelos Fuzzy sejam rapidamente criados e modificados. Usando o Spark!, você pode criar modelos de lógica Fuzzy e permitir que o usuário final modifique-o usando a ferramenta gratuita Spark!Viewer. Isto é útil para aplicações como jogos eletrônicos onde você espera que o usuário final possa manipular a inteligência artificial do jogo sem que seja necessário que ele aprenda uma linguagem de script ou que fique modificando uma série de números em arquivos textos. Figura 1 - Modelo Fuzzy no Spark! A figura 1 mostra os elementos de um modelo Fuzzy carregado no ambiente do Spark. As duas variáveis de entrada são "Our_Health" e "Enemy_Health". O modelo possui uma variável de saída chamada "Aggressiveness". São mostrados também os conjuntos que definem as funções de participação para cada variável. No exemplo temos os conjuntos "Excellent", "Good" e "Near_Death" para a variável "Enemy_Health" e os conjuntos "Run_Away", "Fight_Defensively" e "All_Out_Attack" para a variável "Aggressiveness". Figura 2 - Composição de uma variável A figura 2 ilustra o conteúdo da variável "Our_Health". Os conjuntos que compõem as variáveis são representados graficamente permitindo uma fácil compreensão do modelo. Podem-se alterar os pontos que definem a curva diretamente no gráfico. São suportados 4 tipos de curvas para as funções de participação : "singleton", "Curva-S", "triangular", "trapezoidal". Figura 3 - As regras do modelo Enquanto que na maioria das ferramentas de lógica Fuzzy as regras são definidas em um formato de planilha, no Spark! elas são definidas graficamente. Basta clicar nos conjuntos das variáveis de entrada e associar a um resultado e a regra já está criada, como mostra a figura 3. As linhas em negrito indicam a regra que está ativa no momento. Os botões, que representam os conjuntos, podem ser movidos para facilitar a visualização. 6. Considerações finais Uma boa implementação de Inteligência Artificial em um jogo torna a ação dos personagens menos previsível, de forma que o jogador poderá esperar reações diferentes em cada partida. Isto aumenta em muito a vida útil de um jogo. A IA também está possibilitando o surgimento de novos estilos de jogos, como é o caso do jogo “The Sims”, onde o objetivo é orientar as ações de uma família. Com o avanço tecnológico, boas ferramentas têm surgido para auxiliar nesta difícil tarefa de tornar os jogos mais inteligentes. Além disso, as configurações dos computadores dos jogadores têm melhorado, permitindo que uma maior parte do processamento de um jogo seja dedicado à IA. A área de desenvolvimento de jogos tem se mostrado como um excelente campo de pesquisa para a ciência da computação. Um jogo apresenta aspectos de diversas disciplinas como Inteligência Artificial, Sistemas Distribuídos, Computação Gráfica, Engenharia de Software, Estruturas de Dados e outras. 7. Referências bibliográficas • • LaMothe, André. Tricks of the Windows Game Programming Gurus. USA: Sams, 1999. Rabin, Steve (editor). AI Game Programming Wisdom. USA: Charles River Media, 2002. • • www.gameai.com www.LouderThanABomb.com