简体   繁体   English

ATBS Conway 的生命游戏代码似乎不正确

[英]ATBS Conway's Game of Life code doesnt seem right

I just started learning python with the help of automatetheboringstuff.com i'm in Chapter 4 right now, trying to understand the Conway's Game of Life code.我刚开始在automatedtheboringstuff的帮助下学习python。com我现在在第4章,试图理解康威的生命游戏代码。 I understand the game rules but the codes result looks wrong to me and i'm not sure if the code is actually wrong or i didn't understand the rules.我了解游戏规则,但代码结果在我看来是错误的,我不确定代码是否真的错误,或者我不理解规则。

An example (imgur picture) why i think its wrong.一个例子(imgur图片)为什么我认为它是错误的。 The red dot shows a dead cell which has 3 living neighbours which means it should be alive in the next step but it stays empty(dead).红点表示一个死细胞,它有 3 个活着的邻居,这意味着它应该在下一步中还活着,但它保持空(死)。 Yellow dot shows the same problem.黄点表示同样的问题。 Green has 1 living neighbour and it stay alive but it should not.格林有 1 个活着的邻居,它还活着,但它不应该。

# Conway's Game of Life
import random, time, copy
WIDTH = 60
HEIGHT = 20

# Create a list of list for the cells:
nextCells = []
for x in range(WIDTH):
    column = [] # Create a new column.
    for y in range(HEIGHT):
        if random.randint(0, 1) == 0:
            column.append('#') # Add a living cell.
        else:
            column.append(' ') # Add a dead cell.
    nextCells.append(column) # nextCells is a list of column lists.

while True: # Main program loop.
    print('\n\n\n\n\n') # Separate each step with newlines.
    currentCells = copy.deepcopy(nextCells)

    # Print currentCells on the screen:
    for y in range(HEIGHT):
        for x in range(WIDTH):
            print(currentCells[x][y], end='') # Print the # or space.
        print() # Print a newline at the end of the row.

    # Calculate the next step's cells based on current step's cells:
    for x in range(WIDTH):
        for y in range(HEIGHT):
            # Get neighboring coordinates:
            # `% WIDTH` ensures leftCoord is always between 0 and WIDTH - 1
            leftCoord  = (x - 1) % WIDTH
            rightCoord = (x + 1) % WIDTH
            aboveCoord = (y - 1) % HEIGHT
            belowCoord = (y + 1) % HEIGHT

            # Count number of living neighbors:
            numNeighbors = 0
            if currentCells[leftCoord][aboveCoord] == '#':
                numNeighbors += 1 # Top-left neighbor is alive.
            if currentCells[x][aboveCoord] == '#':
                numNeighbors += 1 # Top neighbor is alive.
            if currentCells[rightCoord][aboveCoord] == '#':
                numNeighbors += 1 # Top-right neighbor is alive.
            if currentCells[leftCoord][y] == '#':
                numNeighbors += 1 # Left neighbor is alive.
            if currentCells[rightCoord][y] == '#':
                numNeighbors += 1 # Right neighbor is alive.
            if currentCells[leftCoord][belowCoord] == '#':
                numNeighbors += 1 # Bottom-left neighbor is alive.
            if currentCells[x][belowCoord] == '#':
                numNeighbors += 1 # Bottom neighbor is alive.
            if currentCells[rightCoord][belowCoord] == '#':
                numNeighbors += 1 # Bottom-right neighbor is alive.

            # Set cell based on Conway's Game of Life rules:
            if currentCells[x][y] == '#' and (numNeighbors == 2 or
numNeighbors == 3):
                # Living cells with 2 or 3 neighbors stay alive:
                nextCells[x][y] = '#'
            elif currentCells[x][y] == ' ' and numNeighbors == 3:
                # Dead cells with 3 neighbors become alive:
                nextCells[x][y] = '#'
            else:
                # Everything else dies or stays dead:
                nextCells[x][y] = ' '
    time.sleep(1) # Add a 1-second pause to reduce flickering.

It looks to me as if this implementation wraps the grid around from top to bottom and from side to side.在我看来,这个实现好像是从上到下和从一侧到另一侧将网格包裹起来。 Cells in the top row therefore have neighbours in the bottom row (and vice versa), and cells in the leftmost column have neighbours in the rightmost column (and vice versa).因此,顶行的单元格在底行有邻居(反之亦然),最左列的单元格在最右列有邻居(反之亦然)。 So:所以:

  • The red cell doesn't come to life because it has five living neighbours: three of them are the cells you've already identified, and the other two are above it and above-and-to-the-left.红细胞没有活过来,因为它有五个活着的邻居:其中三个是你已经确定的细胞,另外两个在它的上方和左上方。 Both of these two other have wrapped around to the bottom row.另外这两个都绕到了底行。

  • Similarly, the yellow cell has a fourth neighbour, diagonally down and to the left of it.类似地,黄色单元格有第四个邻居,在它的对角线下方和左侧。 This has wrapped around to the rightmost column.这已经环绕到最右边的列。

  • The green cell that stays alive has two neighbours, one to its right and one above it (wrapping around again).保持活力的绿色细胞有两个邻居,一个在它的右边,一个在它上面(再次环绕)。

Ultimately, if you're going to write an implementation of Conway's Game Of Life on a finite grid you need to decide what happens at the edges of the grid.最终,如果您要在有限网格上编写康威生命游戏的实现,您需要决定在网格边缘会发生什么。 It seems the author of this code chose to have the grid wrap around.这段代码的作者似乎选择了网格环绕。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM