Asked by Limbert Palomino
on 14 May 2019

Hello,

I am having trouble implementing my code for Conway's Game of Life. I know that the cases for killing cells are accurate and run well but for some reason the "birthing" cases don't seem to work. I am pretty sure my code covers all the cases so I don't know why my system just dies down eventually from the lack of new cells coming to life. Here is my code:

function GameOfLife(A)

B = conv2(full(A > 0),[0,0,0;0,1,0;0,0,0],'same');

while true

imshow(B);

drawnow;

for i=2:size(B,1)-1

for j=2:size(B,2)-1

C = B(i-1:i+1,j-1:j+1); % 3x3 Matrix with i,j point @ center

if B(i,j) == 1 % Cell is currently alive

if (sum(sum(C)) < 3) || (sum(sum(C)) > 4)

B(i,j) = 0; % Dies

elseif B(i,j) == 0 % Cell is currently dead

if sum(sum(C)) == 3

B(i,j) = 1; % Is born

end

end

end

end

end

end

end

Any ideas?

Answer by Geoff Hayes
on 15 May 2019

Edited by Geoff Hayes
on 15 May 2019

Accepted Answer

Limbert - I think that part of the problem might be with how your if and elseif statements are not being properly "ended". For example, MATLAB may be interpreting this code

if B(i,j) == 1 % Cell is currently alive

if (sum(sum(C)) < 3) || (sum(sum(C)) > 4)

B(i,j) = 0; % Dies

elseif B(i,j) == 0 % Cell is currently dead

if sum(sum(C)) == 3

B(i,j) = 1; % Is born

end

end

end

as

if B(i,j) == 1 % Cell is currently alive

if (sum(sum(C)) < 3) || (sum(sum(C)) > 4)

B(i,j) = 0; % Dies

elseif B(i,j) == 0 % Cell is currently dead

if sum(sum(C)) == 3

B(i,j) = 1; % Is born

end

end

end

Once you have finished with an if/elseif/else block, then you need to properly close it with an end. Your code might then become

if B(i,j) == 1 % Cell is currently alive

if (sum(sum(C)) < 3) || (sum(sum(C)) > 4)

B(i,j) = 0; % Dies

end % <-------------------------- this is important!!

elseif B(i,j) == 0 % Cell is currently dead

if sum(sum(C)) == 3

B(i,j) = 1; % Is born

end

end

Also, rather than executing the same calculation 2-3 times, just do it once

numberOfNeighbours = sum(sum(C));

and use this variable when comparing against three or four.

Limbert Palomino
on 16 May 2019

Thank you!

I got it working almost right after I posted this but I found that the bug I had was because the for loops wasn't iterating through all my statements, so I wrote a second one. Would ending loops like this, and creating a variable to avoid repeating the operation many times increase the efficiency of the function overall?

Geoff Hayes
on 19 May 2019

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.