Ошибки игры "Жизнь" выполнены неправильно
Моя игра в жизнь жизни в 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
после того, как вы зациклились на всем.