Как исправить змейку?

Всем привет, написал простую змейку и возникла ошибка в том, что красные клетки расположены далеко друг от друга, как это можно исправить?

import pygame

SIZE_BLOCK = 14
WHITE = (180, 180, 200)
BLUE_BLACK = (225, 225, 225)
BLACK = (0, 0, 0)
HEADER_COLOR = (255, 255, 255)
SNAKE_COLOR = (255, 0, 0)
COUNT_BLOCK = 25
HEADER_MARGIN = 70
MARGIN = 1
size = [SIZE_BLOCK * COUNT_BLOCK + 2 * SIZE_BLOCK + MARGIN * COUNT_BLOCK,
        SIZE_BLOCK * COUNT_BLOCK + 2 * SIZE_BLOCK + MARGIN * SIZE_BLOCK + HEADER_MARGIN + 10]
screen = pygame.display.set_mode(size)
print(size)
pygame.display.set_caption('snake')
timer = pygame.time.Clock()


def draw_block(color, row, column):
    pygame.draw.rect(screen, color,
                     [SIZE_BLOCK + column * SIZE_BLOCK + MARGIN * (column + 1),
                      HEADER_MARGIN + SIZE_BLOCK + row * SIZE_BLOCK + MARGIN * (row + 1),
                      SIZE_BLOCK,
                      SIZE_BLOCK])


class SnakeBlock:
    def __init__(self, x, y):
        self.x = x
        self.y = y


snake_block = [SnakeBlock(9, 8), SnakeBlock(9, 9), SnakeBlock(9, 10)]
d_row = 0
d_col = 1

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP and d_col != 0:
                d_row = -1
                d_col = 0
            elif event.key == pygame.K_DOWN and d_col != 0:
                d_row = 1
                d_col = 0
            elif event.key == pygame.K_LEFT and d_row != 0:
                d_row = 0
                d_col = -1
            elif event.key == pygame.K_RIGHT and d_row != 0:
                d_row = 0
                d_col = 1

    screen.fill(WHITE)
    pygame.draw.rect(screen, HEADER_COLOR, [0, 0, size[0], HEADER_MARGIN])
    for row in range(COUNT_BLOCK):
        for column in range(COUNT_BLOCK):
            if (row + column) % 2 == 0:
                color = BLACK
            else:
                color = BLACK
            draw_block(color, row, column)

    for block in snake_block:
        draw_block(SNAKE_COLOR, block.x, block.y)
        block.x += d_row
        block.y += d_col

        head = snake_block[-1]
        new_head = SnakeBlock(head.x + d_row, head.y + d_col)
        snake_block.append(new_head)
        snake_block.pop(0)

    pygame.display.flip()
    timer.tick(2)

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

Автор решения: Danis

создания новой части надо вынести из цикла for

import pygame

SIZE_BLOCK = 14
WHITE = (180, 180, 200)
BLUE_BLACK = (225, 225, 225)
BLACK = (0, 0, 0)
HEADER_COLOR = (255, 255, 255)
SNAKE_COLOR = (255, 0, 0)
COUNT_BLOCK = 25
HEADER_MARGIN = 70
MARGIN = 1
size = [SIZE_BLOCK * COUNT_BLOCK + 2 * SIZE_BLOCK + MARGIN * COUNT_BLOCK,
        SIZE_BLOCK * COUNT_BLOCK + 2 * SIZE_BLOCK + MARGIN * SIZE_BLOCK + HEADER_MARGIN + 10]
screen = pygame.display.set_mode(size)
print(size)
pygame.display.set_caption('snake')
timer = pygame.time.Clock()


def draw_block(color, row, column):
    pygame.draw.rect(screen, color,
                     [SIZE_BLOCK + column * SIZE_BLOCK + MARGIN * (column + 1),
                      HEADER_MARGIN + SIZE_BLOCK + row * SIZE_BLOCK + MARGIN * (row + 1),
                      SIZE_BLOCK,
                      SIZE_BLOCK])


class SnakeBlock:
    def __init__(self, x, y):
        self.x = x
        self.y = y


snake_block = [SnakeBlock(9, 8), SnakeBlock(9, 9), SnakeBlock(9, 10)]
d_row = 0
d_col = 1

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP and d_col != 0:
                d_row = -1
                d_col = 0
            elif event.key == pygame.K_DOWN and d_col != 0:
                d_row = 1
                d_col = 0
            elif event.key == pygame.K_LEFT and d_row != 0:
                d_row = 0
                d_col = -1
            elif event.key == pygame.K_RIGHT and d_row != 0:
                d_row = 0
                d_col = 1

    screen.fill(WHITE)
    pygame.draw.rect(screen, HEADER_COLOR, [0, 0, size[0], HEADER_MARGIN])
    for row in range(COUNT_BLOCK):
        for column in range(COUNT_BLOCK):
            if (row + column) % 2 == 0:
                color = BLACK
            else:
                color = BLACK
            draw_block(color, row, column)

    for block in snake_block:
        draw_block(SNAKE_COLOR, block.x, block.y)
        block.x += d_row
        block.y += d_col

    head = snake_block[-1]
    new_head = SnakeBlock(head.x + d_row, head.y + d_col)
    snake_block.append(new_head)
    snake_block.pop(0)

    pygame.display.flip()
    timer.tick(2)
→ Ссылка