diff --git a/part2_OOP/lesson6/poetry.lock b/part2_OOP/lesson6/poetry.lock index 4ec87e9..6672b07 100644 --- a/part2_OOP/lesson6/poetry.lock +++ b/part2_OOP/lesson6/poetry.lock @@ -66,7 +66,48 @@ files = [ {file = "pygame-2.5.2.tar.gz", hash = "sha256:c1b89eb5d539e7ac5cf75513125fb5f2f0a2d918b1fd6e981f23bf0ac1b1c24a"}, ] +[[package]] +name = "pygame-menu" +version = "4.4.3" +description = "A menu for pygame. Simple, and easy to use" +optional = false +python-versions = ">=3.6, <4" +files = [ + {file = "pygame-menu-4.4.3.tar.gz", hash = "sha256:02a99e557601f356ce2cc82a10e98bcb581d539a41c666c4ee614fae366c3647"}, + {file = "pygame_menu-4.4.3-py3-none-any.whl", hash = "sha256:d81f50acc854701c6b8d08b36a0b4f3a69f9ee63d3ae7591d063239812e75a0e"}, +] + +[package.dependencies] +pygame = ">=1.9.3" +pyperclip = "*" +typing-extensions = "*" + +[package.extras] +docs = ["sphinx", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["nose2[coverage-plugin]"] + +[[package]] +name = "pyperclip" +version = "1.8.2" +description = "A cross-platform clipboard module for Python. (Only handles plain text for now.)" +optional = false +python-versions = "*" +files = [ + {file = "pyperclip-1.8.2.tar.gz", hash = "sha256:105254a8b04934f0bc84e9c24eb360a591aaf6535c9def5f29d92af107a9bf57"}, +] + +[[package]] +name = "typing-extensions" +version = "4.9.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, + {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, +] + [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "d455cccde21b87371775f4fd09e19655f080c2160a8fc3c68e2593db9f61738f" +content-hash = "daa7d8a25daf865c7fecc14f541825fed526983d327dcd142eb997cb5caa05ee" diff --git a/part2_OOP/lesson6/pyproject.toml b/part2_OOP/lesson6/pyproject.toml index b6e92d7..4dc66cf 100644 --- a/part2_OOP/lesson6/pyproject.toml +++ b/part2_OOP/lesson6/pyproject.toml @@ -9,6 +9,7 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.10" pygame = "^2.5.2" +pygame-menu = "^4.4.3" [build-system] diff --git a/part2_OOP/lesson6/snake/food.py b/part2_OOP/lesson6/snake/food.py index 1ae21f3..4199b72 100644 --- a/part2_OOP/lesson6/snake/food.py +++ b/part2_OOP/lesson6/snake/food.py @@ -11,8 +11,8 @@ class Food: ) def __init__(self) -> None: - self.x = random.randint(0, 26) * 30 - self.y = random.randint(0, 20) * 30 + self.x = random.randint(0, 25) * 30 + self.y = random.randint(0, 19) * 30 self.type = random.choice(self.FOOD) diff --git a/part2_OOP/lesson6/snake/game.py b/part2_OOP/lesson6/snake/game.py index 9bdcc45..1037af7 100644 --- a/part2_OOP/lesson6/snake/game.py +++ b/part2_OOP/lesson6/snake/game.py @@ -3,6 +3,7 @@ import time from random import choice import pygame as pg +import pygame_menu as pgm from .snake import Snake from .food import Food @@ -13,39 +14,72 @@ class Game: self.screen_hight = 600 self.clock = pg.time.Clock() pg.font.init() - self.font = pg.font.SysFont(choice(pg.font.get_fonts()), 72) + self.font = pg.font.SysFont('arial', 72) self.score = 0 - + self.paused = True self.title = 'Snakessss' - self.done = False + self.done = False # Флаг главного цикла + self.need_reset = False self.bg = pg.image.load(os.path.join(os.curdir, 'snake', 'img', 'bg.png')) self.screen = pg.display.set_mode((self.screen_widht, self.screen_hight)) self.fps = 60 - + self.set_title() + self.menu = None + def game_init(self): pg.init() + + def get_menu(self): + self.set_bg() + self.menu = pgm.Menu('Snakessss game', 400, 300, theme=pgm.pygame_menu.themes.THEME_DARK) + self.menu.add.button('Start new game', self.start_new_game) + self.menu.add.button('Restore game', self.restore_game) + self.menu.add.button('Exit', pgm.pygame_menu.events.EXIT) + self.menu.mainloop(self.screen) + def disable_menu(self): + self.menu.disable() + def set_title(self): pg.display.set_caption(self.title) def set_bg(self): self.screen.blit(self.bg, (0, 0)) + def start_new_game(self): + self.paused = False + self.disable_menu() + self.need_reset = True + + def restore_game(self): + self.disable_menu() + self.paused = False + + def save_game(self): + pass + + def load_game(self): + pass + def gameover(self): - self.done = True surf = self.font.render('Game over', True, (20, 20, 20)) rect = surf.get_rect() rect.midtop = (390, 250) self.screen.blit(surf, rect) pg.display.flip() - time.sleep(5) - pg.quit() + time.sleep(3) + + self.get_menu() def mainloop(): game = Game() - snake =Snake(90, 300) + game.game_init() + game.set_title() + game.get_menu() + snake =Snake() foods_array = [] + def update_game_window(): while len(foods_array) < 2: food = Food() @@ -68,10 +102,20 @@ def mainloop(): game.gameover() while not game.done: + if game.need_reset: + snake.reset() + game.start_new_game() + game.need_reset = False + for event in pg.event.get(): if event.type == pg.QUIT: game.done = True pressed = pg.key.get_pressed() + if pressed[pg.K_ESCAPE]: + game.paused = False if game.paused else True + if game.paused: + game.get_menu() + if pressed[pg.K_UP]: if snake.direction != 'down': snake.direction = 'up' @@ -83,7 +127,8 @@ def mainloop(): snake.direction = 'left' if pressed[pg.K_RIGHT]: if snake.direction != 'left': - snake.direction = 'right' - + snake.direction = 'right' + update_game_window() + game.clock.tick(game.fps) diff --git a/part2_OOP/lesson6/snake/snake.py b/part2_OOP/lesson6/snake/snake.py index 8e20498..ce2fdae 100644 --- a/part2_OOP/lesson6/snake/snake.py +++ b/part2_OOP/lesson6/snake/snake.py @@ -4,9 +4,9 @@ import pygame as pg class Snake: - def __init__(self, x, y) -> None: - self.x = x - self.y = y + def __init__(self, **kwargs) -> None: + self.x = kwargs.get('x', 90) + self.y = kwargs.get('y', 300) self.snake_head = { 'left': pg.image.load(os.path.join(os.curdir, 'snake', 'img', 'snake_left.png')), 'right': pg.image.load(os.path.join(os.curdir, 'snake', 'img', 'snake_right.png')), @@ -24,11 +24,21 @@ class Snake: self.direction = 'right' self.direction_prev = 'right' - self.length = 2 - self.speed = 10 # скорость движения змейки чем меньше, тем быстрее + self.length = 10 + self.speed = 40 # скорость движения змейки чем меньше, тем быстрее self.counter = 0 # Просто счетчик, для регулировки скорости нужен - self.body = [('h', 60, 300), ('h', 30, 300)] + self.body = kwargs.get('body', [('h', 60, 300), ('h', 30, 300)]) self.impacted = False + + def reset(self): + self.x = 90 + self.y = 300 + self.body = [('h', 60, 300), ('h', 30, 300)] + self.direction = 'right' + self.direction_prev = 'right' + self.impacted = False + self.length = 2 + self.speed = 40 def get_head_coords(self): return self.x, self.y