diff --git a/part2_OOP/lesson6/game.py b/part2_OOP/lesson6/game.py index f85b4c8..81e4777 100644 --- a/part2_OOP/lesson6/game.py +++ b/part2_OOP/lesson6/game.py @@ -1,4 +1,5 @@ import os +import time import pygame as pg pg.init() @@ -17,7 +18,11 @@ snake_head = { } 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')) + '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: @@ -25,52 +30,99 @@ class Snake: self.x = x self.y = y self.direction = 'right' - self.length = 0 - self.speed = 10 # скорость движения змейки чем меньше, тем быстрее + self.direction_prev = 'right' + self.length = 2 + self.speed = 30 # скорость движения змейки чем меньше, тем быстрее self.counter = 0 # Просто счетчик, для регулировки скорости нужен - self.body = [] + 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(0, 300) +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]: snake.direction = 'up' - if pressed[pg.K_DOWN]: snake.direction = 'down' - if pressed[pg.K_LEFT]: snake.direction = 'left' - if pressed[pg.K_RIGHT]: snake.direction = 'right' + 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) diff --git a/part2_OOP/lesson6/img/body_ld_ur.png b/part2_OOP/lesson6/img/body_ld_ur.png new file mode 100644 index 0000000..7ef46af Binary files /dev/null and b/part2_OOP/lesson6/img/body_ld_ur.png differ diff --git a/part2_OOP/lesson6/img/body_lu_dr.png b/part2_OOP/lesson6/img/body_lu_dr.png new file mode 100644 index 0000000..d896e9d Binary files /dev/null and b/part2_OOP/lesson6/img/body_lu_dr.png differ diff --git a/part2_OOP/lesson6/img/body_rd_ul.png b/part2_OOP/lesson6/img/body_rd_ul.png new file mode 100644 index 0000000..6758b31 Binary files /dev/null and b/part2_OOP/lesson6/img/body_rd_ul.png differ diff --git a/part2_OOP/lesson6/img/body_ru_dl.png b/part2_OOP/lesson6/img/body_ru_dl.png new file mode 100644 index 0000000..26eba8c Binary files /dev/null and b/part2_OOP/lesson6/img/body_ru_dl.png differ