Ошибки игры "Жизнь" выполнены неправильно

Моя игра в жизнь жизни в Conway на Python, похоже, не соответствует правилам, и я не могу понять, что может быть неправильным. Когда я вношу окончательную конфигурацию в Golly, она продолжает прошлое, что было сделано.

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

Я также поставил целую маленькую доску из своей игры в Golly, и она сильно изменилась по сравнению с моей конфигурацией. Golly - симулятор жизни, который широко используется.

Я испробовал несколько разных вещей, чтобы исправить мою проблему:

  • Я сломал логические выражения в своем коде, чтобы использовать инструкции and/or.
  • Я протестировал свою функцию neighbors(), вставив ее в свою собственную программу и установив некоторые конфигурации сетки.
  • Затем я посмотрел на распечатанную сетку, и я позвонил neighbors() на определенную позицию. Он отлично работал.

Глядя на мой код, я не понимаю, почему он не работает. Я не получаю ошибок, он работает, он просто работает неправильно. Шаблоны прогрессируют гораздо иначе, чем то, как они должны. Это также первая > 100-линейная программа, которую я написал, не следуя инструкциям даже свободно, так что простите меня, если ответ очевиден.

Соответствующий код выглядит следующим образом:

#Function to find number of live neighbors
def neighbors(row, column):
    adjacents = 0

    #Horizontally adjacent
    if row > 0:
        if board[row-1][column]:
            adjacents += 1
    if column > 0:
        if board[row][column-1]:
            adjacents += 1
    if row < thesize-1:
        if board[row+1][column]:
            adjacents += 1
    if column < thesize-1:
        if board[row][column+1]:
            adjacents += 1

    #Diagonally adjacent
    if row > 0 and column > 0:
        if board[row-1][column-1]:
            adjacents += 1
    if row < thesize-1 and column < thesize-1:
        if board[row+1][column+1]:
            adjacents += 1
    if row > 0 and column < thesize-1:
        if board[row-1][column+1]:
            adjacents += 1
    if row < thesize-1 and column > 0:
        if board[row+1][column-1]:
            adjacents += 1

    #Return the final count (0-8)
    return adjacents

Кажется, это прекрасно работает, чтобы вернуть, сколько из 8 соседей любой данной ячейки живы. Этот следующий бит - это логическая часть, в которой, я думаю, проблема. Он изменяет массив в соответствии с правилами игры.

#Main loop
while 1:

    #Manage the rules of the game
    for r in range(len(board)):
        for c in range(len(board)):
            neighborcount = neighbors(r, c)
            if board[r][c]:
                giveLife(r, c)
                if neighborcount < 2 or neighborcount > 3:
                    board[r][c] = False
            elif not board[r][c]:
                killRuthlessly(r, c)
                if neighborcount == 3:
                    board[r][c] = True

Наконец, часть, которая визуально отображает квадраты на экране pygame. Это проверено и, кажется, работает хорошо, я просто подумал, что включу его в случае возникновения проблемы.

    for r in range(len(board)):
        for c in range(len(board)):
            if board[r][c]:
                giveLife(r, c)
            if not board[r][c]:
                killRuthlessly(r, c)

giveLife - это функция, которая рисует черный прямоугольник в данной позиции, killRuthlessly рисует белый. Они оба работают нормально.

Ответы

Ответ 1

Для логики, которая проходит через доску и проверяет соседние ячейки, она включает/выключает ячейки, продолжая проверять других. Вероятно, вы читаете соседние ячейки как живые или мертвые не потому, что они были на предыдущем шаге (что важно), а потому, что вы изменили свое состояние, поскольку они уже зациклились. Попробуйте создать tmp_board, который копирует текущую плату и какие изменения будут выполнены. Затем скопируйте его обратно в board после того, как вы зациклились на всем.