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