问题
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);
回答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:
The line
neighbors + 1; % add 1 to neighbors
actually does not add one to neighbor. Matlab does not have the equivalent ofneighbors++
. So, if you really want to incrementneighbors
you'll have to do it explicitly:neighbors = neighbors + 1;
I don't know why you use
while
loop but the statementwhile east_of_row == 0,west_of_row == 0;,north_of_column == 0;,south_of_column == 0;
only checks the first conditioneast_of_row == 0
the rest are evaluated as expressions and do not count as loop conditions.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
来源:https://stackoverflow.com/questions/15370833/whats-wrong-with-this-game-of-life-in-matlab