Проблема. Игра "Жизнь"
Решил сделать игру "Жизнь" на Python. 5 раз перепроверил код, всё равно проблема. Она заключается в том, что логика игры работает неправильно. То есть код ошибок не выдаёт, но игра работает неправильно. Уже 3-ий раз спрашиваю, либо присылают ответы с ChatGPT, которые не работают, либо просто не отвечают. Эксперты в мире Пайтона, разберитесь :)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
import pygame
pygame.init()
screen = pygame.display.set_mode((1500,1000))
time = pygame.time.Clock()
run = True
gp = False
coordinates = []
blocks = []
blocks_copy = []
block = pygame.Surface((50,50))
block.fill('White')
xc = 0
yc = 0
while len(coordinates) != 600:
if xc < 1500:
coordinates.append((xc,yc))
xc += 50
else:
xc = 0
yc += 50
while run:
key = pygame.key.get_pressed()
mouse = pygame.mouse.get_pos()
if gp:
blocks_copy = blocks
for cord in coordinates:
sum = 0
if (cord[0]-50,cord[1]) in blocks:
sum += 1
if (cord[0],cord[1]+50) in blocks:
sum += 1
if (cord[0]+50,cord[1]) in blocks:
sum += 1
if (cord[0],cord[1]-50) in blocks:
sum += 1
if (cord[0]-50,cord[1]-50) in blocks:
sum += 1
if (cord[0]-50,cord[1]+50) in blocks:
sum += 1
if (cord[0]+50,cord[1]-50) in blocks:
sum += 1
if (cord[0]+50,cord[1]+50) in blocks:
sum += 1
if cord in blocks:
if sum == 2 or sum == 3:
pass
else:
blocks_copy.remove(cord)
else:
if sum == 3:
blocks_copy.append(cord)
else: pass
blocks = blocks_copy
time.tick(5)
else:
for cord in coordinates:
block_rect = block.get_rect(topleft=cord)
if block_rect.collidepoint(mouse) and pygame.mouse.get_pressed()[0]:
blocks.append(cord)
if key[pygame.K_SPACE]:
gp = True
if key[pygame.K_BACKSPACE]:
del blocks[len(blocks)-1]
screen.fill('Black')
for x in range(1,30):
pygame.draw.aaline(screen, 'White', (x*50,0),(x*50,1000))
for y in range(1,20):
pygame.draw.aaline(screen, 'White', (0,y*50),(1500,y*50))
for rect in blocks:
screen.blit(block, (rect))
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
pygame.quit()
Только авторизированные пользователи могут оставлять свои ответы
Дата
Популярность
Твоя ошибка заключается вот в этой строчке:
1
blocks_copy = blocks
blocks_copy - НЕ копия blocks, а ссылка на тот же самый массив blocks.
И любые изменения в blocks_copy автоматически меняют blocks.
Простейший вариант исправления:
1
blocks_copy = blocks[:]
Это создаст новый массив, который и будет присвоен blocks_copy.
А вот if'ы можно упростить:
123
if cord in blocks:
if sum not in [2, 3]: blocks_copy.remove(cord)
elif sum == 3: blocks_copy.append(cord)
Ветки с pass не нужны.