Top.Mail.Ru
Ответы

Проблема. Игра "Жизнь"

Решил сделать игру "Жизнь" на 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 не нужны.