-
Notifications
You must be signed in to change notification settings - Fork 0
/
cellular_automata.c
72 lines (67 loc) · 1.75 KB
/
cellular_automata.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
#include <stdlib.h>
#include <stdbool.h>
#include "cellular_automata.h"
bool is_within_map_bounds(int y, int x, bool ** map, int size){
if (y < 0 || x < 0 || y >= size || x >= size){
return false;
}
return true;
}
void copy_bool_map(bool ** dest, bool ** src, int size){
for (int i = 0; i < size; i ++){
for (int j = 0; j < size; j ++){
dest[i][j] = src[i][j];
}
}
}
void cellular_automata(bool ** map, int size, int iterations){
int f_count;
bool ** temp_map = (bool **)calloc(size, sizeof(bool *));
for (int i = 0; i < size; i ++){
temp_map[i] = (bool *)calloc(size, sizeof(bool));
}
for (int i = 0; i < iterations; i ++){
copy_bool_map(temp_map, map, size);
for (int j = 0; j < size; j ++){
for (int k = 0; k < size; k ++){
f_count = 0;
for (int y = j - 1; y <= j + 1; y ++){
for (int x = k - 1; x <= k + 1; x ++){
if (is_within_map_bounds(y, x, map, size)){
if (y != j || x != k){
if (!temp_map[y][x]){
f_count ++;
}
}
}
else {
f_count ++;
}
}
}
if (f_count > 4){
map[j][k] = 0;
}
else {
map[j][k] = 1;
}
}
}
}
for (int i = 0; i < size; i ++){
free(temp_map[i]);
}
free(temp_map);
}
bool ** generate_cellular_automata(int seed, int density, int size, int iterations){
srand(seed);
bool ** map = (bool **)calloc(size, sizeof(bool *));
for (int i = 0; i < size; i ++){
map[i] = (bool *)calloc(size, sizeof(bool));
for (int j = 0; j < size; j ++){
map[i][j] = rand()%101 > density;
}
}
cellular_automata(map, size, iterations);
return map;
}