Baixe aqui!

Foto 1
Foto 2

Requisitos:
biblioteca X11 (linux - modo gráfico)
bibliotecas de compilação C
bibliotecas Perl e Tk
recomendável resolução de tela de 1024x768 ou superior

1. Origens
Esse é um projeto da turma 14 do Curso de Ciências Moleculares orientado/organizado pelo prof. Gubi no final do 2o semestre de 2004, na disciplina Computação I.
Inspirados no Life (implementado em ambiente X11 - xlife), um autômato celular, resolvemos criar um jogo em que células de diferentes espécies se reproduzem e combatem entre si até dominar todo o ambiente. A forma de ataque e defesa lembra também o War, mas sem o componente dos dados. E o nome, é claro, é uma referência ao nosso grande biólogo moleculento Ubiratan, cuja sugestão para o 3o ep deu origem a tudo isso!

2. Como funciona
Assim como no Life, há uma matriz razoavelmente grande (geralmente 100x100) onde inicialmente são espalhadas aleatoriamente células - neste caso, de todas as espécies em igual quantidade.
As células de uma espécie não são comandadas por um "cérebro central": cada uma é um indivíduo separado e só tem em comum com as outras de sua espécie o seu modo de decisão.
Cada uma dessas células tem inicialmente uma quantidade mínima de energia, que adotamos como sendo 1 ATP. A partir daí, a cada rodada cada célula recebe 1 ATP e escolhe qual ação deseja executar.Também há um limite à quantidade de ATPs que uma célula pode ter, estabelecido em 10 ATPs.

Todas as ações são realizadas apenas nas adjacências da célula, ou seja, nas 4 casas ligadas a ela lateralmente. Para que a decisão seja tomada, a célula pode "ver" (recebe como parâmetro) apenas as casas num raio de duas casas ao seu redor, ou seja, um pedaço 5x5 da matriz. Essa matriz contém as seguintes informações:
- espécie que ocupa aquela casa (0 caso esteja vazia);
- quantidade de ATPs que aquela célula possui;
- vetor público da célula - usado para comunicação entre células, será comentado adiante.

As ações possíveis são:
- Fortalecer: a célula simplesmente fica parada, guardando o precioso ATP recebido.
- Ocupar: uma célula pode ocupar, ou seja, reproduzir-se para aquela casa, desde que ela esteja vazia. Além disso, ela determina qual fração de sua energia será transferida para a célula-filha.
- Atacar: uma célula pode atacar outra, vizinha, de uma espécie adversária. Ela deve dizer também qual a energia a ser gasta nesse ataque.
- Transferir: quando há células de uma mesma espécie vizinhas entre si, elas podem transferir ATPs entre si. Mais uma vez, a célula deve dizer quantos ATPs serão transferidos.
A cada ação está associado também um gasto de energia, além daquele decorrente da ação em si (parâmetro). Optamos por deixar 1 ATP como gasto pelo ataque, e as outras ações são "free". Então, por exemplo, se uma célula tem 9 ATPs e resolve atacar com 5, ela na verdade gastará 6 ATPs, 1 pelo ataque e mais 5 que é o quanto de dano ela vai ser capaz de inflingir no adversário.

Operações ilegais acontecem quando a célula tenta fazer algo proibido (duh!). As mais comuns são:
- tentar usar mais ATPs do que tem - por exemplo, uma célula com 2 ATPs tentar atacar com 1 ATP - ela gasta 1 pelo ataque e 1 do parâmetro, ficando com zero ATP - proibido!
- passar como parâmetro um número menor que zero ou maior que 9 - nesse caso, a intenção é considerada ilegal, independente da ação escolhida.
- atacar numa direção em que existe uma casa vazia ou célula de mesma espécie.
- tentar ocupar casas já ocupadas.
- tentar transferir ATPs para casas vazias ou onde se encontram células de outra espécie.
A punição para uma operação ilegal é a perda de ATPs: a célula infratora fica com apenas 1 ATP, além de ter seu vetor público zerado.

O vetor público é um vetor de 4 variáveis inteiras armazenado por cada célula. Essas variáveis são determinadas a cada iteração pela célula, que pode escolher qualquer valor - inclusive "sujeira" - para colocar ali. A idéia do vetor público é que, como ele é visto pelas células vizinhas, é possível a transmissão de informação entre células de mesma espécie - apesar de o vetor público de outras espécies ser visível também, é muito difícil fazer com que sua espécie seja capaz de decifrar o código usado por essas. Como as regras proíbem o uso de variáveis estáticas em uma espécie, o vetor público pode ser usado para a formação de comportamentos coletivos. Até agora, a principal utilidade deles foi na indicação da direção de transferência em células que não vêem inimigos próximos. Na foto, nota-se que a espécie em verde usa vetores públicos para transferência e a vermelha, não.

3. Rodando o jogo
Salve o arquivo bira.tar.gz e descompacte usando o comando "tar -zxf bira.tar.gz" no terminal. Uma pasta chamada BiraFight será criada, com os arquivos do jogo. Dentro dessa pasta, rode o arquivo Bira (com B maiúsculo) - "./Bira". Na janela haverá uma lista de possíveis arquivos de espécie que podem ser usados - selecione as que você deseja incluir no jogo (pressione Control ao clicar com o mouse), aí clique nos botões "Monta" e, a seguir, "Roda", e divirta-se!

4. Criando sua própria espécie
Para começar, você deve saber programar em C. Não estou muito disposto a escrever aqui absolutamente tudo que é preciso, então recomendo que você procure olhar o código de espécies simples (como a esp4.c) e fazer alguns testes. Para programar, é necessário ler pelo menos o motor.h (que contém a definição da struct INTENCAO) e o funcs.h, que contém a definição de favo - como é denominada uma casa - e muitas definições do jogo, como o gasto de cada operação.
Há também algumas variáveis globais que podem ser usadas livremente: o vetor popespecies, que dá a população de cada espécies, o inteiro iteracoes, que diz quantas iterações já foram, e o vetor gasto, que diz quanto ATP é gasto em cada operação. É importante ressaltar que todas as funções do módulo devem ser estáticas, exceto a função principal - que recebe um favo[5][5] e retorna uma INTENCAO. Uma ferramenta bastante útil é o Testador, incluso no pacote. Para usá-lo basta executar "./Testador arquivodeespécie.c". Clicando nas células você pode editá-las, incluindo o vetor público, copiá-las usando o botão direito, e colar usando o botão do meio (ou os dois juntos) do mouse. Quando você manda executar, ele imprime na saída-padrão a intenção retornada pela sua função. A praticidade desse programa está em que você pode alterar o código da espécie e recompilá-lo sem fechar o testador. Ele também funciona, assim como o programa principal, com arquivos .o além de .c, mas às vezes surgem alguns bugs relacionados a isso.


Qualquer dúvida, sugestão ou comentário, entre em contato comigo, com o prof. Marco Dimas Gubitoso (Gubi), ou com a lista da turma 14.