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 at 16:47

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.