A Ilusão da Inteligência


       Autora: Andréia Duarte Bilenkij



       Para jogos que são single-players, ou para pes...
humanos. Esta tríplice distinção está no centro acadêmico da IA, e os diferentes
conjuntos de pensamentos são responsáveis...
caminho.


       1          Doom é lançado como primeiro jogo de                Máquina de estados
993        tiro em pri...
claramente a importância de jogadores de teste em todo o ciclo de desenvolvimento de
jogos.
         Também foi demonstrad...
Há muitas definições sobre o que é um agente autônomo, mas provavelmente o
melhor é esta:
       Um agente autônomo é um s...
Reynolds faz uso de uma excelente analogia para descrever os papéis de cada
uma dessas camadas em seu artigo “Steering Beh...
• Na camada de Subdivisão do Espaço, implementa-se a subdivisão do espaço
do jogo, definindo-se unidades (nós) nos quais a...
Máquinas de estado finito, ou FSMs como são geralmente referidos, é um
dispositivo ou um modelo de dispositivo, que tem um...
Aqui estão alguns exemplos de como as máquinas de estado finito têm sido
utilizados nos jogos:
       O comportamento dos ...
ele pode ser depurado. Desta forma, o programador de IA pode facilmente seguir a
seqüência de eventos que antecede o compo...
int alerta; //estado de alerta dos inimigos
                      struct Posicaotiro; //posição do ultimo disparo
        ...
