Паттерны игры «Жизнь» реализованы неправильно

Реализация моей игры жизни Конвея на Python, кажется, не следует правилам правильно, и я не могу понять, что может быть не так. Когда я добавляю окончательную конфигурацию в 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 рисует белый. Они оба, кажется, работают правильно.


person Luke Taylor    schedule 02.03.2015    source источник
comment
возможный дубликат Игры жизни Конвея с Python   -  person OJFord    schedule 02.03.2015
comment
Это не. Они были мимо моей проблемы.,   -  person Luke Taylor    schedule 03.03.2015
comment
Почему за это минусуют??   -  person Luke Taylor    schedule 03.03.2015
comment
Потому что это дамп кода «решите мою невыявленную проблему для меня».   -  person OJFord    schedule 05.03.2015
comment
В порядке. В этом есть смысл. Так что, если у меня снова возникнет похожая проблема, я добавлю больше описания. Я торопился писать это, потому что мне нужно было идти в школу, и я надеялся, что кто-то сможет решить мою проблему за это время.   -  person Luke Taylor    schedule 06.03.2015
comment
Лучше? Или это все же дамп кода?   -  person Luke Taylor    schedule 01.04.2015
comment
Чувак, тебе 13, ты пишешь FSM, ты молодец! Ты напоминаешь мне обо мне. Так держать!   -  person superluminary    schedule 11.05.2015
comment
@superluminary Спасибо!   -  person Luke Taylor    schedule 17.05.2015


Ответы (1)


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

person Isaac Drachman    schedule 02.03.2015