Змейка¶
Скачать шаблон: snake.py
import pygame
import random
import sys
# Размеры окна в пикселях
WINDOW_WIDTH = 640
WINDOW_HEIGHT = 480
CELL_SIZE = 20
# Размеры сетки в ячейках
WIDTH = int(WINDOW_WIDTH / CELL_SIZE)
HEIGHT = int(WINDOW_HEIGHT / CELL_SIZE)
# Цвета
BG_COLOR = (0, 0, 0)
GRID_COLOR = (40, 40, 40)
APPLE_COLOR = (255, 0, 0)
APPLE_OUTER_COLOR = (155, 0, 0)
SNAKE_COLOR = (0, 255, 0)
SNAKE_OUTER_COLOR = (0, 155, 0)
UP = 'up'
DOWN = 'down'
LEFT = 'left'
RIGHT = 'right'
HEAD = 0
FPS = 15
class Cell:
def __init__(self, x, y):
self.x = x
self.y = y
def main():
global FPS_CLOCK
global DISPLAY
pygame.init()
FPS_CLOCK = pygame.time.Clock()
DISPLAY = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption('Wormy')
while True:
# Мы всегда будем начинать игру с начала. После проигрыша сразу
# начинается следующая.
run_game()
def run_game():
# TODO(2.1): создать яблоко в позиции (20, 10)
# TODO(3.1): создать змейку. Пусть она состоит из трех ячеек
# в строке 10 и столбцах 3, 4, 5.
# Какой тип данных удобен для представления змейки?
# TODO(4.1): задать исходное направление движения змейки.
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
terminate()
# TODO(7.1): обработайте событие pygame.KEYDOWN
# и при необходимости измените направление движения змейки.
# TODO(5.1): если змейка достигла границы окна, завершить игру.
# Для проверки воспользуйтесь функцией snake_hit_edge.
# TODO(8.1): если змейка задела свой хвост, завершить игру.
# Для проверки восппользуйтесь функцией snake_hit_self.
# TODO(6.1): обработайте ситуацию столкновения змейки с яблоком.
# В этом случае нужно:
# * Увеличить размер змейки
# * Создать новое яблоко.
# TODO(4.2): сдвинуть змейку в заданном направлении
# TODO(2.2): передать яблоко в функцию отрисовки кадра
# TODO(3.2): передать змейку в функцию отрисовки кадра
draw_frame(None, None)
FPS_CLOCK.tick(FPS)
def draw_frame(snake, apple):
DISPLAY.fill(BG_COLOR)
draw_grid()
draw_snake(snake)
draw_apple(apple)
pygame.display.update()
def draw_grid():
# TODO(1.2): нарисовать сетку.
# Шаг CELL_SIZE
# Цвет GRID_COLOR
# https://www.pygame.org/docs/ref/draw.html#pygame.draw.line
...
def draw_apple(apple):
# TODO(2.3): нарисовать яблоко.
...
def draw_snake(snake):
# TODO(3.3): нарисовать змейку.
...
def draw_cell(cell, outer_color, inner_color):
# TODO(2.4): вспомогательная функция для рисования ячейки.
# Ячейка будет состоять из двух квадратов разных цветов:
# Больший квадрат закрашивается цветом outer_color,
# меньший - inner_color.
# Расстояние между внешним и внутренним квадратом
# принять за 4 пикселя.
...
def move_snake():
# TODO(4.3): реализовать перемещение змейки на одну ячейку
# в заданном направлении.
# * Какие параметры будет принимать функция?
# * Из каких действий будет состоять перемещение змейки?
...
def get_snake_new_head():
# TODO(4.4): реализовать функцию определения нового
# положения головы змейки.
# * Какие параметры будет принимать функция?
# * Что функция будет возвращать?
...
def snake_hit_edge():
# TODO(5.2): функция возвращает True,
# если змейка пересекла одну из границ окна.
...
def snake_hit_apple():
# TODO(6.2): функция возвращает True, если голова
# змейки находится в той же ячейке, что и яблоко.
...
def snake_grow():
# TODO(6.3): предложите максимально простой
# способ увеличения длины змейки.
...
def new_apple():
# TODO(6.4): функция возвращает случайную ячейку,
# в которой будет располагаться яблоко.
# Для генерации случайной координаты воспользуйтесь
# функцией random.randint(a, b)
...
def get_direction():
# TODO(7.3): функция возвращает направление движения
# в зависимости от нажатой клавиши:
# * pygame.K_LEFT
# * pygame.K_RIGHT
# * pygame.K_UP
# * pygame.K_DOWN
# Если нажата клавиша противоположного направления движения,
# то не менять направление.
...
def snake_hit_self():
# TODO(8.2): функция возвращает True, если голова змеи
# пересеклась хотя бы с одним блоком хвоста.
...
def terminate():
pygame.quit()
sys.exit()
if __name__ == '__main__':
main()