Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Edultra

[Código] Jogo da Vida

Recommended Posts

Bem pessoal este foi um trabalho que fiz semestre passado na faculdade, algo bem simples mas interessante sobre manipulação de matrizes, testes com matrizes, mais informações sobre o jogo da vida vide abaixo ou na wikipedia:

http://pt.wikipedia.org/wiki/Jogo_da_vida

Desculpem pelo uso excessivo de ifs mas foi algo para treinar bastante os testes e o trabalho de matrizes, sei que o trabalho pode ser melhorado mas como tudo na vida tem que ter um inicio.

 

BREVE HISTÓRICO

John Horton Conway inventou o jogo da vida em 1970 quando ainda era um jovem matemático na

Universidade de Cambridge, Inglaterra. Através de Martin Gardner e da sua coluna na revista Scientific

American (outubro 1970 e fevereiro 1971) o jogo foi popularizado entre os programadores do mundo

inteiro e passou a ser um dos maiores consumidores de ciclos de CPU’s nos anos 70.

TABULEIRO e REGRAS

A evolução das figuras no universo do jogo lembra um pouco o crescimento de uma colônia de bactérias.

Isto pode ser utilizado como uma analogia para facilitar a memorização das regras do jogo:

- Se a célula está viva e têm menos de dois vizinhos, ela morre de solidão. Se ela tem mais de três

ela morre devido a problemas de superpopulação.

- Uma célula morta rodeada por três células vivas resultará em uma célula viva na próxima

geração.

- Uma célula viva, adjacente a duas ou três células vivas, permanece viva.

Um aspecto importante a considerar é que todas as células vão de uma geração para a próxima ao

mesmo tempo.

O PROGRAMA

O programa deve permitir ao jogador a entrada (escolha) da geração inicial.

Alguns padrões interessantes para geração inicial (TESTAR TODOS):

OBS: asterisco indica célula viva;

Imagem Postada

OBERVAÇÕES

• O programa deverá ser dividido em FUNÇÕES com objetivos bem DEFINIDOS.

• Use uma matriz de tamanho 25x75 e “replique” os padrões como se fossem retalhos.

• Use duas matrizes: uma com a geração atual e outra com a próxima.

• A cada geração, imprima a matriz e limpe a tela, simulando uma animação.

• O programa deve permitir ao jogador a entrada (escolha) do numero máximo de gerações a ser

simulado.

• O uso de modo gráfico é opcional.

• Deve ser feita uma contagem do numero de células vivas em cada geração.

• Um gráfico pode ser feito mostrando a linha do tempo de vidas das células com os dados da contagem

realizada (opcional)

• O jogo também pára se todas as células morrerem.

Código:

 

