-
Notifications
You must be signed in to change notification settings - Fork 0
/
simulate_step_custom.jl
77 lines (56 loc) · 2.38 KB
/
simulate_step_custom.jl
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
using Plots, DSP, ArrayPadding
# a single game of life step with custom rules & border folding
function step_fold(GoL, al_min=2, al_max=3, new_min=3, new_max=3)
# 2D kernel to update cells
Mfilt = [true true true;
true false true;
true true true]
# Add a border mirroring 'the other side' of the matrix
GoL2 = pad(GoL, :periodic, 1)
# Perform 2D FFT-based convolution
convGoL = DSP.conv(GoL2, Mfilt)
stay_alive = (convGoL .>= al_min .&& convGoL .<= al_max )
born_new = (convGoL .>= new_min .&& convGoL .<= new_max)
# Keep only cells with 2 (or 3) neighbours alive
# Make new cells if neighbours are 3
twoLiveNeig = (GoL .&& stay_alive[3:end-2, 3:end-2])
GoL = twoLiveNeig .|| born_new[3:end-2, 3:end-2]
return(GoL)
end
# a single game of life step with custom rules
function step_custom(GoL, al_min=2, al_max=3, new_min=3, new_max=3)
# 2D kernel to update cells
Mfilt = [true true true;
true false true;
true true true]
# Perform 2D FFT-based convolution
convGoL = DSP.conv(GoL, Mfilt)
stay_alive = (convGoL .>= al_min .&& convGoL .<= al_max )
born_new = (convGoL .>= new_min .&& convGoL .<= new_max)
# Keep only cells with 2 (or 3) neighbours alive
# Make new cells if neighbours are 3
twoLiveNeig = (GoL .&& stay_alive[2:end-1, 2:end-1])
GoL = twoLiveNeig .|| born_new[2:end-1, 2:end-1]
return(GoL)
end
# main Game of life function loop
function runGoL_custom(GoL; runs=100, al_min=2, al_max=3, new_min=3, new_max=3, sleepTime=0.02, fold=true, safeToDisk=false, showOnConsole=true)
# Simulate the game
for i_gen = 1:runs
if fold
GoL = step_fold(GoL, al_min, al_max, new_min, new_max)
else
GoL = step_custom(GoL, al_min, al_max, new_min, new_max)
end
if showOnConsole
plot(heatmap(GoL), show=true, reuse=true)
sleep(sleepTime)
end
end
return(GoL)
end
# start a random map
function start_custom(GoL=nothing, runs=100, grid_size_width=384, grid_size_height=384; al_min=2, al_max=3, new_min=3, new_max=3, sleepTime=0.02)
grid = initiate_grid(grid_size_width, grid_size_height)
runGoL_custom(grid, runs=runs, al_min=al_min, al_max=al_max, new_min=new_min, new_max=new_max, sleepTime=sleepTime)
end