Заведём переменную game_over, которая хранит True
или False — «игра закончилась или нет». Это называется
флаг. Пока game_over = False, змейка двигается. Как только
стало True — движение замирает и появляется надпись.
if not game_over: head_x, head_y = snake[0] new_head = (head_x + direction[0], head_y + direction[1]) # Врезались в стену? hit_wall = ( new_head[0] < 0 or new_head[0] >= COLS or new_head[1] < 0 or new_head[1] >= ROWS ) # Врезались в себя? hit_self = new_head in snake if hit_wall or hit_self: game_over = True else: snake.insert(0, new_head) if new_head == food: score += 1 food = spawn_food(snake) else: snake.pop()
Голова вышла за поле, если её x меньше 0 или больше-равно числу колонок
(а также по y). Поле — это клетки от 0 до COLS-1.
innew_head in snake проверяет: «есть ли такая клетка где-нибудь в
теле змейки?» Одна короткая строчка делает всю работу. Вот за такое любят
Python!
if event.type == pygame.KEYDOWN: if game_over and event.key == pygame.K_SPACE: snake, direction, score, food = new_game() game_over = False
Функция new_game() просто возвращает всё в начальное состояние —
короткую змейку, направление вправо, ноль очков и новое яблоко.
if game_over: text = font.render("Игра окончена! Пробел — заново", True, WHITE) text_rect = text.get_rect(center=(WIDTH // 2, HEIGHT // 2)) screen.blit(text, text_rect)
font.render превращает текст в картинку, а blit
«приклеивает» её на экран по центру.
if и цикл.
| Идея | Чему научишься |
|---|---|
| Сохранять рекорд в файл | работа с файлами |
| Стены, через которые можно «пройти насквозь» | остаток от деления % |
| Звук при поедании яблока | pygame.mixer |
| Препятствия-камни на поле | ещё один список |
| Ускорение каждые 5 яблок | clock.tick(10 + score // 5) |
Чтобы игра ощущалась как настоящая — разверни её на весь монитор. Мы добавили
флаг pygame.SCALED и две клавиши:
screen = pygame.display.set_mode((WIDTH, HEIGHT)) fullscreen = False # ... в цикле событий ... if event.type == pygame.KEYDOWN: if event.key == pygame.K_f: # F — вкл/выкл полный экран fullscreen = not fullscreen flags = (pygame.SCALED | pygame.FULLSCREEN) if fullscreen else 0 screen = pygame.display.set_mode((WIDTH, HEIGHT), flags) elif event.key == pygame.K_ESCAPE: pygame.quit(); sys.exit() # ESC — выход
pygame.SCALED сам растягивает картинку 600×400 на весь экран —
координаты в игре остаются те же, ничего пересчитывать не надо. F —
включить/выключить полный экран, ESC — выйти.