Por que eu devo ler este artigo:

A inteligência artificial é uma área de muita necessidade, principalmente no universo de jogos quando os mesmos precisam ter personagens inteligentes que evoluam através das experiências no próprio jogo. Esse tipo de inteligência é traduzido nas linguagens de programação por meio de técnicas que permitam aos algoritmos salvar uma grande quantidade de dados e reusá-los para aprimorar o comportamento dos objetos.

Neste artigo trataremos de implementar uma simulação de mundo inteligente, onde vivem criaturas que, por si sós, se alimentam, reproduzem, andam e morrem. Os códigos apresentados também poderão ser usados para implementações com jogos (RPGs, arcade, estilo fazenda, etc.), animações gráficas diversas, dentre outras.

Por que eu devo ler este artigo:

O conceito de Inteligência Artificial é comumente definido como a inteligência exibida por máquinas ou softwares que se equipara ao comportamento racional humano. Baseada em conceitos como dedução, raciocínio e resolução automática de problemas, a IA e seus conceitos nunca foram tão buscados, explorados e utilizados pela humanidade como hoje. Alvo de inúmeras críticas e ceticismo por uma parte das pessoas que a estuda, a IA hoje está presente em jogos (RPGs principalmente, em vista da necessidade de ter personagens que evoluam e desenvolvam habilidades em detrimento dos aprendizados e experiências que tiveram), sistemas de animação gráfica, dentre outros.

Quando se trata de implementar IA em sistemas usando uma linguagem de programação comum (como Java, C# ou JavaScript) muitos desenvolvedores desconhecem os passos simples que podem levar a isso, ou até mesmo consideram que a inclusão de bibliotecas avançadas de scripts se faz necessária para lidar com isso.

Este artigo terá como objetivo a construção de um ecossistema virtual, um pequeno mundo que será populado dinamicamente e artificialmente por criaturas que se movimentam e lutam entre si por sobrevivência. Será basicamente uma implementação de um componente inteligente que pode ser usado em cenários reais de jogos, animações gráficas, dentre outros que necessitem que determinados personagens assumam características de inteligência artificial.

Cenário

O cenário de desenvolvimento se restringe a radicalmente simplificar o conceito de mundo simulado. Em teoria, um mundo seria uma grid bidimensional onde cada entidade ocupa uma célula inteira do quadrado, imaginando que esse plano fosse representado por um quadrado de dimensões {x, y} que seria dividido em células – menores partes possíveis – e, por sua vez, teriam dimensões {x/a, y/b}, onde a e b representam os graus de divisão máximos para os eixos horizontais e verticais do plano cartesiano.

Vamos chamar as entidades de criaturas. Há cada rodada, as criaturas recebem uma nova chance de executar alguma ação. Assim, cortamos ambos tempo e espaço em unidades com tamanho fixo: quadrados para o espaço e bolas para o tempo. Obviamente, essa não é uma aproximação real e apurada de como isso funciona em algoritmos mais complexos do tipo, mas para os propósitos deste artigo são mais que o suficiente, além de estabelecerem um paralelo mais didático com o desenvolvedor.

Em suma, iremos definir um objeto mundo com um plano, um vetor de strings que cria a grid do mesmo usando um caractere por quadrado. Veja na Listagem 1 o código que representa a criação da referida variável vetor que usaremos para representar este plano.

Listagem 1. Representação inicial do modelo de plano bidimensional.

var plano = ["@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
      "@@      @      ()     @ @",
      "@                          @",
      "@ @        @@@@            @",
      "@@         @  @    @@      @",
      "@@@          @@    @       @",
      "@ @@@        @             @",
      "@ @          @@@           @",
      "@  @@ ()                   @",
      "@ () @        () @@@       @",
      "@                 @        @",
      "@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
  ];

Perceba que a disposição dos elementos na tela se assemelha à que temos em telas de jogos que geram planos de fundos aleatórios como Pack Man, Super Mário, dentro outros do estilo. No modelo, os caracteres “@” representam as paredes e pedras geradas no meio do cenário, e o caractere “()” representa as criaturas (quatro, no total). Os espaços são simplesmente espaços comuns como você deve ter percebido. O leitor deve, inclusive, tomar cuidado se for usar essa estrutura em páginas HTML, uma vez que espaços em branco não são reconhecidos pelo browser, portanto devendo usar os caracteres de espace respectivos.

Esse array pode ser usado para criar o mundo “plano” em 2D que imaginamos. Tal objeto contém informações referentes ao tamanho e conteúdo do nosso mundo. Além disso, o objeto contém um método toString() que converte a representação matricial do mesmo em uma string que pode ser impressa, e que nos permite analisar o que está acontecendo em caso de querermos debugar o código. O objeto também tem uma função chamada turn(), que permite aos objetos de criatura atualizar (de dentro dele) por uma rodada e atualizar o objeto mundo como um todo, refletindo assim suas ações.

Representando o espaço

A grid que modela o objeto mundo tem largura e altura fixas. Os quadrados são identificados por suas respectivas coordenadas x e y. Para representar o espaço, criaremos uma classe que simulará basicamente o salvamento das duas informações dos eixos base, e a chamaremos de Vector. Certifique-se de criar a estrutura representada na Listagem 2 dentro do nosso arquivo global.js.

Listagem 2. Código de criação do objeto Vector no nosso modelo.

  01 function Vector(x, y) {
  02     this.x = x;
  03     this.y = y;
  04 }
  05 Vector.prototype.maisUm = function(outro) {
  06     return new Vector(this.x + outro.x, this.y + outro.y);
  07 };

A única novidade nessa listagem compreende o uso dos prototypes no JavaScript, que são estruturas que promovem a herança da Orientação a Objetos por intermédio da criação d ...

Quer ler esse conteúdo completo? Seja um assinante e descubra as vantagens.
  • 473 Cursos
  • 10K Artigos
  • 100 DevCasts
  • 30 Projetos
  • 80 Guias
Tenha acesso completo