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 шт):
Честно, сложно было читать, так что просто переписал частично. Сама ваша ошибка заключалась в 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()