Matlab 中的这个生命游戏有什么问题吗?

2023-12-22

我正在尝试在 Matlab 中编写康威生命游戏的代码,但总是出错。我没有收到错误,所以我真的不知道我做错了什么,它只是没有做任何事情。我认为问题可能与单元格的计数(以检查邻居的数量)或增加矩阵边界单元格的规则有关。

这是我的代码:

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);

哇。你的代码在很多方面都很糟糕...你听说过 matlab 中的矢量化吗?

要计算每个单元格的邻居数量,您可以简单地通过以下方式完成:

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

一旦你有了邻居的数量,你就可以简单地创建下一个时间步

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

您的代码存在一些问题:

  1. 线路neighbors + 1; % add 1 to neighbors实际上确实如此not添加一个到邻居。 Matlab 没有相当于neighbors++。所以,如果你真的想增加neighbors你必须明确地这样做:neighbors = neighbors + 1;

  2. 我不知道你为什么使用while循环但声明while east_of_row == 0,west_of_row == 0;,north_of_column == 0;,south_of_column == 0;只检查第一个条件east_of_row == 0其余的将作为表达式求值,不计为循环条件。

  3. 下次,如果您没有得到预期的结果并且没有看到任何错误,请尝试调试 http://www.mathworks.com/help/matlab/matlab_prog/debugging-process-and-features.html你的代码一步一步。

顺便说一句,你尝试过吗

>> life
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Matlab 中的这个生命游戏有什么问题吗? 的相关文章

随机推荐