#include "iostream"
#include "conio.h"
#include "windows.h"
using namespace std;
//----------------------------------------------------------
/* A Função abaixo faz a replica da Matriz de 5x5 (replica) na 
   matriz 25x75.
*/
int replicando(int matriz[25][75], int replica[5][5])
{
	int a,b,l,c;

	for(l=0;l<25;l++)// for para linha da matriz 25x75
	{
		for(c=0;c<75;c++)// for para coluna da matriz 25x75
		{
			for(a=0;a<5;a++)// for para linha a replica 5x5
			{
				for(b=0;b<5;b++)//for para coluna da replica 5x5
				{
					matriz[l+a][c+b]=replica[a][b];
				}
			}
		c +=4;
		}
	l +=4;
	}
return 0;
}
//-----------------------------------------------------------
/*
	A Função abaixo faz o preenchimento da matriz 5x5 com  a opção pré
	definida escolhida pelo usuario, caso ele tenha escolhido  a  opção
	6 ele poderá preencher a matriz, esta que será utilizada para fazer
	a replicação na matriz 25x75.
*/
int mat(int *a,int replica[5][5])
{
	int i,j,k,l,c,y,w,esc;
	if(*a==1)
	{
		
		replica[2][1]=1;
		replica[2][2]=1;
		replica[2][3]=1;
	}
	if(*a==2)
	{
		replica[1][1]=1;
		replica[1][2]=1;
		
		replica[2][1]=1;
		replica[2][2]=1;
		
	}
	if(*a==3)
	{
		replica[1][1]=1;
		replica[1][2]=1;
		replica[1][3]=1;
		
		replica[2][2]=1;
		
	}
	if(*a==4)
	{
		replica[1][2]=1;
		
		replica[2][3]=1;
		
		replica[3][1]=1;
		replica[3][2]=1;
		replica[3][3]=1;
		
	}
	if(*a==5)
	{
		replica[1][2]=1;
		replica[1][3]=1;
		
		replica[2][1]=1;
		replica[2][2]=1;
		
		replica[3][2]=1;
		
	}
	if(*a==6)
	{
		cout<<"Preencha a posição X da matriz"<<endl;
		
		for(i=0;i<5;i++)
			{
				for(j=0;j<5;j++)
				{
					system("cls");
					k=0;
					while(k<1)
					{
						cout<<"Digite o valor da posição X sendo 1 para vivo e 0 para morto\n\n"<<endl;
						for(l=0;l<5;l++)
						{
							cout<<"\t\t\t";
							for(c=0;c<5;c++)
							{
								if(i==l&&j==c)
								{
									cout<<"X";
									y=i;
									w=j;
								}
								else
								{
									cout<<replica[l][c];
								}
							}
							cout<<endl;
						}
						cin>>esc;
						if(esc==1)
						{
							
							k=1;
						}
						if(esc==0)
						{
							k=1;
						}
						if(esc!=1&&esc!=0)
						{
							system("cls");
							cout<<"Escolha incorreta digite novamente escolha 1 para vivo e 0 para morto"<<endl;
						}

					}
					replica[i][j]=esc;
				}
			}
	}
return 0;
}
//------------------------------------------------------
//A funcao matrizreplica faz a impressao na tela da matriz 5x5 a ser replicada
void matrizreplica(int replica[5][5])
{
	int i,j;
	cout<<endl;
	for(i=0;i<5;i++)
	{
		cout<<"\t\t\t";
		for(j=0;j<5;j++)
		{
			cout<<replica[i][j];
		}
		cout<<endl;
	}

}
//-------------------------------------------------------
/*
	A função abaixo faz a verificação das celulas vivas, acumulando a
	quantidade em um contador chamado verd, ao final conforme as regras
	ele determinará se a celula vida permanece vida ou morre e, se uma 
	celula morta viverá.
*/
int verifica(int matriz[25][75],char matrizchar[25][75])
{
	int i,j,reflex[25][75],verd=0,somavivo=0;
	
//------Transportando a matriz original para uma matriz de nome reflex
	for(i=0;i<25;i++)
	{
		for(j=0;j<75;j++)
		{   
			reflex[i][j]=matriz[i][j];
		}
	}
//------Fim da transferencia de conteudos entre as matrizes.

//------Inicio dos testes de posições:
			   /* Vou descrever a matriz da seguinte forma:
					  A B C
					  D E F
					  G H I
			   Sendo:
			   A canto superior esquerdo
			   B posições entre cantos A e C
			   C canto superior direito
			   D posições entre cantos A e G
			   E posições no meio da matriz
			   F posições entre os cantos C e I
			   G canto inferior esquerdo
			   H posições entre os cantos G e I
			   I canto inferior direito
			   */
 
	for(i=0;i<25;i++)//--Contador/gerador de linhas
	{
	   for(j=0;j<75;j++)//--Contador/gerador de colunas
	   {
		 verd=0;
		 if(i==0&&j==0)//--Verifica posição de canto A
		 {
			if(reflex[i][j+1]==1)
			{
			verd++;
			}
			if(reflex[i+1][j+1]==1)
			{
			verd++;
			}
			if(reflex[i+1][j]==1)
			{
			verd++;
			}
		 }
	  
		 if(i==0&&(j>0&&j<74))//--Verifica posições entre cantos B
		 {
			if(reflex[i][j-1]==1)
			{
			verd++;
			}
			if(reflex[i+1][j-1]==1)
			{
			verd++;
			}
			if(reflex[i+1][j]==1)
			{
			verd++;
			}
			if(reflex[i+1][j+1]==1)
			{
			verd++;
			}
			if(reflex[i][j+1]==1)
			{	   
			verd++;
			}
		 }
		 if(i==0&&(j==74))//--Verifica posição de canto C
		 {
			if(reflex[i][j-1]==1)
			{
			verd++;
			}
			if(reflex[i+1][j-1]==1)
			{
			verd++;
			}
			if(reflex[i+1][j]==1)
			{
			verd++;
			}
		  
		 }
		 if(i==24&&j==0)//--Verifica posição de canto G
		 {
			if(reflex[i-1][j]==1)
			{
			verd++;
			}
			if(reflex[i-1][j-1]==1)
			{
			verd++;
			}
			if(reflex[i][j-1]==1)
			{
			verd++;
			}
		 }
		 if(i==24&&j==74)//--Verifica posição de Canto I
		 {
			if(reflex[i-1][j]==1)
			{
			verd++;
			}
			if(reflex[i-1][j-1]==1)
			{
			verd++;
			}
			if(reflex[i][j-1]==1)
			{
			verd++;
			}
		 }

		 if((i!=0&&j!=74)&&(i!=24&&j!=0))//Verifica as posições centrais E
		 {
			if(reflex[i-1][j]==1)
			{
			verd++;
			}
			if(reflex[i-1][j+1]==1)
			{
			verd++;
			}
			if(reflex[i][j+1]==1)
			{
			verd++;
			}
			if(reflex[i+1][j+1]==1)
			{
			verd++;
			}
			if(reflex[i+1][j]==1)
			{
			verd++;
			}
			if(reflex[i+1][j-1]==1)
			{
			verd++;
			}
			if(reflex[i][j-1]==1)
			{
			 verd++;
			}
			if(reflex[i-1][j-1]==1)
			{
			verd++;
			}
		 }//------Fim dos testes de posições
				
		 if(verd<2&&(matriz[i][j]==1))//------Inicio das alterações na matriz original
		 {
		 matriz[i][j]=0;
		 }
		 if((verd>3)&&(matriz[i][j]==0))
		 {
		 matriz[i][j]=1;
		 somavivo++;
		 }
		 if(verd>3&&matriz[i][j]==1)
		 {
			 matriz[i][j]=0;
			 			 
		 }
		 if(verd==3)
		 {
		 matriz[i][j]=1;
		 }
		 
		 
	  }//--Fim do for de J;

   }//--Fim do for de I

return somavivo;	  
}		   
//-------------------------------------------------------------
/*
A funcao estatisticas mostra as estatisticas do jogo
*/
void estatisticas(int *opcao,int *quant, int *totalvivos,int *vivos,int *gervivos,int replica[5][5])
{
	system("cls");
	cout<<"\t\tEstatisticas o jogo\n";
	cout<<"Matriz replicada:\n";
	matrizreplica(replica);
	cout<<"\n\n";
	cout<<"Quantidade total de ciclos solicitados"<<*opcao<<endl;
	cout<<"Quantidade de Ciclos Efetuados"<<*quant<<endl;
	cout<<"Quantidade de vivos na ultima geracao: "<<*totalvivos<<endl;
	cout<<"Quantidade total de celulas mortas que viveram "<<*vivos<<endl;
	cout<<"Quantidade Total de vivos (soma de vivos de todas geracoes):"<<*gervivos<<endl;

}
void vergrafico(int grafico[1000],int *quant)
{
	int i,j,para;
	cout<<"Grafico de evolucao da matriz"<<endl;
	for(i=0;i<*quant;i++)
	{
		para=grafico[i]/10;//calculo para a demonstracao de 60 colunas
		if(para>70)
			  para=70;
		cout<<"Ciclo: "<<i+1;
		for(j=0;j<para;j++)
		{
			cout<<"*";
		}
		cout<<endl;
	}
}
int main()
{
	int i,j,opcao,matriz[25][75],replica[5][5],grafico[1000],quant,escolha,totalvivo=0,gervivos=0,vivos=0,cont=0,pausa=100,opausa;
	char matrizchar[25][75],vivo='*',morto=' ';
//----Preenchimento da matriz com zeros
for(i=0;i<25;i++)
	{
	   for(j=0;j<75;j++)
	   {
		   matriz[i][j]=0;
	   }
	}
	for(i=0;i<25;i++)
	{
	   for(j=0;j<75;j++)
	   {
		   matrizchar[i][j]=' ';
	   }
	}
		
//----Impressão da matriz	
		
	for(i=0;i<25;i++)
	{
	   for(j=0;j<75;j++)
	   {
		   cout<<matriz[i][j];
	   }
		cout<<endl;
	}
	cout<<"Acima e mostrado a matriz original: (pressione uma tecla para continuar...)"<<endl;
	getch();
	system("cls");
	i=0;
	// Preenchimento de uma matriz de replica com zeros
	for(i=0;i<5;i++)
	{
	   for(j=0;j<5;j++)
	   {
		   replica[i][j]=0;
	   }
	}
	
	cout<<"Escolha uma geracao padrao para replicar na matriz:"<<endl;
	cout<< "1:\t"<<"00000"<<"\t2:"<<"\t00000"<<"\t3:"<<"\t00000"<<"\t4:"<<"\t00000"<<"\t5:"<<"\t00000"<<endl;
	cout<< " \t"<<"00000"<<"\t "<<"\t01100"<<"\t "<<"\t01110"<<"\t "<<"\t00100"<<"\t "<<"\t00110"<<endl;
	cout<< " \t"<<"01110"<<"\t "<<"\t01100"<<"\t "<<"\t00100"<<"\t "<<"\t00010"<<"\t "<<"\t01100"<<endl;
	cout<< " \t"<<"00000"<<"\t "<<"\t00000"<<"\t "<<"\t00000"<<"\t "<<"\t01110"<<"\t "<<"\t00100"<<endl;
	cout<< " \t"<<"00000"<<"\t "<<"\t00000"<<"\t "<<"\t00000"<<"\t "<<"\t00000"<<"\t "<<"\t00000"<<endl;
	cout<< "Ou tecle 6 para digitar uma matriz a ser replicada"<<endl;
	cin>>opcao;

	mat(&opcao,replica);
	cout<<"A matriz escolhida foi"<<endl;
	matrizreplica(replica);
	cout<<"\n\nPressione uma tecla para continuar...";
	getch();
	replicando(matriz,replica);
	system("cls");
	cout<<"Para uma melhor visualizacao e recomendado maximizar a tela"<<endl;
	cout<<"Pressione uma tecla para continuar..."<<endl;
	getch();
	system("cls");
	cout<<"A matriz replicada foi:"<<endl;

	for(i=0;i<25;i++)
	{
	   for(j=0;j<75;j++)
	   {
		   cout<<matriz[i][j];
	   }
		cout<<endl;
	}
	cout<<"Digite a quantidade de ciclos do jogo"<<endl;
	cin>>opcao;
	system("cls"); 
	cout<<"E possivel utilizar pausas entre a troca de siclos (para melhor visualizacao)\ndeseja utilizar? Digite 1 para sim e 2 para nao:"<<endl;
	cin>>opausa;
	if(opausa==1)
	{
		cout<<"Digite o tempo de pausa em milisegundos (1000 milisegundos = 1 segundo)"<<endl;
		cin>>pausa;
	}
	cout<<"E possivel alterar o sinal de vivos e mortos para caracteres deseja utilizar?\nDigite 1 para sim e 2 para nao:"<<endl;
	cin>>escolha;

	if(escolha==1)
	{
		cout<<"Digite o caracter para vivo"<<endl;
		vivo=getch();
		cout<<"Digite o caracter para morto"<<endl;
		morto=getch();
		quant=0;
		while(quant<opcao)
		{
			totalvivo=0;
			system("cls");
			vivos+=verifica(matriz,matrizchar);
			for(i=0;i<25;i++)
			{
				for(j=0;j<75;j++)
				{
					if(matriz[i][j]==0)
					{
						cout<<morto;
					}
					if(matriz[i][j]==1)
					{
						cout<<vivo;
						totalvivo++;
						gervivos++;
					}
				}
			cout<<endl;
			}
			cout<<"Ciclo"<<quant+1<<" Quantidade de vivas neste ciclo: "<<totalvivo<<" Ciclos Solicitados: "<<opcao;
		grafico[quant]=totalvivo;
		quant++;
		Sleep(pausa);
		if(quant==opcao)
			{
				cout<<"\nFim dos Ciclos solicitados, deseja mais ciclos? Digite 1 para sim e 2 para nao";
				int ciclos;
				cin>>ciclos;
				if(ciclos==1)
				{
					cout<<"Digite a quantidade de ciclos: ";
					cin>>cont;
					opcao+=cont;
				}
				if(ciclos==2)
				{
					estatisticas(&opcao,&quant,&totalvivo,&vivos,&gervivos,replica);
					vergrafico(grafico,&quant);
				}
			}
			if(totalvivo==0)
			{
				cout<<"\nTotal de Vivos = 0 Fim de jogo"<<endl;
				cout<<"Pressione uma tecla para ver as estatisticas";
				getch();
				estatisticas(&opcao,&quant,&totalvivo,&vivos,&gervivos,replica);
				quant=opcao;
				vergrafico(grafico,&quant);
			}
		}
	}
	if(escolha==2)
	{
		quant=0;
		while(quant<opcao)
		{
			totalvivo=0;
			system("cls");
			vivos+=verifica(matriz,matrizchar);
			for(i=0;i<25;i++)
			{
				for(j=0;j<75;j++)
				{
					if(matriz[i][j]==0)
					{
						cout<<matriz[i][j];
					}
					if(matriz[i][j]==1)
					{
						cout<<matriz[i][j];
						totalvivo++;
						gervivos++;
					}
				}
				cout<<endl;
			}
			cout<<endl; 
			cout<<"Ciclo"<<quant+1<<" Quantidade de vivas neste ciclo: "<<totalvivo<<" Ciclos Solicitados: "<<opcao;
			grafico[quant]=totalvivo;
			quant++;
			Sleep(pausa);
			if(quant==opcao)
			{
				cout<<"\nFim dos Ciclos solicitados, deseja mais ciclos? Digite 1 para sim e 2 para nao";
				int ciclos;
				cin>>ciclos;
				if(ciclos==1)
				{
					cout<<"Digite a quantidade de ciclos: ";
					cin>>cont;
					opcao+=cont;
				}
				if(ciclos==2)
				{
					estatisticas(&opcao,&quant,&totalvivo,&vivos,&gervivos,replica);
					vergrafico(grafico,&quant);
				}
			}
			if(totalvivo==0)
			{
				cout<<"\nTotal de Vivos = 0 Fim de jogo"<<endl;
				cout<<"Pressione uma tecla para ver as estatisticas";
				getch();
				estatisticas(&opcao,&quant,&totalvivo,&vivos,&gervivos,replica);
				cout<<"grafico : "<<grafico[0];
				vergrafico(grafico,&quant);
				quant=opcao;

			}
  
		}
	}
getch();

}

O programa foi construido utilizando o Dev-C++.

Qualquer duvida ou critica será bem aceita espero que esteja colaborando com o forum. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Demorei para postar isso aqui pois o professor pesquisa na web se não existe outro trabalho do genero e verifica caso possa ser plasgio, por isso esperei o lançamento das notas e agora após um tempo decidi compartilhar.

 

Agradecimentos ao Prof. Diogenes Furlan prof. da universidade Tuiuti do Parana o qual sempre busca ótimos trabalhos para motivar o pessoal e incentivar a criatividade dos alunos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hoje em dia uso outras formas, mas na época era o que tinhamos aprendido e era pra utilizar bastante o uso de ifs, dentre melhorar os conhecimentos de manipulação e testes com matrizes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

'e legal você apanhar um pouquinho na linguagem para pegar o jeito, eu gostaria de ter a sorte q você teve com esse professor, pq c eu dependesse da minha facu na materia de linguagem C tava ferrado, juro q soh iria saber fazer um 'Ola Mundo' e olhe lah, e num 'e modo de falar naum, minha professora era muito ruim..

o pouquinho q seii [e pq eu corri muito atras e li muito desde q sai do ensino tecnico.

Soh lamentos para o aprendizado de algumas faculdades..

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.