[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: O Jogo "Vida"



Ola Bernardo e
demais colegas da Lista,

Saudacoes Cordiais a Todos !

Muito boa a sua replica ! Se voce nao sabe, o espirito solidario e 
cooperativo e a producao de Open Software e uma atitude tipicamente Hacker 
... Sim, HACKER ! Dennis Rithie ( Criador do Unix e da Linguagem C ), Bjarne 
Stroustrup ( Criador do C++ ), Linus Trovalds ( Criador do Kernel do Linux ) 
e Tannenbaum ( Criador do Minix ) sao HACKER'S

David Mitinick e todos estes simplorios que destroem sistemas ou pertubam a 
harmonia das coisas sao CRACKER'S. A midia - que, em geral, nao busca a 
verdade - e que confunde as coisas e divulga erros.

Voce claramente escreveu pensando em C, nao em C++ : fica portanto mais 
dificil pensar nos objetos e metodos.E um fonte procedural. No seu programa 
ve-se facilmente a preocupacao com a modularizacao e a identacao. Estas sao 
atitudes de programacao positivas.

Em fidelidade ao espirito hacker vou colaborar contigo, tornando seu codigo 
mais flexivel ...

Voce define : int Tabuleiro[10][10]. os 10's nao estao justificados. Logo, 
sao aquilo que chamamos "numeros magicos". Voce pode fazer :

///
// Atribua a L e C dois valores naturais quaisquer, maiores que um
///////
#define NUM_DE_LIN L
#define NUM_DE_COL C
int Tabuleiro[NUM_DE_LIN-1][NUM_DE_COL-1];

Com isso voce da liberdade a quem for usar seu programa de escolher um 
tabuleiro com as dimensoes que desejar (limitas pela resolucao do monitor de 
video), numformato retangular qualquer.

Para que voce possa implentar quaisquer regras e nao so as de Conway, (uma 
promessa que eu fiz) voce precisa separar "alhos de bugalhos". A funcao 
abaixo, recebe as coordenadas X e Y de uma casa do tabuleiro e devolve o 
numero de casas vizinhas ocupadas :

int vizinhas_ocupadas(int X,int Y)
{
int lin,col;
int ocupadas=0;

for(lin=X-1;lin<=X+1;lin++)
for(col=Y-1;col<=Y+1;col++)
  if((lin!=X || col!=Y))
   if(lin>=0 && lin<NUM_DE_LIN && col>=0 && col<NUM_DE_COL)
    ocupadas += Tabuleiro[lin][col];

return(ocupadas);
}

Agora, o valor retornado pela funcao acima pode ser passado para uma funcao 
que ocupa ou desocupa as casas ao criterio do usuario do seu programa. Para 
ver como fazer isso, previamente defina:

#define CVO_0 1
#define CVO_1 1
#define CVO_2 0
#define CVO_3 2
#define CVO_4 1
#define CVO_5 1
#define CVO_6 1
#define CVO_7 1
#define CVO_8 1

As constantes CVO_n significam "Casas Vizinhas Ocupada e n". Assim, CVO_1 
significa O QUE FAZER QUANDO O NUMERO DE CASAS VIZINHAS OCUPADAS POR 1(UM).  
Se CVO_n for zero (#define CVO_n 0) significa que nada se fara a casa. Se 
CVO_n for um (#define CVO_n 1) significa que a casa sera desocupada. 
Finalmente, se CVO_n for dois (#define CVO_n 2) significa que a casa sera 
ocupada.

Conforme voce pode verificar, as definicoes acima sao AS REGRAS DE CONWAY, 
mas voce estara dando ao usuario a liberdade para que ele experiencie as 
regras que desejar.

Bom, como implementar isso ?

Tendo recebido da funcao "vizinhas_ocupadas" o numero de casas vizinhas em 
torna da casa de coordenadas X e Y que estao ocupadas, passamos as mesmas 
coordenadas X,Y e o valor de retorno  a funcao abaixo :

void aplica_regras(int ocupadas, int X, int Y)
{
switch(ocupadas)
{ case 0 : if(CVO_0)
             Tabuleiro[X][Y]=CVO_0 - 1;
            break;
   case 1 : if(CVO_1)
             Tabuleiro[X][Y]=CVO_1 - 1;
            break;
   case 2 : if(CVO_2)
             Tabuleiro[X][Y]=CVO_2 - 1;
            break;
   case 3 : if(CVO_3)
             Tabuleiro[X][Y]=CVO_3 - 1;
            break;
   case 4 : if(CVO_4)
             Tabuleiro[X][Y]=CVO_4 - 1;
            break;
   case 5 : if(CVO_5)
             Tabuleiro[X][Y]=CVO_5 - 1;
            break;
   case 6 : if(CVO_6)
             Tabuleiro[X][Y]=CVO_6 - 1;
            break;
   case 7 : if(CVO_7)
             Tabuleiro[X][Y]=CVO_7 - 1;
            break;
   case 8 : if(CVO_8)
             Tabuleiro[X][Y]=CVO_8 - 1;
            break;
  };
}

Estou supondo que voce sabe que em C a avaliacao e semi-booleana ( 0=falso, 
diferente de zero=verdadeiro) e que a variavel Tabuleiro e global. Bom, aqui 
fica cumprido o que falei, qual seja, de que e possivel fazer um programa 
que implementa QUAISQUER REGRAS  e nao so as REGRAS DE CONWAY, bastando para 
tanto modificar os valores das constantes CVO_n definidas no 
pre-processamento.

Na proxima mensagem vou falar sobre um fenomeno interantissimo que observei 
e que nao vi citado na literatura e que tem profundas implicacoes sobre o 
jogo. E possivel implementa-lo sem maiores problemas.

Caro Bernardo, que tal um jogo tridimenssional ? imagine um cubo, divida 
suas arestas em partes iguais. Selecione um cubinho dentro dele. Esse 
cubinho esta em relacao com 6 outros cubos, pelas faces; com 12, pelas 
arestas e com 8 pelos vertices. Seria uma versao tridimenssional do jogo de 
Conway ! Como ficariam as regras ? E a exposicao ?

Um abraco a Todos,
Um abraco ao Bernardo
Paulo Santa Rita
7,1618,16062001

>From: bmat@zipmail.com.br
>Reply-To: obm-l@mat.puc-rio.br
>To: obm-l@mat.puc-rio.br
>Subject: Re: O Jogo "Vida"
>Date: Thu, 14 Jun 2001 23:08:08 -0300
>
>Desculpem a demora, mas com Testes de Seleção, listas, 1a Fase da OBM 
>(Puxa,
>vocês capricharam esse ano, hein?) e provas na escola fiquei sem tempo pra
>LER as mensagens. Só há pouco tomei conhecimento desse jogo Vida e 
>interessei-me
>por fazer um programa (fácil, simples, mas ilustrativo) sobre a proposta
>inicial de Conway.
>O código-fonte em C vai abaixo. Ele funciona bem em MS-DOS. Para funcionar
>em Linux precisa-se modificar um _getch() por
>getchar() no loop, mas acho que não tem mais nenhuma 
>incompatibilidade(espero).
>Na verdade, fiz isso pois a saída fica mais "apresentável". Tomei a 
>liberdade
>de criar o tabuleiro com uma "margem" que é sempre zero pra facilitar o
>loop for.
>----------Início Código de Programação C-------------
>#include <stdio.h>
>
>int main()
>{
>int Tabuleiro[10][10];
>int x, y, tot;
>
>/* Inicializa o tabuleliro com zeros */
>
>	for(x = 0; x < 10; x++)
>		for(y = 0; y < 10; y++)
>			Tabuleiro[x][y] = 0;
>
>/* lê os dados do teclado até que seja dada a casa (0,0) */
>
>	printf("Entre os dados:\n");
>	scanf("%d %d", &x, &y);
>
>	while (x != 0 && y != 0)
>	{
>		Tabuleiro[x][y] = 1;
>		scanf("%d %d", &x, &y);
>		getchar();
>	}
>
>/* imprime-se o tabuleiro inicial */
>
>    printf("---------------\n");
>    for(x = 1; x < 9; x++)
>	{
>		for(y = 1; y < 9; y++)
>			printf("%d ", Tabuleiro[x][y]);
>		printf("\n");
>	}
>	printf("---------------\n");
>
>/*	o programa espera por 'c' para fazer outra iteração e
>	qualquer outro comando (qualquer MESMO) sai do programa */
>
>	while(_getch() == 99)
>	{
>	   for(x = 1; x < 9; x++)
>	      for(y = 1; y < 9; y++)
>	         {
>		    tot = 0;
>		    if(Tabuleiro[x-1][y-1] == 1) tot += 1;
>		    if(Tabuleiro[x-1][y+0] == 1) tot += 1;
>		    if(Tabuleiro[x-1][y+1] == 1) tot += 1;
>		    if(Tabuleiro[x+0][y-1] == 1) tot += 1;
>		    if(Tabuleiro[x+0][y+1] == 1) tot += 1;
>		    if(Tabuleiro[x+1][y-1] == 1) tot += 1;
>		    if(Tabuleiro[x+1][y+0] == 1) tot += 1;
>		    if(Tabuleiro[x+1][y+1] == 1) tot += 1;
>
>// Aplicação das "Leis de Conway"
>		    if( tot == 3) Tabuleiro[x][y] = 1;
>		    else if( tot == 2);
>	            else Tabuleiro[x][y] = 0;
>		}
>
>// Mostra o tabuleiro na tela
>		for(x = 1; x < 9; x++)
>		{
>		    for(y = 1; y < 9; y++)
>			printf("%d ", Tabuleiro[x][y]);
>		    printf("\n");
>		}
>		printf("---------------\n");
>	}
>
>	return 0;
>}
>
>
>----------Fim do Código de Programação C-------------
>
>A tempo: Quando põe-se uma peça em determinada posição (ou retira-se, tanto
>faz)
>[]'s, Bernardo
>
>-- Mensagem original --
>
> >Ola Hugo,
> >
> >Neste ultimo domingo eu fiz uma versao ( em C ) bem simples
> >deste jogo, mas que permite aplicar QUAISQUER REGRAS ( de um
> >certo tipo ) e nao so as de Conway. Falta compilar e tirar
> >algum bug que possa existir. Vou divulgar os fontes aqui na
> >lista. Pensando sobre o jogo, descobri tambem um fato
> >interessante que vou falar.
> >
> >Um abraco
> >Paulo Santa Rita
> >2,1701,04062001
>
>
>
>___________________________________________________________
>
>http://www.zipmail.com.br O e-mail que vai aonde você está.
>
>
>

_________________________________________________________________________
Get Your Private, Free E-mail from MSN Hotmail at http://www.hotmail.com.