0

I'm trying to code Conway's game of life in Matlab but something keeps going wrong. I don't get an error so I don't really know what I'm doing wrong, it just doesn't do anything. I think the problem might have something to do with the counting of the cells (to check the number of neighbors) or increment the rules on the cells at the border of the matrix.

Here's my code:

TIME = 10;
pulsar;     % creates begin matrix X
life{1} = X;
life = {};           % create list 'life'   

numrows = size(X,1); % calculate number of rows
numcolumns = size(X,2);  % calculate number of columns

current = X;        % make seed the first current(matrix you are starting off with in each step)
for i = 0:TIME;    % determine amount of times the loop will run
    nextnext = X;                     % create "nextnext" matrix to implement the rules of the game on (copy of X)
    for row = 2:numrows-1;              % for each row
        for column = 2:numcolumns-1;    % for each column
            east_of_row = column + 1;      % define how to count the cell right of target cell
            west_of_row = column - 1;      % define how to count the cell left of target cell             
            north_of_column = row - 1;     % define how to count the cell north of target cell              
            south_of_column = row + 1;     % define how to count the cell south of target cell               

            % count neighboring cells:
            neighbors = 0;                               % start counter 'neighbors' with 0

            while east_of_row <= size(X),
                 west_of_row <= size(X);,
                 north_of_column <= size(X);,
                 south_of_column <= size(X); 
                 if current(row,east_of_row) == 1              % if neighboring cell has a value of 1
                     neighbors + 1;                                 % add 1 to neighbors
                 end
                 if current(row,west_of_row) == 1              % if neighboring cell has a value of 1
                     neighbors + 1;                                  % add 1 to neighbors
                 end
                 if current(north_of_column,column) == 1       % if neighboring cell has a value of 1    
                     neighbors + 1;                                  % add 1 to neighbors
                 end
                 if current(south_of_column,column) == 1       % if neighboring cell has a value of 1    
                     neighbors + 1;                                   % add 1 to neighbors
                 end
                 if current(south_of_column,east_of_row) == 1  % if neighboring cell has a value of 1
                     neighbors + 1;                                   % add 1 to neighbors
                 end
                 if current(north_of_column,east_of_row) == 1  % if neighboring cell has a value of 1
                     neighbors + 1;                                  % add 1 to neighbors
                 end
                 if current(north_of_column,west_of_row) == 1  % if neighboring cell has a value of 1
                     neighbors + 1;                                  % add 1 to neighbors
                 end
                 if current(south_of_column,west_of_row) == 1  % if neighboring cell has a value of 1
                     neighbors + 1;                                   % add 1 to neighbors    
                 end
            end

    while east_of_row == 0,west_of_row == 0;,north_of_column == 0;,south_of_column == 0; 
    if current row,east_of_row ~= 0;
    if current(row,east_of_row) == 1              % if neighboring cell has a value of 1
        neighbors + 1;                                 % add 1 to neighbors
    end
    end
    if current row,west_of_row ~= 0; 
    if current(row,west_of_row) == 1              % if neighboring cell has a value of 1
        neighbors + 1;                                  % add 1 to neighbors
    end
    end
    if current north_of_column,column ~= 0;
    if current(north_of_column,column) == 1       % if neighboring cell has a value of 1
        neighbors + 1;                                  % add 1 to neighbors
    end
    end
    if current south_of_column,column ~= 0;
    if current(south_of_column,column) == 1       % if neighboring cell has a value of 1
        neighbors + 1;                                   % add 1 to neighbors
    end
    end
    if current south_of_column,east_of_row ~= 0;
    if current(south_of_column,east_of_row) == 1  % if neighboring cell has a value of 1
        neighbors + 1;                                   % add 1 to neighbors
    end
    end
    if current north_of_column,east_of_row  ~= 0;
    if current(north_of_column,east_of_row) == 1  % if neighboring cell has a value of 1
        neighbors + 1;                                  % add 1 to neighbors
    end
    end
    if current north_of_column,west_of_row ~= 0;
    if current(north_of_column,west_of_row) == 1  % if neighboring cell has a value of 1
        neighbors + 1;                                  % add 1 to neighbors
    end
    end
    if current south_of_column,west_of_row ~= 0;
    if current(south_of_column,west_of_row) == 1  % if neighboring cell has a value of 1
        neighbors + 1;                                   % add 1 to neighbors    
    end
    end
    end
    neigbors

        % rules of the game:

    if current(row,column) == 1              % in case a target cell has a value of 1:

        if neighbors < 2                           % if the number of neighbors is smaller than 2
            nextnext(row,column) = 0;                   % value of target cell gets 0 in nextnext
        end
        if neighbors == 2 , neighbors == 3      % if the number of neighbors is 2 or 3
            nextnext(row,column) = 1;                   % value of target cell stays 1 in nextnext
        end
        if neighbors > 3                        % if the number of neigbors is higher than 3
            nextnext(row,column) = 0;                   % value of target cell gets 0 in nextnext
        end
    end
    if current (row,column) == 0           % in case a target cell has a value of 0:

        if neighbors == 3                          % if the number of neighbors is 3
            nextnext(row,column) = 1;                   % value of target cell gets 1 in nextnext
        end
        if neighbors ~= 3                       % if the number of neigbors isn't 3
            nextnext(row,column) = 0;                  % value of target cell stays 0 in nextnext
        end
end
    end
    end



current = nextnext;       % make nextnext matrix the current matrix for the next step 
life{TIME+1} = nextnext;    % add matrix to list 'life
end


show(life);
Shai
  • 111,146
  • 38
  • 238
  • 371
user2162627
  • 11
  • 1
  • 4

1 Answers1

1

Wow. your code is bad in so many ways... Have you heard of vectorization in matlab?

To count the number of neighbors each cell has you can do it simply by:

neighbors = conv2( current, [1 1 1;1 0 1; 1 1 1], 'same' );

Once you have the number of neighbors you can simply create the next time step

nextnext = current.*( neighbors == 2 | neighbors == 3 ) + ... % all cells for which current == 1
           ( 1 - current ).*( neighbors == 3 ); 

Some problems with the code you have:

  1. The line neighbors + 1; % add 1 to neighbors actually does not add one to neighbor. Matlab does not have the equivalent of neighbors++. So, if you really want to increment neighbors you'll have to do it explicitly: neighbors = neighbors + 1;

  2. I don't know why you use while loop but the statement while east_of_row == 0,west_of_row == 0;,north_of_column == 0;,south_of_column == 0; only checks the first condition east_of_row == 0 the rest are evaluated as expressions and do not count as loop conditions.

  3. Next time, if you don't get what you expect and you don't see any error, try debugging your code step by step.

BTW, have you tried

>> life
Shai
  • 111,146
  • 38
  • 238
  • 371
  • 5
    Have you seen the tweetable MATLAB Game of Life? `s=[1 1 1]'; n=@(a)conv2(s,s',1*a,'same')-a; lf=@(a)n(a)==2&a|n(a)==3; a=rand(128)>0.8; for ii=1:500,spy(a);drawnow;a=lf(a);end` It even includes graphics! Credit to Matt McDonnell. – Sam Roberts Mar 13 '13 at 01:21
  • @SamRoberts - very nice :-) – Shai Mar 13 '13 at 06:37