0

I'm new to matlab and trying to code game of life. But i have some difficulties making the sum of the neigbors. Every cell can have a value of 0 or 1. I'm trying to use a counter (like in Python, the only program i'm somewhat familiar with) but that doesn't seem to work. The problem is that is has to work for all cells, so also the border cells. If i have the value of each cell (so that will be somewhere between 0 and 8) i have to implement the rules. But I also don't know if that's correct. Please help! I'm getting desperate!

TIME = 50;


pulsar;

life = {};  % create list 'life'
life{1} = X;  % add seed to 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're starting off with in each step)

for i = 0:TIME;    % determine amount of times the loop will run 

for row = 1:numrows;              % for each row
    for column = 1:numcolumns;    % for each column

 if column + 1 ~= numcolumns + 1
 east_of_row = column + 1;  % define how to count the cell right of target cell
 end
 if column - 1 ~= 0
 west_of_row = column - 1; % define how to count the cell left of target cell    
 end
 if row - 1 ~= 0
 north_of_column = row - 1; % define how to count the cell north of target cell    
 end
 if row + 1 ~= numrows + 1
 south_of_column = row + 1;
 end

  neighbors = 0                               % start counter 'neighbors' with 0

            if current(row,east_of_row) == 1;              % if neighboring cell has a value of 1
                neighbors = neighbors + 1;                                  % add 1 to neighbors
            end
            if current(row,west_of_row) == 1;              % if neighboring cell has a value of 1
                neighbors = neighbors + 1;                                  % add 1 to neighbors
            end
            if current(north_of_column,column) == 1;       % if neighboring cell has a value of 1    
                neighbors = neighbors + 1;                                  % add 1 to neighbors
            end
            if current(south_of_column,column) == 1;       % if neighboring cell has a value of 1    
                neighbors = 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 = 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 = 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 = 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 = neighbors + 1;                                   % add 1 to neighbors     
            end


        % 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                      % 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
            nextnext(row,column) = 1;
        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} = nextnext;    % add matrix to list 'life

end



show(life);
user2162627
  • 11
  • 1
  • 4
  • Your code is quite long, could you explain a bit more what part presents the problem, and what that problem exactly is? Do you get any error messages for example? – Dennis Jaheruddin Mar 13 '13 at 15:38
  • @DedekMraz Good find. I didn't bother to check (removed my answer to discourage duplicates without an accepted answer). – Eitan T Mar 13 '13 at 15:54
  • @EitanT your mask matrix looked familiar. Actually found a similar approach (and the mask) in the other question. – Dedek Mraz Mar 13 '13 at 16:08
  • At the moment i get an error because the 'west_of_row' is undefined in if current(row,west_of_row) == 1. I don't really see why because i thought i defined it a couple of lines above that one. – user2162627 Mar 13 '13 at 17:39

1 Answers1

2

You can use conv2 to compute this value, as follows:

%First create some example matrix 
%  (this is a 5 x 5 matrix with 30% 1's, 70% 0's
x = full(ceil(sprand(5,5,0.3)))

%Create your convolution kernal
%    This will add up all the values in the 8 elements surrounding the
%    central element
k = [1 1 1; 1 0 1; 1 1 1];  

%Now do the copnvulution (using the 'same' argument to select an output
%the same size as the input.)
counts = conv2(x,k,'same')

This will create a slight different example each time. But for one execution of the above code, I get the following:

x =
     0     1     0     1     0
     0     1     0     1     0
     0     0     1     1     0
     0     1     0     1     0
     0     0     0     0     0

counts =
     2     1     4     1     2
     2     2     6     3     3
     2     3     5     3     3
     1     1     4     2     2
     1     1     2     1     1
Pursuit
  • 12,285
  • 1
  • 25
  • 41
  • I'm supposed to use only basic operations from poiwerpoints i got from my teacher, the conv2() is not in there. – user2162627 Mar 13 '13 at 17:40