if (Threatened())
           {
               if (StrongerThanEnemy())
           {
                   ChangeState(state_A...
jogo, a solução if-else torna-se um monstro que espreita nas sombras, esperando para
atacar. Quanto mais estados e as cond...
O melhor mecanismo para organizar os estados e que afetam as transições de
estado é uma tabela de transição de estado. Est...
IF Kitty_Hungry AND NOT Kitty_Playful
       SWITCH_CARTRIDGE eat_fish


       Todas as regras na tabela são testadas a c...
int telaX, telaY; // Posicao na tela
              int animInf, animAcao, animNum; // Informacao da Animacao, acao e o
   ...
compreender a si mesmo e como você lidaria com uma situação em que eles estão. A
fim de criar reações humanas, é necessári...
Upcoming SlideShare
Loading in …5
×

Game IA

2,909 views
2,790 views

Published on

Trabalho de Pesquisa sobre Inteligência Artificial em Jogos.

0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,909
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
131
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Game IA

  1. 1. A Ilusão da Inteligência Autora: Andréia Duarte Bilenkij Para jogos que são single-players, ou para pessoas que não têm conexão de rede, uma forma de atrair a atenção do jogador é criar personagens autônomos que agem como se fossem outros jogadores dispersos em uma rede. Neste aspecto, não se espera criar unidades inteligentes, mas sim criar uma “ilusão de inteligência”. Mas o que é essa coisa misteriosa que chamamos de inteligência artificial? A inteligência artificial é tornar os computadores capazes de executarem as tarefas de pensamento que os seres humanos são capazes de fazer. No que diz respeito a jogo, se o jogador acredita que o agente que ele está jogando contra é inteligente, então ele é inteligente. O objetivo é projetar agentes que fornecem a ilusão de inteligência, nada mais. Para os desenvolvedores de jogos eletrônicos, as aplicações computacionais de IA e o significado do termo é considerado diferente dos estudados e pesquisados no meio acadêmico. Para distinguir a inteligência artificial utilizada em jogos e no meio acadêmico, os desenvolvedores adotaram o termo Game AI. Já temos programas de computadores com capacidade sobrehumana de resolverem muitos problemas: aritmética, sorting, pesquisa, e assim por diante. Os computadores até jogam alguns jogos de tabuleiro melhor do que qualquer ser humano. Muitos destes problemas foram originalmente considerados problemas de IA, mas como eles foram resolvidos de forma mais abrangente, eles caíram fora do domínio de desenvolvedores IA. Mas há muitas coisas que os computadores não são bons e que para nós é trivial: reconhecer rostos familiares, falar a nossa própria língua, decidir o que fazer e ser criativo. Estes são os domínios de IA: tentando descobrir que tipos de algoritmos são necessários para mostrar essas propriedades. Na academia, alguns pesquisadores IA são motivados pela filosofia: a compreensão a natureza do pensamento e da natureza da inteligência e construção de software para o modelo como o pensamento pode funcionar. Alguns são motivados pela psicologia: compreender a mecânica do cérebro humano e os processos mentais. Outros são motivados pela engenharia: algoritmos de construção para executar tarefas como
  2. 2. humanos. Esta tríplice distinção está no centro acadêmico da IA, e os diferentes conjuntos de pensamentos são responsáveis por diferentes subcampos do assunto. No começo do desenvolvimento de jogos eletrônicos, a programação de IA era mais usualmente conhecida por “programação de jogabilidade”, pois não havia nada de inteligente sobre os comportamentos exibidos pelos personagens controlados pelo computador. A tabela 1 contém alguns exemplos de como a IA foi utilizada em jogos com o passar do tempo. A Descrição IA utilizada no 1 Primeiro jogo de computador, Spacewar, Nenhuma 962 para 2 jogadores. 1 Lançamento do jogo Pong, para 2 Nenhuma 972 jogadores. 1 Jogadores tinham que atirar em alvos Padrões de 974 móveis em Pursuit e Qwak. movimento 1 Gun Fight lançado, personagens com Padrões de 975 movimentos aleatórios. movimento 1 Space Invaders contém inimigos com Padrões de 978 movimentos padronizados, mas também atiram movimento contra o jogador. 1 O jogo Pac-man conta com movimentos Padrões de 980 padronizados dos inimigos, porém cada fantasma movimento (inimigo) tem uma “personalidade” sobre o modo em que caça o jogador. 1 O primeiro jogo de estratégia em tempo Máquina de estados 990 real, Herzog Wei, é lançado. Junto, os jogadores puderam noticiar uma péssima busca de
  3. 3. caminho. 1 Doom é lançado como primeiro jogo de Máquina de estados 993 tiro em primeira pessoa. 1 BattleCruiser: 3000AD é publicado Redes neurais 996 como o primeiro jogo a utilizar redes neurais em um jogo comercial 1 Half-Life é lançado e analisado como a Máquina de estados / 998 melhor IA em jogos até a época, porém, o jogo Script utiliza IA baseada em scripts. 2 O jogo Black & White é alvo da mídia a Utiliza redes neurais, 001 respeito de como as criaturas do jogo aprendem reinforcement e com as decisões feitas pelo jogador. observational learning. Game IA não são apenas redes neurais, sistema de aprendizagem e complexas estruturas matemáticas, mas principalmente envolve a criação de um ambiente. Os desenvolvedores de jogos estão interessados principalmente em construção de algoritmos que fazem personagens do jogo parecerem humanas. Game IA é comportamental, não cientifico. Como a ilusão de inteligência é subjetiva, por vezes, isso leva muito pouco esforço. Os designers da IA para o Halo, por exemplo, descobriu que seus jogadores de teste poderiam ser enganados em pensar que os agentes de inteligência artificial eram mais inteligentes, simplesmente aumentando o número de pontos de vida necessária para matá-los. Para uma sessão de testes que permitia que os agentes morressem muito facilmente (pontos de golpe baixo), o resultado foi que 36% dos testadores pensaram que a IA era muito fácil e 8% pensaram que a IA era muito inteligente. Para a próxima sessão de testes onde os agentes foram feitos para serem mais difíceis de matar, o resultado foi que 0% dos testadores acharam que o IA foi demasiado fácil e 43% acreditam que o IA foi muito inteligente! Este é o resultado surpreendente e mostra
  4. 4. claramente a importância de jogadores de teste em todo o ciclo de desenvolvimento de jogos. Também foi demonstrado que a percepção de um jogador do nível de inteligência de um agente de jogo pode ser consideravelmente reforçada, proporcionando o jogar com alguns visuais e/ou auditivas pistas quanto ao que o agente está “pensando”. Por exemplo, se o jogador entra em um quarto e assusta o agente, ele deve agir assustado. Se o seu jogo é um “stealth-‘em-up” como Thief e um personagem do jogo ouve algo suspeito, então deve começar a olhar ao redor e talvez balbuciar algumas palavras, como “O que foi?” ou “Tem alguém aí?”. Mesmo algo simples como se certificar de que um agente monitora o movimento dos agentes vizinhos com sua cabeça, pode contribuir significativamente para a percepção de um jogador. Deve-se ter cuidado ao projetar seu IA para não deixar o manto de ilusão cair, pois quando ele faz a crença do jogador no personagem do jogo evaporar, o jogo se torna menos divertido de jogar. Isso acontecerá se a IA é vista como agir estupidamente (correndo em paredes, ficar preso em cantos, não reagindo a estímulos óbvios) ou é apanhado “cheating” (ver através de paredes, exigindo menos ouro para construir unidades, a audição para ouvir um alfinete cair a 500 metros), então você deve ter grande cuidado para evitar qualquer uma destas armadilhas. Cheating AI (também chamado Rubberband AI) é um termo usado para descrever a situação em que os jogadores tem bônus no jogo, como ter mais pontos, a condução mais rápida, ou munição infinita. O uso de trapaça mostra as limitações da "inteligência" realizáveis artificialmente; em geral, em jogos onde a criatividade estratégica é importante, os seres humanos poderiam facilmente bater a IA após um mínimo de tentativa e erro, se não fosse pelo bônus. No contexto da programação de IA, cheating se refere apenas a qualquer privilégio concedido para o jogador, ou seja, uma forma de trapaça. Se o IA do jogo não está à altura do nível atual do jogador e das expectativas da demanda, o jogo vai está destinado a fracasso e sofrerá críticas. A chave para entender como criar jogos IA é saber o que se deseja como resultado final e, em seguida, construir o sistema de apresentação desses resultados. O que é um agente autônomo?
  5. 5. Há muitas definições sobre o que é um agente autônomo, mas provavelmente o melhor é esta: Um agente autônomo é um sistema situado dentro e como uma parte de um ambiente, capaz de sentir o ambiente e agir sobre ele. Se um agente autônomo se depara com uma situação inesperada, como encontrar um muro em seu caminho, ele terá a capacidade de reagir e ajustar o seu movimento nesse sentido. Por exemplo, você pode criar um agente autônomo para se comportar como um coelho e outro como uma raposa. Se, enquanto, mastigando a grama fresca e refrescante, o coelho se encontra no mesmo local que a raposa, irá automaticamente tentar contornar isso. Ao mesmo tempo, a raposa irá perseguir autonomamente o coelho. Ambos os eventos ocorrem sem qualquer outra intervenção do programador, uma vez instalado e funcionando, agentes autônomos simplesmente cuidam de si próprios. Isso não quer dizer que um agente autônomo deve ser capaz de lidar com qualquer situação, mas muitas vezes é muito útil ser capaz de conceder um montante de autonomia. Por exemplo, um problema comum é quando é necessário lidar com obstáculos dinâmicos. Obstáculos dinâmicos são os objetos no mundo do jogo que se movem ou mudam de posição, como outros agentes, por exemplo. O movimento de um agente autônomo pode ser dividido em três camadas: Seleção de ação: Esta é a parte do comportamento do agente responsável pela escolha de seus objetivos e decidir o que pretende seguir. É a parte responsável que diz “clique aqui” e “faça A, B e C”. Direção: Esta camada é responsável pelo cálculo da trajetória desejada necessário para satisfazer os objetivos e planos estabelecidos pela camada de seleção de ação. Comportamentos de direção estão nessa camada. Eles produzem uma força de direção que descreve onde um agente deve mover-se e quão rápido ele deve viajar para chegar lá. Locomoção: A camada inferior, locomoção, representa os aspectos mais mecânicos do movimento de um agente. É a forma de viajar de A para B. Por exemplo, se você tivesse aplicado a mecânica de um camelo, um tanque, e um peixinho e depois deu uma ordem para que eles viajem para o norte, todos eles iriam utilizar diferentes processos mecânicos para criar movimento, embora a sua intenção (para o norte) é idêntica. Ao separar essa camada da camada de direção, é possível utilizar, com poucas modificações, os mesmos comportamentos de direção para tipos completamente diferentes de locomoção.
  6. 6. Reynolds faz uso de uma excelente analogia para descrever os papéis de cada uma dessas camadas em seu artigo “Steering Behaviros for Autonomous Characters”. “Considere, por exemplo, alguns vaqueiros cuidando de um rebanho de gado fora do intervalo. Uma vaca vagueia longe do rebanho. O patrão diz para o vaqueiro buscar os perdidos. O vaqueiro vai com seu cavalo e guia a vaca, evitando obstáculos pelo caminho. Neste exemplo, o patrão representa a fuga de seleção de ação: percebendo que a situação do mundo mudou (a vaca saiu do rebanho) e estabelecendo uma meta (recuperar os vadios). O nível direção é representado pelo vaqueiro, que se decompõe o objetivo em uma série de sub-objetivos simples (abordar a vaca, evitar obstáculos, recuperar a vaca). A locomoção corresponde a um comportamento da direção para o vaqueiro e os cavalos. O vaqueiro move seu cavalo em direção ao alvo. Em termos gerais, estes sinais expressam conceitos como: ir mais rápido, ir mais devagar, vire a direita, vire a esquerda, e assim por diante. O cavalo implementa o nível de locomoção. Toma o vaqueiro como controle de entrada, e o cavalo se move na direção indicada. Este movimento é o resultado de uma complexa interação de percepção visual do cavalo, seu senso de equilíbrio, e seus músculos aplicando torques nas articulações de seu esqueleto.” Nem tudo é róseo e doce no mundo dos agentes autônomos. A aplicação da direção pode assediar o programador como um caminhão de novos problemas que precisam ser lidados. Alguns comportamentos podem envolver ajuste manual pesado, enquanto outros têm de ser cuidadosamente codificados para evitar o uso de grandes porções de tempo de CPU. Quando os comportamentos se concentram, geralmente cuidados devem ser tomados para evitar a possibilidade de dois ou mais deles se anularem mutuamente. Arquitetura em Camadas do Game IA O Game AI é geralmente incorporado ao projeto do jogo como um módulo separado que faz interface com o núcleo do engine. O módulo de IA é comumente dividido em camadas, como mostra a Figura 1.
  7. 7. • Na camada de Subdivisão do Espaço, implementa-se a subdivisão do espaço do jogo, definindo-se unidades (nós) nos quais a AI irá operar. • Na camada de busca de caminho, implementam-se algoritmos de busca de caminho para encontrar um caminho “razoável” entre dois nós no espaço do jogo. • Na camada de Comportamento, implementam-se algoritmos de tomadas de decisão, geralmente por meio de máquinas de estados, alem de seleção de destino para o personagem deve ir. • Finalmente, na camada de percepção, implementam-se os recursos necessários para que o personagem possa perceber o mundo do jogo, e determinar entradas que irão alimentar a camada de comportamentos. Máquinas de Estado Máquina de Estado Finita Historicamente, uma máquina de estados finitos é um dispositivo rigidamente formalizado utilizada pelos matemáticos para resolver problemas. A máquina de estado finito mais famoso é provavelmente o dispositivo hipotético de Alan Turing: a máquina de Turing, que ele escreveu em seu artigo, "On Computable Numbers." Esta era uma máquina que podia executar qualquer operação lógica pela leitura, escrita e apagamento de símbolos em uma fita infinitamente longa.
  8. 8. Máquinas de estado finito, ou FSMs como são geralmente referidos, é um dispositivo ou um modelo de dispositivo, que tem um número limitado de estados e pode operar tanto na entrada para fazer a transição de um estado para outro ou para causar uma saída ou ação. Uma máquina de estado finito só pode estar em um estado em qualquer momento no tempo. A idéia por trás de uma máquina de estado finito, portanto, é a de decompor o comportamento de um objeto em “pedaços” ou estados facilmente administráveis. Um exemplo do mundo real pode ser um interruptor de luz na parede, que é ligado e desligado. Transições entre estados são feitos pela potência de seu dedo. Ao passar rapidamente o interruptor para cima, faz a transição de OFF para ON, e sacudindo-a para baixo, faz a transição para OFF. Não há saída ou ação associada com o estado desligado (a menos que você considere a lâmpada está OFF como uma ação), mas quando está no estado que permite a eletricidade fluir através do interruptor e acender o quarto através do filamento de uma lâmpada. Veja a Figura 2. Qualquer sistema que tem um número limitado de possibilidades de que algo pode ser definido por um estado, pode ser representado como uma máquina de estado finito. Há muitos anos foi o instrumento para imbuir um agente de jogo com a ilusão de inteligência. Máquinas de estado finito são naturais de qualquer tipo de programa de computador e entender como usá-los eficazmente para criar jogos IA é tão difícil como à compreensão do sistema que você está tentando representar.
  9. 9. Aqui estão alguns exemplos de como as máquinas de estado finito têm sido utilizados nos jogos: O comportamento dos fantasmas em Pac-Man é implementado como uma máquina de estado finito. Existe um estado de evasão, que é o mesmo para todos os fantasmas, e as ações são executadas de forma diferente para cada fantasma. A ação do jogador em comer uma das pílulas de energia de energia é a condição para a transição para os fantasmas fugirem. A entrada de um timer correndo é a condição para a transição de fugir para perseguir. Os robôs de Quake são implementados como máquinas de estado finito. Têm estados como FindArmor, FindHealth, SeekCover e Run-Away. Mesmo as armas em Quake têm implementado as suas próprias mini máquinas de estado finito. Por exemplo, um foguete pode implementar estados como Move, TouchObject e Die. Jogadores em simuladores de esportes como o FIFA2002 são implementados como máquinas de estado. Têm estados como Strike, Dribble, ChaseBall e MarkPlayer. Além disso, as próprias equipes são freqüentemente implementadas como FSMs e pode ter estados como KickOff, Defender ou WalkOutOnField. Os NPCs (personagens não jogáveis) em RTSS (jogos em tempo real de estratégia), como Warcraft fazem uso de máquinas de estado finito. Têm estados como MoveToPosition, Patrol, e followpath. Usando Máquinas de Estado Finito. Há muitos propósitos para o uso de FSMs nos jogos, mas um dos mais intricados que você tem que lidar é tentar construir modelos de comportamento, uma vez que tentar simular os seres humanos é a simulação mais difícil. Como garantia de como é difícil simular o comportamento humano, há muitas histórias detalhadas de jogos IA que agentes foram confundidos com jogadores humanos e vice-versa por outros jogadores e espectadores, especialmente sistemas FSMs. É fácil encontrar FSMs de um tipo ou de outro em quase todos os jogos nas prateleiras. Aqui estão apenas algumas das razões pelas quais são utilizados: Eles são rápidos e de código simples. Há muitas maneiras de programar uma máquina de estado finito e quase todos eles são razoavelmente simples de implementar. Elas são fáceis de depurar. Como o comportamento de um agente de jogo é dividido em pedaços facilmente controlável, se um agente começa a agir estranhamente,
  10. 10. ele pode ser depurado. Desta forma, o programador de IA pode facilmente seguir a seqüência de eventos que antecede o comportamento do bug e agir em conformidade. Eles têm pouca sobrecarga computacional. Máquinas de estado finito quase não usam tempo do processador. Eles são intuitivos. Os seres humanos não funcionam como máquinas de estado finito, é claro, mas às vezes nós achamos que seria útil pensar em nosso comportamento desta forma. Da mesma forma, é bastante fácil de quebrar o comportamento de um agente do jogo em vários estados, para criar as regras necessárias para manipulá-los. Pela mesma razão, as máquinas de estado finito também tornam mais fácil para discutir o projeto de seu IA com os não-programadores (com os produtores e designers, por exemplo), proporcionando uma melhor comunicação e troca de idéias. Eles são flexíveis. Uma máquina de estado finito de um agente pode ser facilmente ajustada e afinada pelo programador para fornecer o comportamento exigido pelo designer de jogos. Também é uma simples questão de alargar o âmbito do comportamento de um agente, acrescentando novos estados e regras. Além disso, como máquinas de estado finito constitui uma estrutura sólida com a qual você pode combinar outras técnicas, tais como lógica fuzzy ou redes neurais. Máquina de Estados para Games Criar um ambiente crível para o jogo significa que você precisa considerar quantos elementos que o jogador poderá, eventualmente, concentrar sua atenção. Quanto mais, mais imersivo será o ambiente para o jogador quanto eles estão descobrindo a sua criação. No jogo, há pelo menos duas divisões de máquinas de estado que serão necessárias. A primeira máquina de estado irá lidar com a interface do jogo, que inclui se o jogo é pausado, se há diferentes modos, as coisas que o jogador pode e não pode ver e quaisquer outras opções que podem ser usadas para a interface. A segunda máquina de estado irá lidar com o que está realmente acontecendo no jogo, o estado atual do ambiente, os objetos do nível, objetivos cumpridos ou falhados, e todas as outras variáveis que são usadas para orientar e desafiar o jogador. Todos itens do jogo podem ser contidos dentro de uma estrutura como essa: GameLevelEstado struct {
  11. 11. int alerta; //estado de alerta dos inimigos struct Posicaotiro; //posição do ultimo disparo int shottime; //ultimo ciclo de tiro int refém; //refém resgatado int explosivos; int dialogo; //variável Dialogo int tanque; //tanque destruído int total; //missão concluída }; Existem várias maneiras de implementar máquinas de estado finito. Uma abordagem ingênua é usar uma série de declarações if-else ou uma declaração um pouco mais arrumada como o mecanismo switch. Usando um tipo enumerado para representar os Estados é algo como isto: enum StateType{RunAway, Patrol, Attack}; void Agent::UpdateState(StateType CurrentState) { switch(CurrentState) { case state_RunAway: EvadeEnemy(); if (Safe()) { ChangeState(state_Patrol); } break; case state_Patrol: FollowPatrolPath();
  12. 12. if (Threatened()) { if (StrongerThanEnemy()) { ChangeState(state_Attack); } else { ChangeState(state_RunAway); } } break; case state_Attack: if (WeakerThanEnemy()) { ChangeState(state_RunAway); } else { BashEnemyOverHead(); } break; }//end switch } Embora à primeira vista, esta abordagem parece razoável, quando aplicada a praticamente qualquer coisa mais complicado do que o mais simples dos objetos do
  13. 13. jogo, a solução if-else torna-se um monstro que espreita nas sombras, esperando para atacar. Quanto mais estados e as condições são adicionados, este tipo de estrutura acaba parecendo espaguete, tornando o fluxo do programa difícil de entender e cria um pesadelo de depuração. Além disso, ele é inflexível e difícil de ultrapassar o âmbito da sua concepção original, que deve ser desejável ... e como todos sabemos, é mais comum. A menos que você está projetando uma máquina de estados para implementar o comportamento muito simples, você quase certamente irá encontrar-se aprimorando o primeiro agente a lidar com circunstâncias imprevistas, para antes de afiar o comportamento para obter os resultados que você pensou que estava indo para chegar ao primeiro planejado a máquina do Estado! Além disso, como um codificador de inseminação artificial, muitas vezes você vai exigir que um estado execute uma ação específica (ou ações) quando ele é inicialmente inscritos ou quando o estado é encerrado. Por exemplo, quando um agente entra no estado RunAway você pode querer que ele erga seus braços no ar e grite "arghhhhhhh!" Quando finalmente escapa e muda de estado para patrulhar, você pode desejar para emitir um suspiro, limpar a sua testa, e dizer: "Ufa!" Estas são ações que só ocorrem quando o estado de fuga é entrado ou saído e não durante a etapa de atualização de costume. Consequentemente, esta funcionalidade adicional deve ser idealmente construído em sua arquitetura de máquina de estado. Flexibilidade Mantendo o seu IA flexível é extremamente importante. O mais modular que seja implementada as rotinas, mais será possível de expandi-las no futuro. É importante compreender que a concepção de um IA para jogos é muito mais que um processo interativo, você precisa experimentar as coisas e construir sobre elas. O objetivo na criação de uma boa IA é possuir unidades que reajam em situações que parecem realistas em um ambiente em que parece interativo. Se não houver flexibilidade, será difícil expandir a abrangência das ações de suas unidades, mais tarde, quando você decidir aumentar o mundo do jogo para se sentir mais completo ou interativo. Tabelas de Transição de Estado
  14. 14. O melhor mecanismo para organizar os estados e que afetam as transições de estado é uma tabela de transição de estado. Este é apenas o que diz que é uma tabela de condições e os estados dessas condições para conduzir. Tabela 2.1 mostra um exemplo do mapeamento para os estados e condições mostradas no exemplo anterior. Esta tabela pode ser consultada por um agente em intervalos regulares, permitindo-lhe fazer quaisquer transições de estado necessárias com base no estímulo que recebe do ambiente de jogo. Cada estado pode ser modelado como um objeto separado ou função existente externos ao agente, fornecendo uma arquitetura limpa e flexível. Um que é muito menos propenso a Spaghettification que a abordagem if- then/switch discutido na seção anterior. Imagine um gatinho robô. É brilhante e bonito, e tem fio de bigode e um slot em seu estômago, onde os cartuchos - análogos a seus estados - pode ser plugado. Cada um destes cartuchos é programado com a lógica, possibilitando o gatinho a executar um conjunto específico de ações. Cada conjunto de ações codifica um comportamento diferente, por exemplo, “brincar com a corda", "comer peixe", ou “defecar no tapete." Sem um cartucho dentro da barriga do gatinho será apenas uma escultura metálica inanimada. O gatinho é muito habilidoso e tem a capacidade de trocar de forma autônoma o seu cartucho por outro se encarregado de fazê-lo. Ao fornecer as regras que determinam quando um cartucho deve estar ligado, é possível encadear seqüências de inserções de cartucho que permitam a criação de todos os tipos de comportamento interessante e complicado. Estas regras são programadas em um minúsculo chip localizado dentro da cabeça do gatinho, que é análoga à tabela de transição de estados que discutimos anteriormente. O chip se comunica com as funções internas do gatinho para recuperar as informações necessárias para processar as regras (como, por exemplo, se o gato está com fome ou quer brincar). Como resultado, o chip de transição de estado pode ser programado com regras como:
  15. 15. IF Kitty_Hungry AND NOT Kitty_Playful SWITCH_CARTRIDGE eat_fish Todas as regras na tabela são testadas a cada passo de tempo e as instruções são enviadas para o gato para mudar os cartuchos em conformidade. Esse tipo de arquitetura é muito flexível, tornando mais fácil para ampliar o repertório do gatinho, adicionando novos cartuchos. Cada vez que um novo cartucho é adicionado, o proprietário só é obrigado a tomar uma chave de fenda para a cabeça do gatinho a fim de remover e reprogramar a regra do estado de transição do chip. Não é necessário interferir com qualquer outro circuito interno. Uma abordagem alternativa é inserir as regras para as transições de estado dentro dos próprios estados. Aplicando este conceito para o robô, o chip de transição de estado pode ser dispensada e as regras movidas diretamente para os cartuchos. Por exemplo, o cartucho para "brincar com a corda" pode monitorar o nível do da fome do gato e instruí-lo a mudar os cartuchos para o "comer peixe" quando ele sentir que a fome cresce. Por sua vez o cartucho "comer peixe" pode monitorar entranhas do gatinho e instruí-lo a mudar para o cartucho "defecar no tapete" quando estes níveis estiverem perigosamente elevados. Ações da Unidade Em um jogo onde o jogador controla as unidades, é importante ter uma significativa e bem organizada informações sobre elas. Sem isso, a adaptação das unidades para os jogadores vai se tornar difícil e a interface de usuários com O Jogo pode sofrer. Se o jogador não sente que está a controlar as unidades e obtendo informações adequadas, então tudo o que ele está a fazer é clicar em torno de uma interface e todos os aspectos envolventes do Jogo realizado serão perdidos, significando que o jogador não terá nenhuma diversão e pode se tornar frustrado. Para ter uma noção de que tipo de informação você pode querer fornecer ao jogador, vamos dar uma olhada nesta estrutura de dados: struct Personagem { struct Posição pos; // Posicao no Mapa
  16. 16. int telaX, telaY; // Posicao na tela int animInf, animAcao, animNum; // Informacao da Animacao, acao e o numero do frame da animacao int rank; // Rank int saude; // Saude int num; // Numero da unidade int grupo; // Numero do grupo int estilo; // Estilo da unidade (elfo, humano) struct AnimationObject animObj; // Objeto Animacao para uma complexa animacao }; Agora, algumas definições de variáveis: A variável pos determina a posição da unidade no mundo do jogo e as variaveis telaX e telaY são úteis para adicionar informações facilmente sobre a unidade na tela, tais como a saúde ou a seleção de informações. O animInf, animAcao e animNum se referem ao estado atual da animação das unidades, que será elaborado para a tela. A variável de saúde e rank são bastante obvias. A variável num é o numero que a unidade está na matriz principal. A variável grupo determina a que grupo pertence a unidade. A única vez que uma unidade não deve estar em um grupo é se a unidade está morta. O estilo e as variáveis animObj são informações sobre como os gráficos da unidade serão elaborados. Construindo um Passado Básico É hora de iniciar a construção de mais informações para dá mais vida as unidades. Você precisa pensar sobre que tipo de ações e reações você quer que as unidades possuam. Você quer que eles sejam controlados pelas emoções? Você quer que eles sejam capazes de paralisar? Fugir? Agir como um louco? É possível adicionar variáveis para determinar os estados emocionais. A melhor maneira de tentar entender como os componentes de sua unidade reagirão, é tentar
  17. 17. compreender a si mesmo e como você lidaria com uma situação em que eles estão. A fim de criar reações humanas, é necessário entender como um humano reagiria. Há um outro lado para isso, quase o oposto de uma reação humana, que é proporcionar uma experiência de síntese que não é baseado na realidade, mas sim com base em desafiar o jogador. Em vez de fazer as suas unidades com base em seus instintos, você terá que pensar em qualquer maneira que você quer que suas unidades reajam. O ponto é que você tem que tomar as decisões sobre todos os aspectos ou você pode acabar com o plano, criando reações chatas que são muito fáceis de prever, ou mesmo aparentemente aleatória. Qualquer uma destas características pode arruinar um jogo.

×