Conway's "Game of life" на Python

Заранее спасибо всем кто откликнется. Я в этом деле новичок так что тапками кидать не сильно)

Недавно решил реализовать самую простую модель клеточного автомата в консоли на Python.

Застрял на моменте создания правил. (Я так подозреваю.Может быть проблема в другом)

Как нулевое поколение прописал самый простой глайдер. После первого поколения клетки впадают в "статичное" состояние. результаты вывода прикреплю чуть ниже кода

Сам код:

from copy import deepcopy
Board = [
[True, True, True, True, True, True, True, True, True, True, True, True],
[True, True, False, True, True, True, True, True, True, True, True, True], # 10 * 10 - Starter
[True, True, True, False, True, True, True, True, True, True, True, True], # 12 * 12 - Edited
[True, False, False, False, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True, True, True, True]]
 
def CreateNewBoard(board):
    Dead = []
    Alive = []
    for y in range(1,11):
        for x in range(1,11):
            counter = -1
            for i in range(y-1,y+2):
                for j in range(x-1,x+2):
                    if not board[i][j]:
                        counter += 1
            if counter == 2 and not board[y][x]:
                Alive.append([y,x])
            elif counter == 3:
                Alive.append([y,x])
            else:
                Dead.append([y,x])
    NewBoard = [[True]*12 for _ in range(12)]
    for cell in Alive:
        NewBoard[cell[0]][cell[1]] = False
    for cell in Dead:
        NewBoard[cell[0]][cell[1]] = True
    return NewBoard

def printBoard(board):
    board1 = deepcopy(board)
    for y in range(1,11):
        for x in range(1,11):
            if board1[y][x]:
                board1[y][x] = 'O'
            else:
                board1[y][x] = '#'
        print(*board1[y][1:11])
        
printBoard(Board)
while input() != 'q':
    Board = CreateNewBoard(Board)
    printBoard(Board)
# Нулевое поколение
O # O O O O O O O O
O O # O O O O O O O
# # # O O O O O O O
O O O O O O O O O O
O O O O O O O O O O
O O O O O O O O O O
O O O O O O O O O O
O O O O O O O O O O
O O O O O O O O O O
O O O O O O O O O O

#Первое поколение, последующие точно такие же
O O O O O O O O O O
O O # O O O O O O O
O # # O O O O O O O
O O O O O O O O O O
O O O O O O O O O O
O O O O O O O O O O
O O O O O O O O O O
O O O O O O O O O O
O O O O O O O O O O
O O O O O O O O O O

Ответы (1 шт):

Автор решения: Adam Bright

Честно, сложно было читать, так что просто переписал частично. Сама ваша ошибка заключалась в counter = -1. Там должно было быть counter = 0 и if cell: counter -= 1, т.к. вычитать 1 надо только, если ячейка "жива", а не всегда. Так же подправил названия под PEP-8 и чутка улучшил "рендер" :D

P.S. единицы и ноли не жрут больше памяти, т.к. от -5 до 255 (вроде столько) целые числа заранее зарегистрированы и мы просто копируем указатель на них

from copy import deepcopy


def update_board(board: list[list[int]]) -> list[list[int]]:
    new_board = deepcopy(board)
    for x, row in enumerate(board[1:-1], 1):
        for y, cell in enumerate(row[1:-1], 1):
            neighbours = sum(
                board[i][j]
                for i in range(x - 1, x + 2)
                for j in range(y - 1, y + 2)
            ) - cell
            if cell:
                new_board[x][y] = int(2 <= neighbours <= 3)
            elif neighbours == 3:
                new_board[x][y] = 1
    return new_board


def print_board(board):
    for row in board[1:-1]:
        print(*['■' if cell else '□' for cell in row[1:-1]])


def main():
    # Планер
    board = [
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 1, 0, 1, 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, 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],
    ]
    print_board(board)
    while input() != 'q':
        board = update_board(board)
        print_board(board)


if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print()
→ Ссылка