From 2c73ce760a2943c74665e3525ba6acdb996cfc17 Mon Sep 17 00:00:00 2001 From: Verper1 Date: Mon, 16 Mar 2026 00:33:30 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB?= =?UTF-8?q?=20.gitignore.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +-- tic-tac-toe.py => game_tic_tac_toe/tic-tac-toe.py | 0 2 files changed, 1 insertion(+), 2 deletions(-) rename tic-tac-toe.py => game_tic_tac_toe/tic-tac-toe.py (100%) diff --git a/.gitignore b/.gitignore index 013eae1..e8fece7 100644 --- a/.gitignore +++ b/.gitignore @@ -25,7 +25,6 @@ share/python-wheels/ .installed.cfg *.egg MANIFEST -.idea # PyInstaller # Usually these files are written by a python script from a template @@ -174,7 +173,7 @@ cython_debug/ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ +.idea/ # Abstra # Abstra is an AI-powered process automation framework. diff --git a/tic-tac-toe.py b/game_tic_tac_toe/tic-tac-toe.py similarity index 100% rename from tic-tac-toe.py rename to game_tic_tac_toe/tic-tac-toe.py From 9442f04183985fb58f22b89d20c21150e30cd6bb Mon Sep 17 00:00:00 2001 From: Verper1 Date: Mon, 16 Mar 2026 00:34:43 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=94=D0=97=20=D0=BF=D0=BE=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8E=20=D0=B8=D0=B3=D1=80=D1=8B=20=D0=BD=D0=B0=20?= =?UTF-8?q?pygame.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game_on_pygame/__init__.py | 1 + game_on_pygame/config.py | 23 ++++++++ game_on_pygame/main.py | 107 +++++++++++++++++++++++++++++++++++++ game_on_pygame/utils.py | 37 +++++++++++++ pyproject.toml | 4 +- uv.lock | 19 +++++++ 6 files changed, 190 insertions(+), 1 deletion(-) create mode 100644 game_on_pygame/__init__.py create mode 100644 game_on_pygame/config.py create mode 100644 game_on_pygame/main.py create mode 100644 game_on_pygame/utils.py diff --git a/game_on_pygame/__init__.py b/game_on_pygame/__init__.py new file mode 100644 index 0000000..eaeee8c --- /dev/null +++ b/game_on_pygame/__init__.py @@ -0,0 +1 @@ +"""mypy ругался на error: Source file found twice under different module names: "config" and "game_on_pygame.config.""" \ No newline at end of file diff --git a/game_on_pygame/config.py b/game_on_pygame/config.py new file mode 100644 index 0000000..960441a --- /dev/null +++ b/game_on_pygame/config.py @@ -0,0 +1,23 @@ +"""Тут можно настроить характеристики для игрока, обычных врагов и триггер-противника.""" +import pygame + +# --- Игрок --- +player_size = 32 +player = pygame.Rect(50, 50, player_size, player_size) +player_speed = 4 +lives = 3 +start_pos = player.topleft +is_key_obtained = False + + +# --- Враги --- +enemy_size = 50 +enemies = [ + pygame.Rect(150, 150, enemy_size, enemy_size), + pygame.Rect(450, 350, 70, 70) +] +enemy_speed = 1 + +# ---Триггер противник --- +trigger_enemy = pygame.Rect(25, 535, 32, 32) +trigger_enemy_flag = False \ No newline at end of file diff --git a/game_on_pygame/main.py b/game_on_pygame/main.py new file mode 100644 index 0000000..da2e89c --- /dev/null +++ b/game_on_pygame/main.py @@ -0,0 +1,107 @@ +"""Входной файл для запуска игры.""" +import pygame + +from game_on_pygame.config import player, player_speed, enemies, enemy_speed, \ + start_pos, lives, is_key_obtained, trigger_enemy, trigger_enemy_flag +from game_on_pygame.utils import exit_rect, walls, key_rect, BLUE, GOLDEN, \ + GREEN, WHITE, RED, locked_door, trigger_door + +# --- Инициализация --- +pygame.init() +WIDTH, HEIGHT = 600, 600 +screen = pygame.display.set_mode((WIDTH, HEIGHT)) +pygame.display.set_caption("Выберись из лабиринта") +clock = pygame.time.Clock() + +if __name__ == "__main__": + # --- Основной цикл --- + running = True + while running: + clock.tick(60) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + running = False + if player.colliderect(exit_rect): + print("Ты выиграл!") + running = False + + # --- Движение игрока --- + old_player_pos = player.topleft + keys = pygame.key.get_pressed() + if keys[pygame.K_a]: + player.x -= player_speed + if keys[pygame.K_d]: + player.x += player_speed + if keys[pygame.K_w]: + player.y -= player_speed + if keys[pygame.K_s]: + player.y += player_speed + + # --- Проверка столкновений со стенами игроком --- + for wall in walls: + if player.colliderect(wall) or (locked_door and player.colliderect(locked_door)): + player.topleft = old_player_pos + if player.colliderect(key_rect): + is_key_obtained = True + locked_door = None + if trigger_door and player.colliderect(trigger_door): + trigger_door = None + trigger_enemy_flag = True + + # --- Движение врагов направлено к игроку --- + for enemy in enemies: + old_enemy_pos = enemy.topleft + + if player.x > enemy.x: + enemy.x += enemy_speed + elif player.x < enemy.x: + enemy.x -= enemy_speed + + if player.y > enemy.y: + enemy.y += enemy_speed + elif player.y < enemy.y: + enemy.y -= enemy_speed + + # --- Проверка столкновений со стенами --- + for wall in walls: + if enemy.colliderect(wall): + enemy.topleft = old_enemy_pos + + # --- Проверка столкновения с врагами --- + for enemy in enemies: + if player.colliderect(enemy): + lives -= 1 + if lives <= 0: + running = False + print("Ты проиграл! Жизней больше не осталось.") + player.topleft = start_pos + + # --- Отрисовка --- + screen.fill("grey") + for wall in walls: + pygame.draw.rect(screen, BLUE, wall) + if locked_door: + pygame.draw.rect(screen, GOLDEN, locked_door) + pygame.draw.rect(screen, GREEN, exit_rect) + pygame.draw.rect(screen, WHITE, player) + if not is_key_obtained: + pygame.draw.rect(screen, GOLDEN, key_rect) + for enemy in enemies: + pygame.draw.rect(screen, RED, enemy) + if trigger_enemy_flag: + pygame.draw.rect(screen, RED, trigger_enemy) + trigger_enemy.x += 4.5 + if player.colliderect(trigger_enemy): + running = False + print("Тебя догнали! Не отпускай кнопку перемещения и действуй быстро.") + + # --- Шрифт для жизней --- + font = pygame.font.Font(None, 36) + + # --- Отображение жизней --- + lives_text = font.render(f"Lives: {lives}", True, WHITE) + screen.blit(lives_text, (10, 10)) + + pygame.display.flip() + + pygame.quit() \ No newline at end of file diff --git a/game_on_pygame/utils.py b/game_on_pygame/utils.py new file mode 100644 index 0000000..ee4e53a --- /dev/null +++ b/game_on_pygame/utils.py @@ -0,0 +1,37 @@ +"""Здесь лежат всякие переменные и окружение.""" +import pygame + +# --- Цвета --- +WHITE = (255, 255, 255) +RED = (255, 0, 0) +GREEN = (0, 255, 0) +BLUE = (0, 0, 255) +GOLDEN = (225, 215, 0) + +# --- Лабиринт (стены) --- +walls = [ + pygame.Rect(0, 0, 600, 10), # верх + pygame.Rect(0, 0, 10, 600), # левая + pygame.Rect(0, 590, 600, 10), # низ + pygame.Rect(590, 0, 10, 600), # правая + + pygame.Rect(10, 90, 200, 10), + pygame.Rect(200, 90, 10, 200), + pygame.Rect(300, 10, 10, 200), + pygame.Rect(200, 290, 200, 10), + pygame.Rect(400, 290, 10, 100), + pygame.Rect(100, 380, 300, 10), + pygame.Rect(100, 500, 500, 10) +] + +# --- Закрытая дверь --- +locked_door = pygame.Rect(10, 500, 100, 10) + +# --- Выход --- +exit_rect = pygame.Rect(550, 550, 40, 40) + +# --- Ключ для двери --- +key_rect = pygame.Rect(50, 150, 40, 40) + +# --- Триггер-стена --- +trigger_door = pygame.Rect(189, 510, 10, 80) diff --git a/pyproject.toml b/pyproject.toml index 205f1ef..9a6e683 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,9 @@ version = "0.1.0" description = "Add your description here" readme = "README.md" requires-python = ">=3.13" -dependencies = [] +dependencies = [ + "pygame>=2.6.1", +] [dependency-groups] dev = [ diff --git a/uv.lock b/uv.lock index 062675c..3c8d061 100644 --- a/uv.lock +++ b/uv.lock @@ -75,6 +75,9 @@ wheels = [ name = "lpa12-practice" version = "0.1.0" source = { virtual = "." } +dependencies = [ + { name = "pygame" }, +] [package.dev-dependencies] dev = [ @@ -84,6 +87,7 @@ dev = [ ] [package.metadata] +requires-dist = [{ name = "pygame", specifier = ">=2.6.1" }] [package.metadata.requires-dev] dev = [ @@ -137,6 +141,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, ] +[[package]] +name = "pygame" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/49/cc/08bba60f00541f62aaa252ce0cfbd60aebd04616c0b9574f755b583e45ae/pygame-2.6.1.tar.gz", hash = "sha256:56fb02ead529cee00d415c3e007f75e0780c655909aaa8e8bf616ee09c9feb1f", size = 14808125, upload-time = "2024-09-29T13:41:34.698Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/91/718acf3e2a9d08a6ddcc96bd02a6f63c99ee7ba14afeaff2a51c987df0b9/pygame-2.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae6039f3a55d800db80e8010f387557b528d34d534435e0871326804df2a62f2", size = 13090765, upload-time = "2024-09-29T14:27:02.377Z" }, + { url = "https://files.pythonhosted.org/packages/0e/c6/9cb315de851a7682d9c7568a41ea042ee98d668cb8deadc1dafcab6116f0/pygame-2.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2a3a1288e2e9b1e5834e425bedd5ba01a3cd4902b5c2bff8ed4a740ccfe98171", size = 12381704, upload-time = "2024-09-29T14:27:10.228Z" }, + { url = "https://files.pythonhosted.org/packages/9f/8f/617a1196e31ae3b46be6949fbaa95b8c93ce15e0544266198c2266cc1b4d/pygame-2.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27eb17e3dc9640e4b4683074f1890e2e879827447770470c2aba9f125f74510b", size = 13581091, upload-time = "2024-09-29T11:30:27.653Z" }, + { url = "https://files.pythonhosted.org/packages/3b/87/2851a564e40a2dad353f1c6e143465d445dab18a95281f9ea458b94f3608/pygame-2.6.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c1623180e70a03c4a734deb9bac50fc9c82942ae84a3a220779062128e75f3b", size = 14273844, upload-time = "2024-09-29T11:40:04.138Z" }, + { url = "https://files.pythonhosted.org/packages/85/b5/aa23aa2e70bcba42c989c02e7228273c30f3b44b9b264abb93eaeff43ad7/pygame-2.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef07c0103d79492c21fced9ad68c11c32efa6801ca1920ebfd0f15fb46c78b1c", size = 13951197, upload-time = "2024-09-29T11:40:06.785Z" }, + { url = "https://files.pythonhosted.org/packages/a6/06/29e939b34d3f1354738c7d201c51c250ad7abefefaf6f8332d962ff67c4b/pygame-2.6.1-cp313-cp313-win32.whl", hash = "sha256:3acd8c009317190c2bfd81db681ecef47d5eb108c2151d09596d9c7ea9df5c0e", size = 10249309, upload-time = "2024-09-29T11:10:23.329Z" }, + { url = "https://files.pythonhosted.org/packages/7e/11/17f7f319ca91824b86557e9303e3b7a71991ef17fd45286bf47d7f0a38e6/pygame-2.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:813af4fba5d0b2cb8e58f5d95f7910295c34067dcc290d34f1be59c48bd1ea6a", size = 10620084, upload-time = "2024-09-29T11:48:51.587Z" }, +] + [[package]] name = "ruff" version = "0.15.4"