Проблема с программой на питон
Имеется программа развития жизни клеток на поле,никак не пойму как организовать смерть клетки,по условию задачи клетка должна умирать через 10 секунд Сама программа:
import pygame, sys
from pygame.locals import *
import random
FPS = 2 #На нем висит скорость развития колонии
WINDOWWIDTH = 600 #ширина окна, влияет на количество клеток в ширину
WINDOWHEIGHT = 600 #высота окна, влияет на количество клеток в высоту
CELLSIZE = 20 #размер клетки
assert WINDOWWIDTH % CELLSIZE == 0, "Window width must be a multiple of cell size"
assert WINDOWHEIGHT % CELLSIZE == 0, "Window height must be a multiple of cell size"
CELLWIDTH = WINDOWWIDTH // CELLSIZE #получаем int количесвта клеток, чтобы поровну распределить на площади
CELLHEIGHT = WINDOWHEIGHT // CELLSIZE
#определяем цвета в RGB, можно менять
BLACK = (0, 0, 0)
WHITE = (255,255,255)
DARKGRAY = (40, 40, 40)
GREEN = (0, 255,0)
#Отрисовка решетки
def Grider():
for x in range(0, WINDOWWIDTH, CELLSIZE):
pygame.draw.line(DISPLAYSURF, DARKGRAY, (x,0),(x,WINDOWHEIGHT))
for y in range (0, WINDOWHEIGHT, CELLSIZE):
pygame.draw.line(DISPLAYSURF, DARKGRAY, (0,y), (WINDOWWIDTH, y))
#заполняем клетки
def kletki():
grid = {}
for y in range (CELLHEIGHT):
for x in range (CELLWIDTH):
grid[x,y] = 0
return grid
#а теперь заполняем их рандомной жизнью
def RandomFill(life):
for item in life:
life[item] = random.randint(0,1)
return life
#красим живых в зеленый
def colourise(item, life):
x = item[0]
y = item[1]
y = y * CELLSIZE
x = x * CELLSIZE
if life[item] == 0:
pygame.draw.rect(DISPLAYSURF, WHITE, (x, y, CELLSIZE, CELLSIZE))
if life[item] == 1:
pygame.draw.rect(DISPLAYSURF, GREEN, (x, y, CELLSIZE, CELLSIZE))
return None
#получаем информацию о соседях клетки
def Neighbour(item,life):
neighbours = 0
for x in range (-1,2):
for y in range (-1,2):
checkCell = (item[0]+x,item[1]+y)
if checkCell[0] < CELLWIDTH and checkCell[0] >=0:
if checkCell [1] < CELLHEIGHT and checkCell[1]>= 0:
if life[checkCell] == 1:
if x == 0 and y == 0:
neighbours += 0
else:
neighbours += 1
return neighbours
#высчитываем потенциал клетки, можно менять абсолютно все ради динамики,
#не стал делать смерть от 6 клеток соседей, так как в таком случае колония не двигается
def tick(life):
newTick = {}
for item in life:
numberNeighbours = Neighbour(item, life)
if life[item] == 1:
if numberNeighbours < 2:
newTick[item] = 0
elif numberNeighbours > 2:
newTick[item] = 0
else:
newTick[item] = 1
elif life[item] == 0:
if numberNeighbours == 2:
newTick[item] = 1
else:
newTick[item] = 0
return newTick
#главная функция, отрисовка всего и обновление экрана для дальнейшей отрисовки
def main():
pygame.init()
global DISPLAYSURF
FPSCLOCK = pygame.time.Clock()
DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH,WINDOWHEIGHT))
pygame.display.set_caption('Life')
DISPLAYSURF.fill(WHITE)
life = kletki()
life = RandomFill(life)
for item in life:
colourise(item, life)
Grider()
pygame.display.update()
while True: #вот здесь главный цикл, время и распределение цвета
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
life = tick(life)
for item in life:
colourise(item, life)
Grider()
pygame.display.update()
FPSCLOCK.tick(FPS)
if __name__=='__main__':
main()
Ответы (1 шт):
Автор решения: Sectarian
→ Ссылка
Поправил я ваш код и разобрался в нём.
Теперь клетка хранит не только жива она или нет, но и время её создания, всё это в виде списка в виде [0, time.time()], так же дополнил функцией, которая вызывается когда клетка и до этого была жива и осталась жить, функция просто смотрит, если клетка жила больше 10 сек возвращает True и клетка убивается, хотя в иных условиях осталась бы жить.
import pygame, sys
from pygame.locals import *
import random
import time
FPS = 2 #На нем висит скорость развития колонии
WINDOWWIDTH = 600 #ширина окна, влияет на количество клеток в ширину
WINDOWHEIGHT = 600 #высота окна, влияет на количество клеток в высоту
CELLSIZE = 20 #размер клетки
assert WINDOWWIDTH % CELLSIZE == 0, "Window width must be a multiple of cell size"
assert WINDOWHEIGHT % CELLSIZE == 0, "Window height must be a multiple of cell size"
CELLWIDTH = WINDOWWIDTH // CELLSIZE #получаем int количесвта клеток, чтобы поровну распределить на площади
CELLHEIGHT = WINDOWHEIGHT // CELLSIZE
#определяем цвета в RGB, можно менять
BLACK = (0, 0, 0)
WHITE = (255,255,255)
DARKGRAY = (40, 40, 40)
GREEN = (0, 255,0)
#Отрисовка решетки
def Grider():
for x in range(0, WINDOWWIDTH, CELLSIZE):
pygame.draw.line(DISPLAYSURF, DARKGRAY, (x,0),(x,WINDOWHEIGHT))
for y in range (0, WINDOWHEIGHT, CELLSIZE):
pygame.draw.line(DISPLAYSURF, DARKGRAY, (0,y), (WINDOWWIDTH, y))
#заполняем клетки
def kletki():
grid = {}
for y in range (CELLHEIGHT):
for x in range (CELLWIDTH):
grid[x,y] = [0, time.time()]
return grid
#а теперь заполняем их рандомной жизнью
def RandomFill(life):
for item in life:
life[item][0] = random.randint(0,1)
life[item][1] = time.time()
return life
#красим живых в зеленый
def colourise(item, life):
x = item[0]
y = item[1]
y = y * CELLSIZE
x = x * CELLSIZE
if life[item][0] == 0:
pygame.draw.rect(DISPLAYSURF, WHITE, (x, y, CELLSIZE, CELLSIZE))
if life[item][0] == 1:
pygame.draw.rect(DISPLAYSURF, GREEN, (x, y, CELLSIZE, CELLSIZE))
return None
#получаем информацию о соседях клетки
def Neighbour(item,life):
neighbours = 0
for x in range (-1,2):
for y in range (-1,2):
checkCell = (item[0]+x,item[1]+y)
if checkCell[0] < CELLWIDTH and checkCell[0] >=0:
if checkCell [1] < CELLHEIGHT and checkCell[1]>= 0:
if life[checkCell][0] == 1:
if x == 0 and y == 0:
neighbours += 0
else:
neighbours += 1
return neighbours
#высчитываем потенциал клетки, можно менять абсолютно все ради динамики,
#не стал делать смерть от 6 клеток соседей, так как в таком случае колония не двигается
def tick(life):
newTick = {}
for item in life:
numberNeighbours = Neighbour(item, life)
if life[item][0] == 1:
if numberNeighbours < 2:
newTick[item] = [0,0]
elif numberNeighbours > 2:
newTick[item] = [0,0]
else:
#Здесь проверяется, если клетка жила больше 10 секунд, мы её убиваем, и ставим время
# но оно не на что не виляет, так как клетка мертва, Если прошло больше 10 сек, то оставляем её время создания
if oldCheck(life[item]):
newTick[item] = [0, 0]
else:
newTick[item] = [1, life[item][1]]
elif life[item][0] == 0:
if numberNeighbours == 2:
newTick[item] = [1,time.time()]
else:
newTick[item] = [0,0]
return newTick
def oldCheck(cell):
if cell[1] > time.time() + 10:
return True
#главная функция, отрисовка всего и обновление экрана для дальнейшей отрисовки
def main():
pygame.init()
global DISPLAYSURF
FPSCLOCK = pygame.time.Clock()
DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH,WINDOWHEIGHT))
pygame.display.set_caption('Life')
DISPLAYSURF.fill(WHITE)
life = kletki()
life = RandomFill(life)
for item in life:
colourise(item, life)
Grider()
pygame.display.update()
while True: #вот здесь главный цикл, время и распределение цвета
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
life = tick(life)
for item in life:
colourise(item, life)
Grider()
pygame.display.update()
FPSCLOCK.tick(FPS)
if __name__=='__main__':
main()