import os import time import pygame as pg pg.init() pg.display.set_caption("First Game") screen = pg.display.set_mode((780, 600)) done = False FPS = 60 # Создаем переменную FPS clock = pg.time.Clock() # Создаем счетчик для FPS bg = pg.image.load(os.path.join(os.curdir, 'img', 'bg.png')) snake_head = { 'left': pg.image.load(os.path.join(os.curdir, 'img', 'snake_left.png')), 'right': pg.image.load(os.path.join(os.curdir, 'img', 'snake_right.png')), 'up': pg.image.load(os.path.join(os.curdir, 'img', 'snake_up.png')), 'down': pg.image.load(os.path.join(os.curdir, 'img', 'snake_down.png')), } snake_body = { 'h': pg.image.load(os.path.join(os.curdir, 'img', 'body_h.png')), 'v': pg.image.load(os.path.join(os.curdir, 'img', 'body_v.png')), 'ru_dl': pg.image.load(os.path.join(os.curdir, 'img', 'body_ru_dl.png')), 'rd_ul': pg.image.load(os.path.join(os.curdir, 'img', 'body_rd_ul.png')), 'lu_dr': pg.image.load(os.path.join(os.curdir, 'img', 'body_lu_dr.png')), 'ld_ur': pg.image.load(os.path.join(os.curdir, 'img', 'body_ld_ur.png')), } class Snake: def __init__(self, x, y) -> None: self.x = x self.y = y self.direction = 'right' self.direction_prev = 'right' self.length = 2 self.speed = 30 # скорость движения змейки чем меньше, тем быстрее self.counter = 0 # Просто счетчик, для регулировки скорости нужен self.body = [('h', 60, 300), ('h', 30, 300)] def draw(self, screen): if len(self.body) > self.length: self.body.pop() if self.counter >= self.speed: if self.direction == self.direction_prev: if self.direction in ('right', 'left'): self.body.insert(0, ('h', self.x, self.y)) else: self.body.insert(0, ('v', self.x, self.y)) elif (self.direction_prev, self.direction) in [('right', 'up'), ('down', 'left')]: self.body.insert(0, ('ru_dl', self.x, self.y)) elif (self.direction_prev, self.direction) in [('right', 'down'), ('up', 'left')]: self.body.insert(0, ('rd_ul', self.x, self.y)) elif (self.direction_prev, self.direction) in [('left', 'up'), ('down', 'right')]: self.body.insert(0, ('lu_dr', self.x, self.y)) elif (self.direction_prev, self.direction) in [('left', 'down'), ('up', 'right')]: self.body.insert(0, ('ld_ur', self.x, self.y)) match self.direction: case 'left': self.x -= 30 if self.x < 0: self.x = 750 self.direction_prev = 'left' case 'right': self.x += 30 if self.x > 750: self.x = 0 self.direction_prev = 'right' case 'up': self.y -= 30 if self.y < 0: self.y = 570 self.direction_prev = 'up' case 'down': self.y += 30 if self.y > 570: self.y = 0 self.direction_prev = 'down' if (self.x, self.y) in [(x[1], x[2]) for x in self.body]: gameover() self.counter = 0 self.counter += 1 screen.blit(snake_head[self.direction], (self.x, self.y)) for el in self.body: screen.blit(snake_body[el[0]], (el[1], el[2])) snake =Snake(90, 300) def update_game_window(): screen.blit(bg, (0,0)) snake.draw(screen) pg.display.update() def gameover(): go_font = pg.font.SysFont('monaco', 72) go_surf = go_font.render('Game over', True, (20, 20, 20)) go_rect = go_surf.get_rect() go_rect.midtop = (360, 15) screen.blit(go_surf, go_rect) pg.display.flip() time.sleep(5) pg.quit() while not done: for event in pg.event.get(): if event.type == pg.QUIT: done = True pressed = pg.key.get_pressed() if pressed[pg.K_UP]: if snake.direction != 'down': snake.direction = 'up' if pressed[pg.K_DOWN]: if snake.direction != 'up': snake.direction = 'down' if pressed[pg.K_LEFT]: if snake.direction != 'right': snake.direction = 'left' if pressed[pg.K_RIGHT]: if snake.direction != 'left': snake.direction = 'right' update_game_window() clock.tick(FPS)