-
Notifications
You must be signed in to change notification settings - Fork 0
/
jogo-da-vida.c
175 lines (148 loc) · 5.65 KB
/
jogo-da-vida.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
int geracoes, qtd, retorno,cont;
char digito;
cont = 0;
retorno = 0;
// ===== Declaracao das funcoes =====
void delay(int segundos);
void clear ();
int **Liberar_matriz (int m, int **pontMatriz);
int **Liberar_novaMatriz (int m, int **pontNovaMatriz);
int imprimirGeracao (int matrizEscrita[30][30]);
//===================================
printf("Este programa foi criado por: Bruno Henrique Silva Viola - 1 Semestre");
printf ("\nDigite a quantidade de geracoes a serem simuladas: ");
scanf ("%d", &geracoes);
//===== Parte responsavel pela abertura do arquivo =====
FILE *file;
file = fopen("quadro.txt","r");
if (file==NULL){
printf("Arquivo nao pode ser aberto\n");
return 0;
}
//======================================================
// ===== Declaracao das matrizes de alocacao dinamica =====
int i, j;
int **matriz;
matriz = malloc(30 * sizeof (int *));
for (i = 0; i < 30; ++i){
matriz[i] = malloc( 30 * sizeof (int));
}
int **novaMatriz;
novaMatriz = malloc(30 * sizeof (int *));
for (i = 0; i < 30; ++i){
novaMatriz[i] = malloc(30 * sizeof (int));
}
// ===== Leitura da matriz do arquivo =====
for (i=0; i<30; i++){
for (j=0;j<30;j++){
fscanf(file," %c",&digito);
matriz[i][j]= digito - '0';
}
}
printf ("\n");
//Essa parte serve para imprimir a matriz inicial na tela;
printf("\nMatriz do arquivo: \n");
for (i=0; i<30; i++){
for (j=0;j<30;j++){
printf ("%d", matriz[i][j]);
}
printf ("\n");
}
//====================================================
while (cont<geracoes) //Laco responssvel por executar a quantidade de geracoes informadas pelo usuario
{
delay (4.5);//O valor de entrada desta funcao eh a quantidade de segundos entre uma geracao e outra
for (i=0; i<30; i++){
for (j=0;j<30;j++){
if(i == 0 && j ==0){ //canto superior esquerdo
qtd = matriz[i][j+1] + matriz[i+1][j] + matriz[i+1][j+1];
}else if (i==29 && j==0){//canto inferior esquerdo
qtd = matriz[i-1][j] + matriz[i-1][j+1] + matriz[i][j+1];
} else if (i== 0 && j ==29){ //canto superior direito
qtd = matriz[i][j-1] + matriz[i+1][j-1] + matriz[i+1][j];
} else if (i == 29 && j == 29){//canto inferior direito
qtd = matriz[i][j-1] + matriz[i-1][j-1] + matriz[i-1][j];
} else if (i==0 && j!=0 && j !=29){ //borda superior
qtd = matriz[i][j-1] + matriz[i+1][j-1] + matriz[i+1][j]+matriz[i+1][j+1] + matriz[i][j+1];
} else if (i != 0 && i != 29 && j ==0){//lado esquerdo
qtd = matriz[i-1][j] + matriz[i-1][j+1] + matriz[i][j+1]+matriz[i+1][j+1] + matriz[i+1][j];
} else if (i == 29 && j !=0 && j != 29){ //borda inferior
qtd = matriz[i][j-1] + matriz[i-1][j-1] + matriz[i-1][j]+matriz[i-1][j+1] + matriz[i][j+1];
} else if (i!=0 && i!= 29 && j == 29){ //lado direito
qtd = matriz[i-1][j] + matriz[i-1][j-1] + matriz[i][j-1]+matriz[i+1][j-1] + matriz[i+1][j];
}
else{
qtd = matriz[i-1][j-1] + matriz[i-1][j] + matriz[i-1][j+1] + matriz[i][j-1] + matriz[i][j+1] + matriz[i+1][j-1] + matriz[i+1][j] + matriz[i+1][j+1];
}
//Esta parte verifica o valor a ser inserido em cada posi��o da nova matriz (0 ou 1)
if (matriz[i][j]== 1 && qtd<2){
retorno = 0;
} else if(matriz[i][j] == 1 && qtd>3){
retorno = 0;
} else if (matriz[i][j] == 1 && qtd== 2){
retorno = 1;
} else if (matriz[i][j] == 1 && qtd == 3){
retorno = matriz[i][j];
} else if (matriz[i][j] == 0 && qtd == 3){
retorno = 1;
} else if (matriz[i][j]==0 && qtd ==2){
retorno = 0;
} else if (matriz[i][j]==0 && qtd == 0){
retorno = 0;
} else if (matriz [i][j]==0 && qtd ==1){
retorno = 0;
} else {
retorno = matriz[i][j];
}
novaMatriz[i][j] = retorno;
}
}
clear();
printf ("\n%d Geracao: \n", cont+1);
for (i=0; i<30; i++){
for (j=0;j<30;j++){
printf ("%d", novaMatriz[i][j]);
matriz[i][j] = novaMatriz[i][j];
}
printf ("\n");
}
cont = cont +1;
}
Liberar_matriz (30, matriz);
Liberar_novaMatriz ( 30, novaMatriz);
fclose(file);
return 0;
}
void delay(int segundos) //Funcao destinada a criar o delay entre geracoes
{
int milissegundos = 1000 * segundos;
clock_t tempoinicial = clock();
while (clock() < tempoinicial + milissegundos);
}
int **Liberar_matriz (int m, int **pontMatriz) { //Funcao destinada a liberacao da matriz
int i;
if (pontMatriz == NULL) return (NULL);
for (i = 0; i < m; i++) free (pontMatriz[i]);
free (pontMatriz);
return (NULL);
}
int **Liberar_novaMatriz (int m, int **pontNovaMatriz) { //Funcao destinada a liberacao da novaMatriz
int i;
if (pontNovaMatriz == NULL) return (NULL);
for (i = 0; i < m; i++) free (pontNovaMatriz[i]);
free (pontNovaMatriz);
return (NULL);
}
void clear (){ //Funcao destinada a limpeza do terminal a partir da identificacao do sistema utilizado
#ifdef _WIN32
system("cls");
#elif __linux
system ("clear");
#else
printf("\nSistema nao reconhecido para a limpeza do terminal");
#endif
}