Используя следующий код:
import random
import pygame
mw = 165 # Matrix width
mh = 165 # Matrix height
margin = 0
newmatrix = []
finished = False
pygame.init()
matrix = []
for i in range(mw): # This block of code just creates a new 2d array and fill it with either a 1 or a 0 in each cell
matrix.append([])
for j in range(mh):
matrix[i].append(random.randint(0, 1))
def neighborchecker():
"""This long block of code checks the 8 cells around matrix[r][c] and checks if it is a 0
or 1, and based on that assigns that cell true or false, adding each cell up to
see how many cells are 1s or 0s and then assigning matrix[r][c] based on its
neighbors"""
for r in range(mw):
for c in range(mh):
try:
if matrix[r - 1][c] == 0:
left = False
else:
left = True
if matrix[r - 1][c - 1] == 0:
botleft = False
else:
botleft = True
if matrix[r][c - 1] == 0:
bot = False
else:
bot = True
if matrix[r + 1][c + 1] == 0:
botright = False
else:
botright = True
if matrix[r + 1][c] == 0:
right = False
else:
right = True
if matrix[r + 1][c + 1] == 0:
topright = False
else:
topright = True
if matrix[r][c - 1] == 0:
top = False
else:
top = True
if matrix[r - 1][c + 1] == 0:
topleft = False
else:
topleft = True
except IndexError:
pass
allneighbor = sum([left, botleft, bot, botright, right, topright, top, topleft])
if allneighbor < 2 or allneighbor > 3:
return 0
if allneighbor == 3:
return 1
def createnewmatrix(): # This block creates a new matrix with new values based on what neighborchecker() returns
for x in range(mw):
newmatrix.append([])
for y in range(mh):
newmatrix[x].append(neighborchecker())
print(newmatrix)
while not finished:
createnewmatrix()
Каждый блок кода имеет комментарий, в котором говорится, что каждый из них делает / по крайней мере должен делать.
Что я ожидаю получить, так это запустить это, получить матрицу, полную единиц и нулей, затем бросить это в цикл, чтобы проверить соседей каждой ячейки и на основе этого изменить соответствующую ячейку на 'newmatrix'. Затем это также входит в цикл, чтобы постоянно обновлять newmatrix.
Если вы знакомы, я пытаюсь реализовать игру жизни Конвея по-своему, и я знаю, что это беспорядочно, но когда я запускаю это - каждая ячейка newmatrix - 2d-массив из около 27k значений либо ВСЕ 1, либо ВСЕ нули меняется случайным образом, когда я запускаю его, что для меня не имеет смысла.
Есть три основные проблемы и пара вещей, которые вам следует исправить.
Вы проверяете if matrix[r - 1][c] == 0:
, даже если r
- это 0
(и то же самое касается c
). Это означает, что вы проверяете matrix[-1][0]
. В Python это не даст IndexError
, как вы думаете, если вы попробуете / поймать, но он вернет элемент в последнем индексе. Например, если у вас есть a = [1, 2, 3, 4, 5]
, использование a[-1]
вернет 5
.
В createnewmatrix
вы постоянно добавляете newmatrix
, но вам нужно сначала сбросить его до пустого состояния. Перед циклом for у вас должен быть newmatrix = []
, что также означает ...
... У вас должно быть два массива. Создайте начальный случайным образом, создайте новый на основе этого, а затем самый простой способ - скопировать новый в исходный и повторить.
Общие вещи, которые вам следует исправить:
Нет необходимости хранить все эти переменные (left
, topleft
и т. д.). Просто сохраните одну переменную со счетчиком и добавьте еще одну, если условие выполнено.
Вы должны начать с инициализации вашей матрицы НЕ случайным образом. В жизненной игре Конвея есть несколько хорошо известных закономерностей. Начните с одного из них, чтобы его хватило на несколько итераций.