[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.