В большинстве кодов примеров из жизни, которые я видел в Интернете, использовались математические классы и логические выражения (true / false). Вместо этого я попытался создать одну функцию, которая выполняет итерацию по каждой ячейке в матрице, а затем обновляет всю матрицу в соответствии с правилами игры, а затем возвращает новую матрицу. Причина этого заключается в том, что для моего проекта я буду использовать предварительно подготовленные входные данные с матрицами одинакового размера.
Я думаю, что в настоящее время это может обновлять каждую ячейку по мере ее прохождения, а также вместо всех ячеек. Будучи только живым (1) или мертвым (0), он возвращает значения, например 118.
Пример входных данных показан ниже:
[[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0]
[0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0]
[0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
Это моя попытка до сих пор ... Я думаю, что моя проблема связана с типом данных в матрице (numpy int) - в одном случае я должен добавить их, чтобы найти число соседних ячеек (это определяет, умирает ли ячейка после следующего тика или поколения), а в другом я просто хочу переписать 1 или 0 в новом matix (в той же позиции, что и рассматриваемая ячейка входной матрицы) на основе соседей этой ячейки во входных данных.
вот моя попытка
def tick(matrix):
new_state = np.empty_like(matrix)
for i in range(17):
for j in range(17):
north = matrix[i][j-1]
south = matrix[i][j+1]
west = matrix[i+1][j]
east = matrix[i-1][j]
se = matrix[i+1][i+1]
sw = matrix[i+1][i-1]
ne = matrix[i-1][i+1]
nw = matrix[i-1][i-1]
neibours = np.sum([north, south, west, east, se, sw, ne, nw])
if matrix[i][j] == '0' and neibours == 3:
new_state [i][j] == '1'
if matrix[i][j] == '1' and neibours<2:
new_state [i][j] == '0'
if matrix[i][j] == '1' and neibours>4:
new_state [i][j] == '0'
if matrix[i][j] == '1' and neibours==2 or 3:
new_state [i][j] == '1'
return new_state
world2 = np.loadtxt('data/Loaf.txt',dtype=np.int8)
world3 = np.loadtxt('data/Pentadecathlon.txt',dtype=np.int8)
world1 = np.loadtxt('data/Pulsar.txt',dtype=np.int8)
l = tick(world1)
print(l)
Я думаю, мне также понадобится добавить некоторое условие, которое касается элементов на краю матрицы, которые не имеют полного набора соседей. Я действительно потерялся в том, как бы я делал это в своей функции.