康威在 Matlab 中的生命游戏 - 在嵌套循环中返回意外数字的函数



嘿,我正在为一个项目制作康威的生活游戏,到目前为止,我已经创建了一个函数,可以找到原始细胞周围的活细胞数量,我相信这是我测试过的,并与它一起玩了相当多,但是当我把它实现到包含生活游戏条件规则的主脚本中时,它似乎停止了工作。

function [alive] = cellStat(grid,row,col)
%this function finds the number of alive cells surrounding it
alive = 0;
for i = row-1:row+1
%making sure the cell is on the board
if i <= 0 || i > length(grid)
continue
end
for j = col-1:col+1
%making sure the cell is on the board
if j <= 0 || j > length(grid)
continue
end
%making sure the cell is not counted as its own neighbour
if i == row && j == col
continue
end
%disp(i + " " + j + " = " + grid(i,j));
if grid(i,j) == 1
alive = alive + 1;
end
end
end
end

主脚本

r = [0 0 1 0 0;1 0 1 0 0;0 1 1 0 0;0 0 0 0 0;0 0 0 0 0];
years = 1;
alive = 0;
for n = 1:years
for i = 1:length(r)
for j = 1:length(r)
alive = cellStat(r,i,j);
if alive <= 1 && r(i,j) == 1
r(i,j) = 0;
elseif alive > 3 && r(i,j) == 1
r(i,j) = 0;
elseif alive == 3 && r(i,j) == 0
r(i,j) = 1;
end
end
end
disp(r);
end

例如,我一直在尝试测试康威的生活游戏中的滑翔机模式,这是前面代码中的数组r。但是当我运行代码时,输出不像预期的那样。这里是命令窗口,第一个数组是初始数组r

我还试图通过放入一个disp函数来调试它,以找出cellStat函数在主脚本中的for循环中返回的内容(disp(I + ";";+ j + "=";+ alive);)的正下方,查找当前细胞周围的活细胞数量,并返回有趣的结果。例如,它说第2行第2列的单元格有6个活的邻居,但网格上甚至没有6个活的单元格。

我认为这是主脚本中for循环的错误,因为当我在该单元格上使用函数时,它只会给出正确的结果(5)。

我很感激你的帮助,因为我不确定从哪里开始修复这个

您只在单元格上执行一次循环,在这个循环中,您计算邻居并修改它们。这是行不通的,因为您在循环早期所做的修改会改变您稍后计数的邻居的数量。

需要两个循环:在第一个循环中计算所有细胞的邻居,在第二个循环中根据邻居的数量修改每个细胞。

最新更新