Нам нужно ставить яблоко в случайное место. Чтобы не писать это дважды, заведём функцию — кусок кода с именем, который можно вызывать.
def spawn_food(snake): """Случайная клетка, в которой НЕТ змейки.""" while True: pos = (random.randint(0, COLS - 1), random.randint(0, ROWS - 1)) if pos not in snake: return pos
def spawn_food(snake): — создаём команду с именем
spawn_food, ей нужна змейка.random.randint(0, COLS - 1) — случайное число (колонка).if pos not in snake — а вдруг выпало прямо на змейку? Тогда
крутим ещё раз. Возвращаем место, только если оно свободно.return pos — отдаём найденное место наружу.food = spawn_food(snake) # первое яблоко score = 0 while True: # ... события, новая голова ... snake.insert(0, new_head) # Съели яблоко? Растём — хвост НЕ убираем. if new_head == food: score += 1 food = spawn_food(snake) pygame.display.set_caption(f"Змейка — {score}") else: snake.pop() # не съели — убираем хвост как обычно # Рисуем яблоко красным food_rect = pygame.Rect(food[0] * CELL, food[1] * CELL, CELL, CELL) pygame.draw.rect(screen, RED, food_rect) # ... потом рисуем змейку ...
Помнишь урок 4? Обычный шаг = вставить голову + убрать хвост (длина не меняется). А чтобы змейка выросла, мы просто не убираем хвост в тот кадр, когда съели яблоко.
То есть «съесть яблоко» = «пропустить один pop()». Вот и весь
секрет роста.
f"Змейка — {score}" — это «форматированная строка». То, что в
фигурных скобках {score}, заменяется на значение переменной.
Если score = 3, получится "Змейка — 3". Мы пишем
счёт прямо в заголовок окна — это проще, чем рисовать текст.
score += 5.food2 и нарисуй его
тоже. Не забудь проверять оба!