Birafight

De Wikoleculares
Revisão de 22h13min de 19 de julho de 2006 por Rend (discussão | contribs) (Cat)
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para navegação Ir para pesquisar

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!

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.

Download e Requisitos

Baixe o arquivo tareado aqui.

Para compilar e rodar o jogo, é necessário que seu sistema tenha instaladas:

biblioteca X11 (GNU/Linux - modo gráfico)
bibliotecas de compilação C
bibliotecas Perl e Tk

É recomendável resolução de tela de 1024x768 ou superior.

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!

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.

Dúvidas e sugestões

Qualquer dúvida, sugestão ou comentário, entre em contato com o Renato, ou o Bira, ambos da T14, ou ainda com o prof. Marco Dimas Gubitoso (Gubi).