Игра Python Conway's Game of Life не работает должным образом с дизайном планера

Я пытаюсь воспроизвести «Игру жизни» Конвея на Python. Правила этой симуляции и ее правильно работающую версию можно найти здесь: https://bitstorm.org/gameoflife/

В моей версии, когда я случайным образом назначаю клетки живыми в начале, кажется, что они ведут себя правильно, с классическими аморфными каплями клеток, расширяющимися по экрану.

Однако, когда я повторяю расположение «планерной пушки» (которое также можно увидеть на связанном веб-сайте), клетки не обновляются должным образом: структуры немного распадаются, а затем движение клеток остается застойным.

Это заставляет меня поверить, что в моем коде есть логическая ошибка - любая помощь будет оценена!

Это раздел моего кода в моем классе Cell, который обновляет свое выживание на основе его neighbors (восемь окружающих его ячеек):

def update(self, neighbors):
    numAliveNeighbors = 0
    for neighbor in neighbors:
        if neighbor.isAlive:
            numAliveNeighbors+=1

    if numAliveNeighbors <= 1 or numAliveNeighbors >=4:
        self.isAlive = False
    elif not self.isAlive and numAliveNeighbors is 3:
        self.isAlive = True

Это часть моего кода, которая находит все neighbors каждого cell и вызывает для них метод update:

for row in range(len(cells)):
    for column in range(len(cells[row])):
            neighbors = []
            for tempRow in range (row-1, row + 2):
                for tempColumn in range (column-1, column + 2):
                    if tempRow >= 0 and tempRow < len(cells):
                        if tempColumn >= 0 and tempColumn < len(cells[tempRow]):
                            if not(tempRow is row and tempColumn is column):
                                neighbors.append(cells[tempRow][tempColumn])
            cells[row][column].update(neighbors)

person Josh Katofsky    schedule 27.10.2017    source источник


Ответы (1)


Обновления на месте

Вы выполняете обновления на месте; то есть вы обновляете каждую ячейку по отдельности. Что вам нужно сделать, так это создать клонированную сетку и каждый раз, когда вы обновляете ячейку на итерации, обновлять клонированную сетку, а затем устанавливать игровое поле на клонированную сетку. В противном случае ячейки будут обновляться на основе текущей итерации, что не имеет смысла.

Что вы можете сделать, это что-то вроде этого:

def isAlive(alive, neighbours):
    return (alive and 2 <= neighbours <= 3) or (not alive and neighbours == 3)

def update(cells):
    grid = [[0] * len(row) for row in cells]
    for row in range(len(cells)):
        for col in range(len(cells[row])):
            neighbours = 0
            for tr in range(row - 1, row + 2):
                for tc in range(col - 1, col + 2):
                    if (tr != row or tr != col) and cells[tr][tc]:
                        neighbours += 1
            grid[row][col] = isAlive(cells[row][col], neighbours)
return grid

Затем вы можете вызвать cells = update(cells) в цикле.

person hyper-neutrino    schedule 27.10.2017