Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 康威';生活的游戏不会改变任何事情_Python_Python 2.7_For Loop - Fatal编程技术网

Python 康威';生活的游戏不会改变任何事情

Python 康威';生活的游戏不会改变任何事情,python,python-2.7,for-loop,Python,Python 2.7,For Loop,因此,我必须用以下5条规则来做康威的人生游戏: 只有少于两个活邻居的细胞死亡 有3个以上活邻居的细胞死亡 一个死了的牢房有三个活的邻居就活了 所有边缘单元保持为0 所有其他细胞都保持其状态 例如: >>> A = [ [0,0,0,0,0], [0,0,1,0,0], [0,0,1,0,0], [0,0,1,0,0], [0,0,0,0,0]] >>> printBoard(A) 00000 00100 00100 00100 00000

因此,我必须用以下5条规则来做康威的人生游戏:

  • 只有少于两个活邻居的细胞死亡
  • 有3个以上活邻居的细胞死亡
  • 一个死了的牢房有三个活的邻居就活了
  • 所有边缘单元保持为0
  • 所有其他细胞都保持其状态

    例如:

    >>> A = [ [0,0,0,0,0],
      [0,0,1,0,0],
      [0,0,1,0,0],
      [0,0,1,0,0],
      [0,0,0,0,0]]
    
     >>> printBoard(A)
    00000
    00100
    00100
    00100
    00000
    
    >>> A2 = next_life_generation( A )
    >>> printBoard(A2)
    00000
    00000
    01110
    00000
    00000
    
    >>> A3 = next_life_generation( A2 )
    >>> printBoard(A3)
    00000
    00100
    00100
    00100
    00000
    
    等等

  • 请注意,
    next\u life\u generation(A)
    返回一个新的电路板,因此我可以继续将A重新绑定到每个后续的一代。这是我目前的代码:

    import sys
    def printBoard( A ):
        """ this function prints the 2d list-of-lists
            A without spaces (using sys.stdout.write)
        """
        for row in A:
            for col in row:
                sys.stdout.write( str(col) )
            sys.stdout.write( '\n' )
    
    def countNeighbors(row, col, A):
        count = 0
        for row in range(1, len(A) - 1):
            for col in range(1, len(A) - 1):
                if A[row][col] == 1:
                    count += 1
        return count
    
    def next_life_generation(A):
        for row in range(1, len(A) - 1):
            for col in range(1, len(A) - 1):
                if A[row][col] == 0 and countNeighbors(row, col, A) == 3:
                    A[row][col] = 1
                if countNeighbors(row, col, A) < 2:
                    A[row][col] = 0
                elif countNeighbors(row, col, A) > 3:
                    A[row][col] = 0
        return A
    

    我真的很感激有人帮忙

    在你对CountNeights的定义中,你在循环什么? 您将从row=1,…,A |-1开始 首先,在python中,range从mininclusive开始,排除max

    范围(0,len(A))

    但这仍然不对。在下一代_life_中,您将遍历所有行和列(在这里也更正了范围错误之后)。因此,我认为您需要检查单元格周围的近邻,以确定行和列的每个值。我想您已经意识到了这一点,这就是为什么要传递行和列值来进行检查
    countneighbories(行、列、X)==3:
    但再说一遍,你在循环什么? 从0到| A |,用于行和列。所以每次你对整个矩阵求和,在你的例子中总是3

    这里有一些东西可以尝试:

    def countNeighbors(row, col, A):
    count = 0
    for r in range(max(row-1,0), min(row+2, len(A))):
        for c in range(max(row-1,0), min(row+2, len(A))):
            if A[r][c] == 1:
                count += 1
    return count
    

    注意最小值和最大值(注意最小值(第+2行,len(A)),因为范围将停止在最小值(第+1行,或len(A)-1),所以不会出现索引越界错误。

    什么是印刷板(A)?我在你的代码中看不到这样的功能。请提供一个人们在实现life时常犯的错误:如果你在适当的位置更新矩阵中的每个单元,那么最终你就无法在时间t-1准确地确定每个邻居的状态,因为其中一些单元在时间t被更新为包含它们的状态。你需要两个矩阵:一个保持旧状态,一个将保持新状态。
    def countNeighbors(row, col, A):
    count = 0
    for r in range(max(row-1,0), min(row+2, len(A))):
        for c in range(max(row-1,0), min(row+2, len(A))):
            if A[r][c] == 1:
                count += 1
    return count