From fbf955f1bcd2d817e4aef98d3695809390cbbe6a Mon Sep 17 00:00:00 2001 From: Terekhov Date: Thu, 6 Mar 2025 23:14:37 +0300 Subject: [PATCH 01/12] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=B8=D0=BC=D1=8F=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=A4=D0=98=D0=9E=20=D0=B2=20=D1=84=D0=BE=D1=80=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 406cfb5..3946739 100644 --- a/README.md +++ b/README.md @@ -32,4 +32,4 @@ Скобелев Максим Владимирович - stud159357@vyatsu.ru -Терехов Павел Сергеевич -stud178861@vyatsu.ru \ No newline at end of file +ТЕРЕХОВ ПАВЕЛ СЕРГЕЕВИЧ -stud178861@vyatsu.ru \ No newline at end of file From ac35c098af7f6c034bf00e1a7cf440609f43bccd Mon Sep 17 00:00:00 2001 From: Genagie Date: Thu, 6 Mar 2025 23:27:44 +0300 Subject: [PATCH 02/12] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20gitignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + README.md | 36 +----------------------------------- 2 files changed, 2 insertions(+), 35 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..21d0b89 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.venv/ diff --git a/README.md b/README.md index 3946739..8c2fb2d 100644 --- a/README.md +++ b/README.md @@ -1,35 +1 @@ -Билькевич Дмитрий Михайлович - stud178867@vyatsu.ru - -Буланов Владислав Денисович - stud178869@vyatsu.ru - -Бушуев Григорий Владимирович - stud178870@vyatsu.ru - -Виноградова Вера Владимировна - stud178857@vyatsu.ru - -Катков Максим Игоревич - stud178694@vyatsu.ru - -Кобыльников Александр Эдуардович - stud178872@vyatsu.ru - -Лусников Егор Сергеевич - stud178862@vyatsu.ru - -Лямин Никита Викторович - stud178858@vyatsu.ru - -Матвеев Дмитрий Сергеевич - stud178860@vyatsu.ru - -Никитин Алексей Павлович - stud178863@vyatsu.ru - -Пастухов Алексей Игоревич - stud178873@vyatsu.ru - -Петухов Егор Алексеевич - stud178856@vyatsu.ru - -Писцов Александр Григорьевич - stud178879@vyatsu.ru - -Плужников Артём Александрович - stud181545@vyatsu.ru - -Русских Данил Дмитриевич - stud180728@vyatsu.ru - -Савиных Станислав Максимович - stud209105@vyatsu.ru - -Скобелев Максим Владимирович - stud159357@vyatsu.ru - -ТЕРЕХОВ ПАВЕЛ СЕРГЕЕВИЧ -stud178861@vyatsu.ru \ No newline at end of file +Создание игры-головоломки, схожей с классической змейкой \ No newline at end of file From 7011efc4e6ee76146e30a62b649c054213d1c1b6 Mon Sep 17 00:00:00 2001 From: Genagie Date: Thu, 6 Mar 2025 23:52:51 +0300 Subject: [PATCH 03/12] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=203=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=BE=20=D0=B2=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B5=20data.txt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data.txt | 3 +++ main.py | 9 +++++++++ requirements.txt | 6 ++++++ 3 files changed, 18 insertions(+) create mode 100644 data.txt create mode 100644 requirements.txt diff --git a/data.txt b/data.txt new file mode 100644 index 0000000..0fbbcba --- /dev/null +++ b/data.txt @@ -0,0 +1,3 @@ +Hello, World! +This is a test file. +12345 \ No newline at end of file diff --git a/main.py b/main.py index e69de29..7d0fcf7 100644 --- a/main.py +++ b/main.py @@ -0,0 +1,9 @@ +with open('data.txt', 'r') as file: + lines = file.readlines() + +transformed_lines = [line.upper() for line in lines] + +with open('output.txt', 'w') as output_file: + output_file.writelines(transformed_lines) + +print("Данные успешно преобразованы и записаны в файл output.txt") \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..de6c89b --- /dev/null +++ b/requirements.txt @@ -0,0 +1,6 @@ +numpy==2.2.3 +pandas==2.2.3 +python-dateutil==2.9.0.post0 +pytz==2025.1 +six==1.17.0 +tzdata==2025.1 From 93acd8784456d2f59486ce19407fd4473b0d759f Mon Sep 17 00:00:00 2001 From: Genagie Date: Sat, 15 Mar 2025 13:19:59 +0300 Subject: [PATCH 04/12] fix: README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 8c2fb2d..b586e2c 100644 --- a/README.md +++ b/README.md @@ -1 +1,3 @@ +Терехов Павел Сергеевич +Глеб Создание игры-головоломки, схожей с классической змейкой \ No newline at end of file From fc73bf8c80e274e93e1fe005579e3fb501bd52ca Mon Sep 17 00:00:00 2001 From: 3xploit1 Date: Sat, 15 Mar 2025 13:22:50 +0300 Subject: [PATCH 05/12] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=B8=D0=BC=D1=8F=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=A4=D0=98=D0=9E=20=D0=B2=20=D1=84=D0=BE=D1=80=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b586e2c..4e875d3 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ Терехов Павел Сергеевич -Глеб +Новицкий Глеб Павлович Создание игры-головоломки, схожей с классической змейкой \ No newline at end of file From 840a6fa783b570b31dfc622d6c0f5d88e39fc44e Mon Sep 17 00:00:00 2001 From: Genagie Date: Mon, 17 Mar 2025 22:39:27 +0300 Subject: [PATCH 06/12] fix --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 4e875d3..9ff415e 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ Терехов Павел Сергеевич + Новицкий Глеб Павлович + Создание игры-головоломки, схожей с классической змейкой \ No newline at end of file From bbc92b1ca9585a991e9c0a42d5807ff7399f2777 Mon Sep 17 00:00:00 2001 From: PABLO Date: Tue, 6 May 2025 12:46:32 +0300 Subject: [PATCH 07/12] add: movement --- DATA/Levels/Default/data.json | 1 + DATA/Levels/level_1/data.json | 108 +++++++++ .../Enemies/Tier 0/healthy_food.aseprite | Bin 0 -> 383 bytes DATA/Sprites/Enemies/Tier 0/healthy_food.png | Bin 0 -> 173 bytes .../Enemies/Tier 1/little-spider.aseprite | Bin 0 -> 532 bytes DATA/Sprites/Enemies/Tier 1/little-spider.png | Bin 0 -> 400 bytes DATA/Sprites/Floor/floor_grey.aseprite | Bin 0 -> 303 bytes DATA/Sprites/Floor/floor_grey.png | Bin 0 -> 142 bytes DATA/Sprites/Floor/move_ghost.aseprite | Bin 0 -> 369 bytes DATA/Sprites/Floor/move_ghost.png | Bin 0 -> 136 bytes DATA/Sprites/Floor/simple_border.aseprite | Bin 0 -> 467 bytes DATA/Sprites/Floor/simple_border.png | Bin 0 -> 213 bytes DATA/Sprites/Snake/body-rotate.aseprite | Bin 0 -> 491 bytes DATA/Sprites/Snake/body-rotate.png | Bin 0 -> 368 bytes DATA/Sprites/Snake/body.aseprite | Bin 0 -> 468 bytes DATA/Sprites/Snake/body.png | Bin 0 -> 371 bytes DATA/Sprites/Snake/head.aseprite | Bin 0 -> 486 bytes DATA/Sprites/Snake/head.png | Bin 0 -> 329 bytes DATA/Sprites/Snake/tail.aseprite | Bin 0 -> 431 bytes DATA/Sprites/Snake/tail.png | Bin 0 -> 315 bytes __pycache__/fill_level.cpython-313.pyc | Bin 0 -> 2837 bytes fill_level.py | 108 +++++++++ main.py | 208 ++++++++++++++++++ 23 files changed, 425 insertions(+) create mode 100644 DATA/Levels/Default/data.json create mode 100644 DATA/Levels/level_1/data.json create mode 100644 DATA/Sprites/Enemies/Tier 0/healthy_food.aseprite create mode 100644 DATA/Sprites/Enemies/Tier 0/healthy_food.png create mode 100644 DATA/Sprites/Enemies/Tier 1/little-spider.aseprite create mode 100644 DATA/Sprites/Enemies/Tier 1/little-spider.png create mode 100644 DATA/Sprites/Floor/floor_grey.aseprite create mode 100644 DATA/Sprites/Floor/floor_grey.png create mode 100644 DATA/Sprites/Floor/move_ghost.aseprite create mode 100644 DATA/Sprites/Floor/move_ghost.png create mode 100644 DATA/Sprites/Floor/simple_border.aseprite create mode 100644 DATA/Sprites/Floor/simple_border.png create mode 100644 DATA/Sprites/Snake/body-rotate.aseprite create mode 100644 DATA/Sprites/Snake/body-rotate.png create mode 100644 DATA/Sprites/Snake/body.aseprite create mode 100644 DATA/Sprites/Snake/body.png create mode 100644 DATA/Sprites/Snake/head.aseprite create mode 100644 DATA/Sprites/Snake/head.png create mode 100644 DATA/Sprites/Snake/tail.aseprite create mode 100644 DATA/Sprites/Snake/tail.png create mode 100644 __pycache__/fill_level.cpython-313.pyc create mode 100644 fill_level.py diff --git a/DATA/Levels/Default/data.json b/DATA/Levels/Default/data.json new file mode 100644 index 0000000..2fce87e --- /dev/null +++ b/DATA/Levels/Default/data.json @@ -0,0 +1 @@ +{"name": "Default", "start_point": {"x": 4, "y": 8}, "enemy_types": [[{"type": "little_spider", "sprite": "DATA/Sprites/Enemies/Tier 1/little-spider.png"}], [{"type": "wolf", "sprite": "DATA/Sprites/Enemies/Tier 2/wolf.png"}]], "enemy_spawns": [{"x": 1, "y": 2}, {"x": 3, "y": 12}, {"x": 1, "y": 6}, {"x": 10, "y": 10}], "size": [13, 10], "floor": [{"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 0}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 0}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 0}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 0}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 0}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 13, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 4, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 13, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 1, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 2, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 3, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 4, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 13, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 1, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 2, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 3, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 4, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 13, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 1, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 2, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 3, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 4, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 13, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 0, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 1, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 2, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 3, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 4, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 0, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 1, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 2, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 3, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 4, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 1, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 2, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 3, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 4, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 3, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 4, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 10}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 10}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 10}]} \ No newline at end of file diff --git a/DATA/Levels/level_1/data.json b/DATA/Levels/level_1/data.json new file mode 100644 index 0000000..f1c7b75 --- /dev/null +++ b/DATA/Levels/level_1/data.json @@ -0,0 +1,108 @@ +{ + "name": "default", + "starting_position": { + "x": 6, + "y": 1 + }, + "enemies": [ + { + "type": "spider", + "sprite": "DATA/Sprites/Enemies/Tier 1/little-spider.png", + "x": 1, + "y": 6 + }, + { + "type": "spider", + "sprite": "DATA/Sprites/Enemies/Tier 1/little-spider.png", + "x": 1, + "y": 2 + }, + { + "type": "spider", + "sprite": "DATA/Sprites/Enemies/Tier 1/little-spider.png", + "x": 12, + "y": 3 + }, + { + "type": "spider", + "sprite": "DATA/Sprites/Enemies/Tier 1/little-spider.png", + "x": 10, + "y": 8 + } + ], + "floor": [ + { + "sprite": "DATA/Sprites/Floor/floor_grey.png", + "y": 0, + "x_start": 6, + "x_end": 8 + }, + { + "sprite": "DATA/Sprites/Floor/floor_grey.png", + "y": 1, + "x_start": 3, + "x_end": 11 + }, + { + "sprite": "DATA/Sprites/Floor/floor_grey.png", + "y": 1, + "x_start": 3, + "x_end": 11 + }, + { + "sprite": "DATA/Sprites/Floor/floor_grey.png", + "y": 2, + "x_start": 1, + "x_end": 12 + }, + { + "sprite": "DATA/Sprites/Floor/floor_grey.png", + "y": 3, + "x_start": 0, + "x_end": 12 + }, + { + "sprite": "DATA/Sprites/Floor/floor_grey.png", + "y": 4, + "x_start": 0, + "x_end": 12 + }, + { + "sprite": "DATA/Sprites/Floor/floor_grey.png", + "y": 5, + "x_start": 1, + "x_end": 13 + }, + { + "sprite": "DATA/Sprites/Floor/floor_grey.png", + "y": 6, + "x_start": 1, + "x_end": 13 + }, + { + "sprite": "DATA/Sprites/Floor/floor_grey.png", + "y": 7, + "x_start": 1, + "x_end": 13 + }, + { + "sprite": "DATA/Sprites/Floor/floor_grey.png", + "y": 8, + "x_start": 4, + "x_end": 11 + }, + { + "sprite": "DATA/Sprites/Floor/floor_grey.png", + "y": 9, + "x_start": 5, + "x_end": 8 + }, + { + "sprite": "DATA/Sprites/Floor/floor_grey.png", + "y": 10, + "x_start": 5, + "x_end": 6 + } + ] + +} \ No newline at end of file diff --git a/DATA/Sprites/Enemies/Tier 0/healthy_food.aseprite b/DATA/Sprites/Enemies/Tier 0/healthy_food.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..42d44fa201fa4783eb45be73eeb931764675182c GIT binary patch literal 383 zcmbr}e zfjr121!f=#10WZ&Gx#J{rWPp}1^_v%3JeTf44e%AnP5t|8F(2g<|HQ^;M?>~@(+8W w%q5Li94i?cP2Jr7C(e*CeK8}V^u?>rQ12eAsN|@hy;nY{n%!eyX4q#706&FNI{*Lx literal 0 HcmV?d00001 diff --git a/DATA/Sprites/Enemies/Tier 0/healthy_food.png b/DATA/Sprites/Enemies/Tier 0/healthy_food.png new file mode 100644 index 0000000000000000000000000000000000000000..e0c2b3a5cc235e9e57cb90afedb4182f362e01bc GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}>7Fi*ArY;~ z2@TSCi&<5t@ID|2XvNS;c+W6U1w<26fIZuPUhyb32OvzCY3n!IeT1c zIA2sGd(fpTDT-lHtas1*#D*yW5+4L43fOzp4lNAjdr-uos`^j^Vk{HG_RY$oSGQhS Q2(*&H)78&qol`;+0E(eJ!2kdN literal 0 HcmV?d00001 diff --git a/DATA/Sprites/Enemies/Tier 1/little-spider.aseprite b/DATA/Sprites/Enemies/Tier 1/little-spider.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..c58316a7e9e42f921d6db1ecaacbeb7d529fd3fb GIT binary patch literal 532 zcmWe(Vqkc%l#xLJ3>g_17*c>30TdY+L4phdKu8NP1!(%Ok1SwYS%4OZ0WrG**h(bp za)E3X2B4@SkfEet;;LbjW@*?TW_`a@#`U3+F$R%BREnN!yqBcq$)$=9oQ^-uTe z$~OpKpehftOo186`u{*SJA+SRWonUv;Ugf2Re^zlnSqtzKQQzlK#D<}p<>S7seyb) z6gXULTj$3e_zqXWP zgVg6JiGup>jVfz{BVI*5nUn7(pD%H3&K>JxOQ*Q87J2@YonP(tF7*5pg~)8d=Njqv z`d<|qyn9jZ6nU#^n)p@jtrkz}%A9`wkb7{iB7Sn5LutnO6Sp(`r6cCm{Z9NKXRyiU z3U;+PUxTDL!DI$Y)@FPDQuebfA%Ch3rqcD0IS8G A+yDRo literal 0 HcmV?d00001 diff --git a/DATA/Sprites/Enemies/Tier 1/little-spider.png b/DATA/Sprites/Enemies/Tier 1/little-spider.png new file mode 100644 index 0000000000000000000000000000000000000000..cfa5a300417163f798f23900c056cadf03f127d3 GIT binary patch literal 400 zcmV;B0dM|^P)Px$N=ZaPR9J=WRxysmAPk(GuArezN4)rT5AA^La3f| zVwwUZ^#`&jgz&974`~*wH({wOutznFjwjz~--2`z70000r}e Zfjr121&~W%;6IST&ft?+nOdY^2mlD@H%|Zn literal 0 HcmV?d00001 diff --git a/DATA/Sprites/Floor/floor_grey.png b/DATA/Sprites/Floor/floor_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..f3131c0977a4f2c979316f3534c4336da4121d0b GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}9-c0aArY-_ zuWuA&5D;Oxm^?+nnCr`JGb398kCK9udCcE0c`H9U5ixN|*zVMtw<~iZ|1klzA%m_j bajRBy^EPpq?9i}j1<822`njxgN@xNAbkHcU literal 0 HcmV?d00001 diff --git a/DATA/Sprites/Floor/move_ghost.aseprite b/DATA/Sprites/Floor/move_ghost.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..b59773c748854c263612c83eb4abef57925d14c2 GIT binary patch literal 369 zcmXS9WMFu(l#xLJ41pYm6d*r}e zfjr121!f=#1OI^xb_Sos%G4qSLnk1IRe=HM6h?;sOfV&K3~~$=bKagc1iFxeS>gBe fdAf7hMHF7nOpaTB{q@(Xy+G>s*W8Fw)pHI2t)NW% literal 0 HcmV?d00001 diff --git a/DATA/Sprites/Floor/move_ghost.png b/DATA/Sprites/Floor/move_ghost.png new file mode 100644 index 0000000000000000000000000000000000000000..874d83b686da4ead54dc9c51c6a8d35d1b798fac GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}PM$7~ArY-_ zuP+p3FyLVdeDV69cChGV#;%>gg*DPE=csCWYCYa|mFdj0pSF9Lff|rNdEd3>sP~K$ WlLZW-9u#f{$#}Z@xvXyADL{+>3Ji=OK?VUJqy-2Dn*Qq}3)of`pao(;%&q{o63MzO zAe)5&D5?NtC@Gk@YS^S%8uo`--!D|VxghP`;aR^wnaz9}khRaid`g~orhbsOijj?_ zy?u#6LQ{0!!{pijl*yKds8COG0BI~D(D7N#fzEq!O}vN>!))ecTUeZQq0@p`Qtn(oUwQs3|h z-kvd0sc)l_%ML>uhQ#$1Od|K(ts62YZ(*9V&)bbQUmHq0rie-VTBR@}y4@`Q} zTE}>+<%PteZjRWaFASZ|8)kU~c(=_8x-xC?L6+XM42z|YfAR(?)i2$8?)`J1(-=Hm L{an^LB{Ts51XfXU literal 0 HcmV?d00001 diff --git a/DATA/Sprites/Snake/body-rotate.aseprite b/DATA/Sprites/Snake/body-rotate.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..cc4ef420e312f1022425e287052812886795a7c5 GIT binary patch literal 491 zcmaFO$iVPmDIyADL{+>iVTb(K?VUJqy@+Zn*Qq}3)of`pao(;%&q{o63Mz; zAe)5&D5?l#C@Gk@YS^S%8uo`--!D|VxghP`;aR^wnaz9}khRaid`g~orhbsOijj?_ zy?u#6LQ{0!!{pij!x%l4NK7t5WT zx&7fS>*Tm(z9$RCdXFwTb8v>Lo2F9uv)&D+YxD1CWlktfN{`50Gs{aad0LikY3jCZ z?LPkZpIc93k5hZK-DX9i*VPx$DoI2^R9J=WR=W;@KoFcWR9H%FL4u#8t%aXuL93sn2?aHjP?4O4SzMMwxZ~9@ z%_iiynVo$Auwlc74J$*YF@9rpB@r2T7b-wlLn!WJS}iI z?vW)Wg3w2nlnpV?0?zkS%U(&^6}gz*SaRiQ1fgHYKJq**>T^Npy9uC70rZmfMe7pq z?EhuVZRSy)vleiPBdsfCysWFy2&M-0Yz1^>PNZ2<*2Hq=c>-UtmJZO%QUuS~L}~(+ zauNpsWkn7E&)Z7@7(NBGa7^|CX1j;LY7D7%vi7psW)lFk9iV-%n1HVCUrc~$t&V}y z7>*r54ySLysyzUh%OHO~hGMdBfv)VA5#ZyADL{+>iVTb(K?VUJqy-28n*Qq}3)of`pao(;%&q{o63Mz; zAe)5&D5?l#C@Gk@YS^S%8uo`--!D|VxghP`;aR^wnaz9}khRaid`g~orhbsOijj?_ zy?u#6LQ{0!!{pij;{z3jo+eHOKfwK*46P`}^DiGwa{n?RW_RlQ^!n@>Z@|?=Kb?>;W{ApmH z7~HSz<7l$0D(Ep!ctlcgzpt*5@0#77yyY|Gf)2^X+U_f9KAn?vnL$U+qtIM4QzCxH gg-tOBQtk9?e_S#!z1yPe^YNwRo2TjwiV51!0oF@+xc~qF literal 0 HcmV?d00001 diff --git a/DATA/Sprites/Snake/body.png b/DATA/Sprites/Snake/body.png new file mode 100644 index 0000000000000000000000000000000000000000..0a661648014a573013e73fd8d13d10599366c86f GIT binary patch literal 371 zcmV-(0gV2MP)Px$ElET{R9J=WmoaX_KoCXWL|d5>*A$k>kwQz6W2K;lBY{NW8keTBG%3(Z$X*vS zUKT0J^xl2`Gyjh*7;AUfst!WkRCI06db6Tydvp*aD98OpEa!b#0b)I0zTT|7$M^xB zFYnsEJiyx&h&>)FP&XAi2)n~pUkU&qLAhP;S=!)k0Wg6m25{V8M1oGN=xIY%1w3t7 z1Ta>>(}t`H+^+X>0I4{xn+gdg7h=loSaBan(1`-pec)0+hsXI#<#z#m{d_7+2QbQC zWE-ZYznB7ZF&snakPpBC%LE0PyPQJ#`-h=hQE9AB~Kwd Rp#%T`002ovPDHLkV1kK@o8ABb literal 0 HcmV?d00001 diff --git a/DATA/Sprites/Snake/head.aseprite b/DATA/Sprites/Snake/head.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..039b8f74758b768d4fd8e39c8d37a290721b490e GIT binary patch literal 486 zcmaFH$iVPmDIyADL{+>$_$JkK?VUJqyu9FHn^SS*gH`=dPn5Z2@ipbGF++0FSEbjAVftrs*X2$suvIWqG@rbfU#al-h)S_eVu$uV$qK;jTt$=HoSDa*6l0rqihkJ$#?SH9M!5!qU?5^Bl^x?aY&kwav`zY8QXw)&0$2uqd@30E`fT AWdHyG literal 0 HcmV?d00001 diff --git a/DATA/Sprites/Snake/head.png b/DATA/Sprites/Snake/head.png new file mode 100644 index 0000000000000000000000000000000000000000..370d62f41b6655d419ef71acc923759dfe5e0f4e GIT binary patch literal 329 zcmV-P0k-~$P)Px$14%?dR9J=WRv`|9KoFcZbtrAj>KYyqahvW!-^)B+7oD|UBawE#|kIkCrZfL2r_3VGztV)DpEk*LL-%>pQi zi5Rf}0O*?#Y1z%r)3QU~gxu?R0@)fV^^cD z+HpMpbre$~if_V<3(z9;O7{}5KQ8?kp-$+%c3#bEAH@L74SO=^F byF2g#%7(Q6BQCc800000NkvXXu0mjfdHsVW literal 0 HcmV?d00001 diff --git a/DATA/Sprites/Snake/tail.aseprite b/DATA/Sprites/Snake/tail.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..f55b22a737242f0a49197b9d0a1849d9d276449c GIT binary patch literal 431 zcmZ3_$iVPmDIyADL{+>iVTb(K?VUJqy^9in*Qq}3)of`pao(;%&q{o63Mz; zAe)5&D5?l#C@Gk@YS^S%8uo`--!D|VxghP`;aR^wnaz9}khRaid`g~orhbsOijj?_ zy?u#6LQ{0!!{pijP}dp=|68|7Px#^+`lQR9J=8m7xxUFc60SE>j>uBS^+0F+0IyA!f%Tu>^qz$rMQ^mLttFbJt5R z`%PW{uivGu12fnA#rxf%tTU|hhN8-`&Kvyh;LaY8+tYFOJ8=OhVR=#I(rx$ve*YXW zEMMm>9l+3y4lp!8DXJXH^g31m?D8{oS<_VgkEjjI<0psAk?Fm$6cHvquS z0EGJ%*^iz!X4h4F73B;{}WY(2N*B%YwOqsF*xN+A#+(&l_?YhB+k{$e#cJ N002ovPDHLkV1n)vdw>7{ literal 0 HcmV?d00001 diff --git a/__pycache__/fill_level.cpython-313.pyc b/__pycache__/fill_level.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34fb3385a6d2695bfa356da0d7cb8ff080156885 GIT binary patch literal 2837 zcmc&$-ESMm5#PNJev?O9qD!;HZdY2HA_DD%KoaZjV z+1cIMnc3Oj%&S=31+2`LRPDWgV+o;}Out zF~km<%IEX`>FVP3rRCC<<;&NXHtf39vd!g+Yw_!NMzd-C$Z8hbTYkhe8+OArO|E#BTiPF$2McU(f&FcvyrbOG_CbKGQKW+wf?h=F55T~6 zQaJx`?MR=3%l(>c(`yH@DbvHNmWVA~8v=t|Mx9Tz0>%}O{X{EEL%8G-O7J@z*U1cd zo(ylQ3SQTwJUL17@T-$=$R|k+0JgH7SSnp98Q;PfImUL(s8-xc@olGN`}BscieURn zt8Ll7B4(B9#(LY2iJ+P&tjjzOe)$oIsUcOsu9GrMOyuia1PyQR+(>Gv=F^3rbg*R9*F?mPDr z`j;|E%{)lv|DMeM$3ZtfER-VhUm~&6SokqKqYZIWHbmkMDMP|ANR^_*6sEFJQ8FkC zvq-=h5~NK`tj1YF^ih@+eTt>9Hxz>yglWYPU>Z~hjiqgwWo(5-ZAd&jR94ur#bbn2 zKxDP_br7n2AGlG3+X#965+QcD9A+apwj--QXJTb>k&r6n)SIw#^{0!!f?Y5wM{M=! z=weyi|FpbYT>uZpit>3lGqyZvVbOEIJ#G#4zc~;8HwcM?)au0ptBN>9ut#}|z7;t* z6YjxtT{Wby@ay;)uv8~{ZiS+%?;+hV24?!JjP?EjoT87&z_94cmc|)Y!IsRg|ginaAv3 z#4=_C1+31kEi}%BT@4KR)bXjspGTWA&qK#2kzf_#&jHaTo`ud2Roak!RXr-wOccJL z1m;l^#eH?tT(4~U>Q>NgLdmm*HV0u36*6c+HpUK%qMsQgwx8#8#c6a+j!<(4=&CB;HUCYZ&ex%*i?uGYqFFeT2 z@8#zIeBsm8@9Zsn_kQl0H#ya*+`(ZLMi90_s9;sydIq+pP`@zfIO2_g>vmJVS z`8Iu+&i0QJExlW~RqKzFS-o4_QQp^np>;xkjhy6og^zs-k}x3(%#VS=Pr;G$f&~K$ zPDqpvEHpz73eI5eX&ijJ2djr%@V1 zBtH$Lhwh53%ktV6@m61yZ{369zsnR_#M%yz^a3p zmKUhwxav<0;P&*7{Y4OQ{siPE>4y$6G{B51XS99{rx8+pSxRgD$p3SQhz2(@+M^OZ zm5%kvsc1~V0@4{PiO61&sVh45!%M;AMvvk%1V5AT42hZMdaJqtRnYVkruoiBr8!v9 zOtaSDj@xY5mfbQ9MJ^dBVtWvE7J>~nZx&_Ln;001*@3;+NC literal 0 HcmV?d00001 diff --git a/fill_level.py b/fill_level.py new file mode 100644 index 0000000..9bece64 --- /dev/null +++ b/fill_level.py @@ -0,0 +1,108 @@ +import json + + +class filler(): + def __init__(self, name = "None", floor_code = []): + self.name = name + self.floor_code = floor_code if floor_code else self.get_default_floor_code() + + def export2json(self): + filename = f"DATA/Levels/{self.name}/data.json" + with open(filename, 'w') as f: + json.dump(self.level_data, f) + + def fill_level(self, floor_code, name = "Default"): + self.level_data = { + "name": name, + "start_point": { + "x": 4, + "y": 8, + }, + "enemy_types": [ + [ + { + "type": "little_spider", + "sprite": "DATA/Sprites/Enemies/Tier 1/little-spider.png", + } + ], + [ + { + "type": "wolf", + "sprite": "DATA/Sprites/Enemies/Tier 2/wolf.png", + } + ], + ], + "enemy_spawns": [ + { "x" : 1, "y" : 2 }, + { "x" : 3, "y" : 12 }, + { "x" : 1, "y" : 6 }, + { "x" : 10, "y" : 10 } + ], + "size" : [], + "floor": [] + } + # Загрузка пола + + # floor_code - закодированная информация об уровне, представляет собой ас массив последовательностей 2х чисел: + # начало пола, конец пола + # Ключами являются координаты по y + + sprite = "DATA/Sprites/Floor/floor_grey.png" + y = 0 + x_max = 1 + y_max = 1 + + while y < 15: + if y in floor_code: + for x_len in floor_code[y]: + x = x_len["s"] + while x <= x_len["e"]: + if x > x_max: x_max = x + self.level_data["floor"].append({"sprite": sprite, "x": x, "y": y}) + x = x+1 + if y > y_max: y_max = y + y = y + 1 + else: + break + + self.level_data["size"] = [x_max, y_max] + + def get_default_floor_code(self): + return { + 0: [ + { "s" : 5, "e" : 6 }, + { "s" : 10, "e" : 12 }, + ], + 1:[ + { "s" : 5, "e" : 13 }, + ], + 2:[ + { "s" : 4, "e" : 13 }, + ], + 3:[ + { "s" : 1, "e" : 13 }, + ], + 4:[ + { "s" : 1, "e" : 13 }, + ], + 5:[ + { "s" : 1, "e" : 13 }, + ], + 6:[ + { "s" : 0, "e" : 12 }, + ], + 7:[ + { "s" : 0, "e" : 12 }, + ], + 8:[ + { "s" : 1, "e" : 12 }, + ], + 9:[ + { "s" : 3, "e" : 11 }, + ], + 10:[ + { "s" : 6, "e" : 8 }, + ] + } + + diff --git a/main.py b/main.py index e69de29..fc74e4c 100644 --- a/main.py +++ b/main.py @@ -0,0 +1,208 @@ +import arcade +import json +import math +from fill_level import filler + +SCREEN_WIDTH = 800 +SCREEN_HEIGHT = 600 + +class body(): + def __init__(self, x, y, rotate, type): + self.x = x + self.y = y + self.rotate = rotate + self.type = type + +class SNAKE(): + def __init__(self, star_point_x, star_point_y, start_rotate = 90): + self.body = [ + body(star_point_x, star_point_y, start_rotate, "head"), + body(star_point_x - 1, star_point_y, start_rotate, "tail") + ] + def move(self, vector): + self.body[0].rotate = vector * 90 + i = 0 + while i < len(self.body): + if self.body[i].type == "body" or self.body[i].type == "tail": + self.body[i].x = self.body[i-1].x + self.body[i].y = self.body[i-1].y + self.body[i].rotate = self.body[i-1].rotate + i = i + 1 + a = int(math.cos(-self.body[0].rotate * math.pi / 180)) + self.body[0].x = int(-math.sin(-self.body[0].rotate * math.pi / 180)) + self.body[0].x + self.body[0].y = int(math.cos(-self.body[0].rotate * math.pi / 180)) + self.body[0].y + + # print(f"Move {vector}") + +class Level_data(): + def __init__(self, level_data_json = []): + if level_data_json: + self.fill_grid(level_data_json) + + def fill_grid(self, level_data_json): + self.name = level_data_json["name"] + self.floor = level_data_json["floor"] + self.size = level_data_json["size"] + self.enemy_types = level_data_json["enemy_types"] + self.enemy_spawns = level_data_json["enemy_spawns"] + self.start_point = level_data_json["start_point"] + +class MYGAME(arcade.Window): + Sprites = [] + + def __init__(self, width, height): + super().__init__(width, height) + arcade.set_background_color(arcade.color.AMAZON) + + def setup(self, level_name): + + print(f"Upload level: {level_name}") + + with open(f'./DATA/Levels/{level_name}/data.json', 'r') as file: + self.Lvl_data = Level_data(json.load(file)) + + if self.Lvl_data.name : + print(f"{self.Lvl_data.name} loaded") + else: + print("Error to load level") + + self.player_list = arcade.SpriteList() + self.floor_list = arcade.SpriteList() + self.eat_list = arcade.SpriteList() + self.enemies_list = arcade.SpriteList() + self.enemy_spanw = arcade.SpriteList() + + grid = fill_empty_grid() + self.floor_grid = self.arr2grid(self.Lvl_data.floor, grid) + self.print_grid(self.floor_grid) + self.snake = SNAKE(self.Lvl_data.start_point["x"], self.Lvl_data.start_point["y"]) + + # Счет + self.score = 0 + self.scale_ = 1.3 + + screen_center = [SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2] + self.level_start = [screen_center[0] - self.Lvl_data.size[0] * 16 * self.scale_, screen_center[1] - self.Lvl_data.size[1] * 16 * self.scale_] + + # Загрузка змеи + for body in self.snake.body: + snake_sprite = arcade.Sprite(f"./DATA/Sprites/Snake/{body.type}.png", self.scale_) + snake_sprite.angle = 90 + snake_sprite.center_x = self.level_start[0] - 16 + ( body.x + 1 ) * 32 * self.scale_ + snake_sprite.center_y = self.level_start[1] - 16 + ( body.y + 1 ) * 32 * self.scale_ + self.player_list.append(snake_sprite) + + # Загрузка пола + for floor in self.Lvl_data.floor: + floor_sprite = arcade.Sprite(floor["sprite"], self.scale_) + floor_sprite.center_x = self.level_start[0] - 16 + ( floor["x"] + 1 ) * 32 * self.scale_ + floor_sprite.center_y = self.level_start[1] - 16 + ( floor["y"] + 1 ) * 32 * self.scale_ + self.floor_list.append(floor_sprite) + + # Загрузка врагов + # if "enemies" in self.level_data: + # for enemy in self.level_data["enemies"]: + # enemy_sprite = arcade.Sprite(enemy["sprite"], 1) + # enemy_sprite.center_x = enemy["x"] * 32 + # enemy_sprite.center_y = enemy["y"] * 32 + # self.enemies_list.append(enemy_sprite) + + def update(self): + if len(self.snake.body) > 0: + i = 0 + while i < len(self.snake.body): + self.player_list[i] = arcade.Sprite(f"./DATA/Sprites/Snake/{self.snake.body[i].type}.png", self.scale_) + self.player_list[i].angle = self.snake.body[i].rotate + self.player_list[i].center_x = self.level_start[0] - 16 + ( self.snake.body[i].x + 1 ) * 32 * self.scale_ + self.player_list[i].center_y = self.level_start[1] - 16 + ( self.snake.body[i].y + 1 ) * 32 * self.scale_ + i = i + 1 + + def print_grid(self, grid): + x = 0 + y = 15 + print_ = '' + while y > 0: + while x < 15: + print_ += " " if grid[y][x] == 0 else "1 " + x += 1 + print(print_) + print_ = '' + y -= 1 + x = 0 + + + def arr2grid(self, arr, grid): + for point in arr: + grid[point["y"]][point["x"]] = 1 + return grid + + # Обработка нажатий + MOVEMENT_SPEED = 1 + + def on_key_press(self, key, modifiers): + """Вызывается при нажатии пользователем клавиши""" + + # Get the first sprite (head) from the player list + if len(self.player_list) > 0: + + if key in (arcade.key.UP, arcade.key.W): + if self.floor_grid[self.snake.body[0].y + 1][self.snake.body[0].x] == 1 and self.snake.body[0].rotate != 180: + self.snake.move(0) + + elif key in (arcade.key.DOWN, arcade.key.S): + if self.floor_grid[self.snake.body[0].y - 1][self.snake.body[0].x] == 1 and self.snake.body[0].rotate != 0: + self.snake.move(2) + + elif key in (arcade.key.LEFT, arcade.key.A): + if self.floor_grid[self.snake.body[0].y][self.snake.body[0].x - 1] == 1 and self.snake.body[0].rotate != 90: + self.snake.move(3) + + elif key in (arcade.key.RIGHT, arcade.key.D): + if self.floor_grid[self.snake.body[0].y][self.snake.body[0].x + 1] == 1 and self.snake.body[0].rotate != 270: + self.snake.move(1) + + def on_key_release(self, key, modifiers): + """Вызывается, когда пользователь отпускает клавишу""" + if len(self.player_list) > 0: + self.player_sprite = self.player_list[0] + + if key in (arcade.key.UP, arcade.key.DOWN, arcade.key.W, arcade.key.S): + self.player_sprite.change_y = 0 + elif key in (arcade.key.LEFT, arcade.key.RIGHT, arcade.key.A, arcade.key.D): + self.player_sprite.change_x = 0 + def on_draw(self): + self.update() + # Очищаем экран перед каждой отрисовкой + self.clear() + # Отрисовываем все спрайты + self.floor_list.draw() + self.enemies_list.draw() + self.eat_list.draw() + self.player_list.draw() + + +def fill_empty_grid(): + grid = [] + y = 0 + x = 0 + while y < 15: + grid.append([]) + while x < 15: + grid[y].append([x]) + grid[y][x] = 0 + x = x + 1 + y = y + 1 + x = 0 + return grid + +def main(): + filler_ = filler("Default") + filler_.fill_level(filler_.floor_code) + filler_.export2json() + + game = MYGAME(SCREEN_WIDTH, SCREEN_HEIGHT) + game.setup( "Default" ) + arcade.run() + +if __name__ == "__main__": + main() \ No newline at end of file From ec9b9c90efe0bbd523b9b0d0da4e941d1551db9c Mon Sep 17 00:00:00 2001 From: PABLO Date: Tue, 6 May 2025 14:10:14 +0300 Subject: [PATCH 08/12] add: Food --- DATA/Levels/Default/data.json | 2 +- __pycache__/fill_level.cpython-313.pyc | Bin 2837 -> 2934 bytes fill_level.py | 13 ++-- main.py | 102 ++++++++++++++++++++----- 4 files changed, 93 insertions(+), 24 deletions(-) diff --git a/DATA/Levels/Default/data.json b/DATA/Levels/Default/data.json index 2fce87e..e1cb036 100644 --- a/DATA/Levels/Default/data.json +++ b/DATA/Levels/Default/data.json @@ -1 +1 @@ -{"name": "Default", "start_point": {"x": 4, "y": 8}, "enemy_types": [[{"type": "little_spider", "sprite": "DATA/Sprites/Enemies/Tier 1/little-spider.png"}], [{"type": "wolf", "sprite": "DATA/Sprites/Enemies/Tier 2/wolf.png"}]], "enemy_spawns": [{"x": 1, "y": 2}, {"x": 3, "y": 12}, {"x": 1, "y": 6}, {"x": 10, "y": 10}], "size": [13, 10], "floor": [{"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 0}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 0}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 0}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 0}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 0}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 13, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 4, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 13, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 1, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 2, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 3, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 4, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 13, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 1, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 2, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 3, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 4, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 13, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 1, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 2, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 3, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 4, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 13, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 0, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 1, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 2, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 3, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 4, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 0, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 1, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 2, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 3, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 4, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 1, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 2, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 3, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 4, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 3, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 4, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 10}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 10}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 10}]} \ No newline at end of file +{"name": "Default", "start_point": {"x": 4, "y": 8}, "enemy_types": [[{"type": "little_spider", "sprite": "DATA/Sprites/Enemies/Tier 1/little-spider.png"}], [{"type": "wolf", "sprite": "DATA/Sprites/Enemies/Tier 2/wolf.png"}]], "enemy_spawns": [[{"x": 1, "y": 3, "tier": 1, "sleep": 600, "delay": 600}, {"x": 12, "y": 7, "tier": 1, "sleep": 9000, "delay": 9000}, {"x": 1, "y": 4, "tier": 1, "sleep": 800, "delay": 800}, {"x": 10, "y": 0, "tier": 1, "sleep": 600, "delay": 600}]], "size": [13, 10], "floor": [{"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 0}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 0}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 0}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 0}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 0}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 13, "y": 1}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 4, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 13, "y": 2}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 1, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 2, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 3, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 4, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 13, "y": 3}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 1, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 2, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 3, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 4, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 13, "y": 4}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 1, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 2, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 3, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 4, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 13, "y": 5}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 0, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 1, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 2, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 3, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 4, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 6}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 0, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 1, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 2, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 3, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 4, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 7}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 1, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 2, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 3, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 4, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 12, "y": 8}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 3, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 4, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 5, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 9, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 10, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 11, "y": 9}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 6, "y": 10}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 7, "y": 10}, {"sprite": "DATA/Sprites/Floor/floor_grey.png", "x": 8, "y": 10}]} \ No newline at end of file diff --git a/__pycache__/fill_level.cpython-313.pyc b/__pycache__/fill_level.cpython-313.pyc index 34fb3385a6d2695bfa356da0d7cb8ff080156885..44a1f1b44772ad082869a9c6f413a7ba8a0cbaf4 100644 GIT binary patch delta 582 zcmZ8dF>KR76upb@+}N#c(lkyT6DUNYb*08cDzr_34uFaTLWNVMY^YGHR0^iLz`(-5 z(hMx<#K4xJL#0lr3sRO246NNE4=haH3>A!s{{upZ|8-CQ>A!b(|G#yAxb}%W(W%B6eO~O7zg%88M2UuBqX9( z*VjoK?;nPkh&3@DGhxKwkM(sXO3GoiQI|tM&bM|&SzTq9&Q2n~kDvH2T8rTE)Enl} zvN~W3w4}bUX`?a?x-Am;s>sz1^li6tgallkhFVqu683C6k_qp$qi84Ln^Ak?MT(=Q zBPgG#0Zf52#dXM>>hp(I>Y$N!5*o?63iT45Q#bXObXk4WudnUj`%paU92ag6Jipff zHt~ra7w!(cO79#n?dZ`zy`l0>X7Dq1MtIf9Y~oH1O69LhRp0Eg*G_ipusO0u8>tR& z203{VztKPl5OBcM!U|U-&m+KuMAlS4@6D#a>%aXateOZj2tGh+U=^sJ`DMC#*fcIs zdRc9lQ*=eWGUxdMZ+w@kZ~B!L)Zye3*OTP0JbAkLyd7PWt12^HXNywv8$le3egUsI BfDZrw delta 504 zcmW+yJ5K^Z5WeO14(<*PQ8-1wC2io%V zrd;$fg9RC~#zG#O%tS8Hl2npdxTsd8Q|#g$HsHuC;!vhJiZHcG*&q~X#u!pW-U;ko zu_)})WfFrsnj#iF(Kw01D=m{j_@jAkI4|msq{0ZyDG>7sr-$?Of(R;t4pgmAaW54X zfi7uwNrTS{S&;d-Af7}>A*jf|wN)bC(sCrdgb@sPW47INYwpRuU2|Q2Qg6A9rfu^Iyz5KK qiZcIw0ZAh 0: if self.body[i].type == "body" or self.body[i].type == "tail": self.body[i].x = self.body[i-1].x self.body[i].y = self.body[i-1].y self.body[i].rotate = self.body[i-1].rotate - i = i + 1 - a = int(math.cos(-self.body[0].rotate * math.pi / 180)) + i = i - 1 + self.body[0].x = int(-math.sin(-self.body[0].rotate * math.pi / 180)) + self.body[0].x self.body[0].y = int(math.cos(-self.body[0].rotate * math.pi / 180)) + self.body[0].y @@ -68,15 +91,20 @@ class MYGAME(arcade.Window): self.player_list = arcade.SpriteList() self.floor_list = arcade.SpriteList() - self.eat_list = arcade.SpriteList() + self.enemies_list = arcade.SpriteList() - self.enemy_spanw = arcade.SpriteList() + self.enemy_spawn = arcade.SpriteList() grid = fill_empty_grid() self.floor_grid = self.arr2grid(self.Lvl_data.floor, grid) self.print_grid(self.floor_grid) self.snake = SNAKE(self.Lvl_data.start_point["x"], self.Lvl_data.start_point["y"]) + # food + self.food_list = arcade.SpriteList() + self.food_sleep = 300 + self.delay = 400 + self.food = [] # Счет self.score = 0 self.scale_ = 1.3 @@ -103,9 +131,22 @@ class MYGAME(arcade.Window): # if "enemies" in self.level_data: # for enemy in self.level_data["enemies"]: # enemy_sprite = arcade.Sprite(enemy["sprite"], 1) - # enemy_sprite.center_x = enemy["x"] * 32 - # enemy_sprite.center_y = enemy["y"] * 32 + # enemy_sprite.center_x = self.level_start[0] - 16 + ( enemy["x"] + 1 ) * 32 * self.scale_ + # enemy_sprite.center_y = self.level_start[0] - 16 + ( enemy["y"] + 1 ) * 32 * self.scale_ # self.enemies_list.append(enemy_sprite) + def spawn_food(self): + spawn = False + while spawn == False: + x = random.randint(0, 14) + y = random.randint(0, 14) + if self.floor_grid[y][x] == 1 and not(self.snake.check_contact(x,y)): + self.food.append(food(x,y)) + food_sprite = arcade.Sprite(f"./DATA/Sprites/Enemies/Tier 0/healthy_food.png", self.scale_) + food_sprite.angle = 0 + food_sprite.center_x = self.level_start[0] - 16 + ( x + 1 ) * 32 * self.scale_ + food_sprite.center_y = self.level_start[1] - 16 + ( y + 1 ) * 32 * self.scale_ + self.food_list.append(food_sprite) + spawn = True def update(self): if len(self.snake.body) > 0: @@ -116,12 +157,37 @@ class MYGAME(arcade.Window): self.player_list[i].center_x = self.level_start[0] - 16 + ( self.snake.body[i].x + 1 ) * 32 * self.scale_ self.player_list[i].center_y = self.level_start[1] - 16 + ( self.snake.body[i].y + 1 ) * 32 * self.scale_ i = i + 1 - + # Food + self.food_sleep -= 1 + if self.food_sleep <= 0: + self.spawn_food() + self.food_sleep = self.delay + i = 0 + while i < len(self.food_list): + if self.snake.check_contact(self.food[i].x, self.food[i].y): + self.food_list[i].kill() + self.food.pop(i) + self.score += 1 + self.snake.add_dody() + self.player_list.append(arcade.Sprite()) + i += 1 + # Enemy_spawn + for spawn in self.Lvl_data.enemy_spawns[0]: + spawn["sleep"] -= 1 + if spawn["sleep"] <= 0: + spawn["sleep"] = spawn["delay"] + self.spawn_enemy(spawn["y"], spawn["x"], spawn["tier"]) + + def spawn_enemy(self, y, x, tier): + type = random.randint(0, len(self.Lvl_data.enemy_types[tier-1])) + print_spawn("tier: " + str(type), x, y) + + def print_grid(self, grid): x = 0 - y = 15 + y = 14 print_ = '' - while y > 0: + while y >= 0: while x < 15: print_ += " " if grid[y][x] == 0 else "1 " x += 1 @@ -144,21 +210,21 @@ class MYGAME(arcade.Window): # Get the first sprite (head) from the player list if len(self.player_list) > 0: - + if key in (arcade.key.UP, arcade.key.W): - if self.floor_grid[self.snake.body[0].y + 1][self.snake.body[0].x] == 1 and self.snake.body[0].rotate != 180: + if self.floor_grid[self.snake.body[0].y + 1][self.snake.body[0].x] == 1 and self.snake.body[0].rotate != 180 and not(self.snake.check_contact(self.snake.body[0].x ,self.snake.body[0].y+1)): self.snake.move(0) elif key in (arcade.key.DOWN, arcade.key.S): - if self.floor_grid[self.snake.body[0].y - 1][self.snake.body[0].x] == 1 and self.snake.body[0].rotate != 0: + if self.floor_grid[self.snake.body[0].y - 1][self.snake.body[0].x] == 1 and self.snake.body[0].rotate != 0 and not(self.snake.check_contact(self.snake.body[0].x ,self.snake.body[0].y-1)): self.snake.move(2) elif key in (arcade.key.LEFT, arcade.key.A): - if self.floor_grid[self.snake.body[0].y][self.snake.body[0].x - 1] == 1 and self.snake.body[0].rotate != 90: + if self.floor_grid[self.snake.body[0].y][self.snake.body[0].x - 1] == 1 and self.snake.body[0].rotate != 90 and not(self.snake.check_contact(self.snake.body[0].x - 1,self.snake.body[0].y)): self.snake.move(3) elif key in (arcade.key.RIGHT, arcade.key.D): - if self.floor_grid[self.snake.body[0].y][self.snake.body[0].x + 1] == 1 and self.snake.body[0].rotate != 270: + if self.floor_grid[self.snake.body[0].y][self.snake.body[0].x + 1] == 1 and self.snake.body[0].rotate != 270 and not(self.snake.check_contact(self.snake.body[0].x + 1,self.snake.body[0].y)): self.snake.move(1) def on_key_release(self, key, modifiers): @@ -177,9 +243,11 @@ class MYGAME(arcade.Window): # Отрисовываем все спрайты self.floor_list.draw() self.enemies_list.draw() - self.eat_list.draw() + self.food_list.draw() self.player_list.draw() +def print_spawn(who, x, y): + print(f"Spawn: {who}\nx: {x}\ny: {y}") def fill_empty_grid(): grid = [] From ecdd0c59ca5da98a5ffaab7d9ec33b3f41a6c997 Mon Sep 17 00:00:00 2001 From: Doom-JSlayer Date: Tue, 6 May 2025 15:32:31 +0300 Subject: [PATCH 09/12] update: master --- main.py | 276 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 276 insertions(+) diff --git a/main.py b/main.py index e69de29..d9e7cfb 100644 --- a/main.py +++ b/main.py @@ -0,0 +1,276 @@ +import arcade +import json +import math +import random +from fill_level import filler + +SCREEN_WIDTH = 800 +SCREEN_HEIGHT = 600 + +class food(): + def __init__(self, x, y, healf = 1): + self.x = x + self.y = y + self.healf = healf + +class body(): + def __init__(self, x, y, rotate, type): + self.x = x + self.y = y + self.rotate = rotate + self.type = type + +class SNAKE(): + def __init__(self, star_point_x, star_point_y, start_rotate = 90): + self.body = [ + body(star_point_x, star_point_y, start_rotate, "head"), + body(star_point_x - 1, star_point_y, start_rotate, "tail") + ] + def check_contact(self,x,y): + cont = 0 + for body in self.body: + if body.x == x and body.y == y: + cont = 1 + return cont + def add_dody(self): + self.body[len(self.body)-1].type = "body" + last_body = self.body[len(self.body)-1] + new_body = body(0,0, last_body.rotate, "tail") + v_x = int(-math.sin(-last_body.rotate * math.pi / 180)) + new_body.x = -v_x + last_body.x + v_y = int(math.cos(-last_body.rotate * math.pi / 180)) + new_body.y = -v_y + last_body.y + self.body.append(new_body) + + def move(self, vector): + self.body[0].rotate = vector * 90 + i = len(self.body)-1 + while i > 0: + if self.body[i].type == "body" or self.body[i].type == "tail": + self.body[i].x = self.body[i-1].x + self.body[i].y = self.body[i-1].y + self.body[i].rotate = self.body[i-1].rotate + i = i - 1 + + self.body[0].x = int(-math.sin(-self.body[0].rotate * math.pi / 180)) + self.body[0].x + self.body[0].y = int(math.cos(-self.body[0].rotate * math.pi / 180)) + self.body[0].y + + # print(f"Move {vector}") + +class Level_data(): + def __init__(self, level_data_json = []): + if level_data_json: + self.fill_grid(level_data_json) + + def fill_grid(self, level_data_json): + self.name = level_data_json["name"] + self.floor = level_data_json["floor"] + self.size = level_data_json["size"] + self.enemy_types = level_data_json["enemy_types"] + self.enemy_spawns = level_data_json["enemy_spawns"] + self.start_point = level_data_json["start_point"] + +class MYGAME(arcade.Window): + Sprites = [] + + def __init__(self, width, height): + super().__init__(width, height) + arcade.set_background_color(arcade.color.AMAZON) + + def setup(self, level_name): + + print(f"Upload level: {level_name}") + + with open(f'./DATA/Levels/{level_name}/data.json', 'r') as file: + self.Lvl_data = Level_data(json.load(file)) + + if self.Lvl_data.name : + print(f"{self.Lvl_data.name} loaded") + else: + print("Error to load level") + + self.player_list = arcade.SpriteList() + self.floor_list = arcade.SpriteList() + + self.enemies_list = arcade.SpriteList() + self.enemy_spawn = arcade.SpriteList() + + grid = fill_empty_grid() + self.floor_grid = self.arr2grid(self.Lvl_data.floor, grid) + self.print_grid(self.floor_grid) + self.snake = SNAKE(self.Lvl_data.start_point["x"], self.Lvl_data.start_point["y"]) + + # food + self.food_list = arcade.SpriteList() + self.food_sleep = 300 + self.delay = 400 + self.food = [] + # Счет + self.score = 0 + self.scale_ = 1.3 + + screen_center = [SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2] + self.level_start = [screen_center[0] - self.Lvl_data.size[0] * 16 * self.scale_, screen_center[1] - self.Lvl_data.size[1] * 16 * self.scale_] + + # Загрузка змеи + for body in self.snake.body: + snake_sprite = arcade.Sprite(f"./DATA/Sprites/Snake/{body.type}.png", self.scale_) + snake_sprite.angle = 90 + snake_sprite.center_x = self.level_start[0] - 16 + ( body.x + 1 ) * 32 * self.scale_ + snake_sprite.center_y = self.level_start[1] - 16 + ( body.y + 1 ) * 32 * self.scale_ + self.player_list.append(snake_sprite) + + # Загрузка пола + for floor in self.Lvl_data.floor: + floor_sprite = arcade.Sprite(floor["sprite"], self.scale_) + floor_sprite.center_x = self.level_start[0] - 16 + ( floor["x"] + 1 ) * 32 * self.scale_ + floor_sprite.center_y = self.level_start[1] - 16 + ( floor["y"] + 1 ) * 32 * self.scale_ + self.floor_list.append(floor_sprite) + + # Загрузка врагов + # if "enemies" in self.level_data: + # for enemy in self.level_data["enemies"]: + # enemy_sprite = arcade.Sprite(enemy["sprite"], 1) + # enemy_sprite.center_x = self.level_start[0] - 16 + ( enemy["x"] + 1 ) * 32 * self.scale_ + # enemy_sprite.center_y = self.level_start[0] - 16 + ( enemy["y"] + 1 ) * 32 * self.scale_ + # self.enemies_list.append(enemy_sprite) + def spawn_food(self): + spawn = False + while spawn == False: + x = random.randint(0, 14) + y = random.randint(0, 14) + if self.floor_grid[y][x] == 1 and not(self.snake.check_contact(x,y)): + self.food.append(food(x,y)) + food_sprite = arcade.Sprite(f"./DATA/Sprites/Enemies/Tier 0/healthy_food.png", self.scale_) + food_sprite.angle = 0 + food_sprite.center_x = self.level_start[0] - 16 + ( x + 1 ) * 32 * self.scale_ + food_sprite.center_y = self.level_start[1] - 16 + ( y + 1 ) * 32 * self.scale_ + self.food_list.append(food_sprite) + spawn = True + + def update(self): + if len(self.snake.body) > 0: + i = 0 + while i < len(self.snake.body): + self.player_list[i] = arcade.Sprite(f"./DATA/Sprites/Snake/{self.snake.body[i].type}.png", self.scale_) + self.player_list[i].angle = self.snake.body[i].rotate + self.player_list[i].center_x = self.level_start[0] - 16 + ( self.snake.body[i].x + 1 ) * 32 * self.scale_ + self.player_list[i].center_y = self.level_start[1] - 16 + ( self.snake.body[i].y + 1 ) * 32 * self.scale_ + i = i + 1 + # Food + self.food_sleep -= 1 + if self.food_sleep <= 0: + self.spawn_food() + self.food_sleep = self.delay + i = 0 + while i < len(self.food_list): + if self.snake.check_contact(self.food[i].x, self.food[i].y): + self.food_list[i].kill() + self.food.pop(i) + self.score += 1 + self.snake.add_dody() + self.player_list.append(arcade.Sprite()) + i += 1 + # Enemy_spawn + for spawn in self.Lvl_data.enemy_spawns[0]: + spawn["sleep"] -= 1 + if spawn["sleep"] <= 0: + spawn["sleep"] = spawn["delay"] + self.spawn_enemy(spawn["y"], spawn["x"], spawn["tier"]) + + def spawn_enemy(self, y, x, tier): + type = random.randint(0, len(self.Lvl_data.enemy_types[tier-1])) + print_spawn("tier: " + str(type), x, y) + + + def print_grid(self, grid): + x = 0 + y = 14 + print_ = '' + while y >= 0: + while x < 15: + print_ += " " if grid[y][x] == 0 else "1 " + x += 1 + print(print_) + print_ = '' + y -= 1 + x = 0 + + + def arr2grid(self, arr, grid): + for point in arr: + grid[point["y"]][point["x"]] = 1 + return grid + + # Обработка нажатий + MOVEMENT_SPEED = 1 + + def on_key_press(self, key, modifiers): + """Вызывается при нажатии пользователем клавиши""" + + # Get the first sprite (head) from the player list + if len(self.player_list) > 0: + + if key in (arcade.key.UP, arcade.key.W): + if self.floor_grid[self.snake.body[0].y + 1][self.snake.body[0].x] == 1 and self.snake.body[0].rotate != 180 and not(self.snake.check_contact(self.snake.body[0].x ,self.snake.body[0].y+1)): + self.snake.move(0) + + elif key in (arcade.key.DOWN, arcade.key.S): + if self.floor_grid[self.snake.body[0].y - 1][self.snake.body[0].x] == 1 and self.snake.body[0].rotate != 0 and not(self.snake.check_contact(self.snake.body[0].x ,self.snake.body[0].y-1)): + self.snake.move(2) + + elif key in (arcade.key.LEFT, arcade.key.A): + if self.floor_grid[self.snake.body[0].y][self.snake.body[0].x - 1] == 1 and self.snake.body[0].rotate != 90 and not(self.snake.check_contact(self.snake.body[0].x - 1,self.snake.body[0].y)): + self.snake.move(3) + + elif key in (arcade.key.RIGHT, arcade.key.D): + if self.floor_grid[self.snake.body[0].y][self.snake.body[0].x + 1] == 1 and self.snake.body[0].rotate != 270 and not(self.snake.check_contact(self.snake.body[0].x + 1,self.snake.body[0].y)): + self.snake.move(1) + + def on_key_release(self, key, modifiers): + """Вызывается, когда пользователь отпускает клавишу""" + if len(self.player_list) > 0: + self.player_sprite = self.player_list[0] + + if key in (arcade.key.UP, arcade.key.DOWN, arcade.key.W, arcade.key.S): + self.player_sprite.change_y = 0 + elif key in (arcade.key.LEFT, arcade.key.RIGHT, arcade.key.A, arcade.key.D): + self.player_sprite.change_x = 0 + def on_draw(self): + self.update() + # Очищаем экран перед каждой отрисовкой + self.clear() + # Отрисовываем все спрайты + self.floor_list.draw() + self.enemies_list.draw() + self.food_list.draw() + self.player_list.draw() + +def print_spawn(who, x, y): + print(f"Spawn: {who}\nx: {x}\ny: {y}") + +def fill_empty_grid(): + grid = [] + y = 0 + x = 0 + while y < 15: + grid.append([]) + while x < 15: + grid[y].append([x]) + grid[y][x] = 0 + x = x + 1 + y = y + 1 + x = 0 + return grid + +def main(): + filler_ = filler("Default") + filler_.fill_level(filler_.floor_code) + filler_.export2json() + + game = MYGAME(SCREEN_WIDTH, SCREEN_HEIGHT) + game.setup( "Default" ) + arcade.run() + +if __name__ == "__main__": + main() \ No newline at end of file From 81404a51da0c9b4547faed5b807e1f30d2686bd3 Mon Sep 17 00:00:00 2001 From: Doom-JSlayer Date: Tue, 6 May 2025 17:13:14 +0300 Subject: [PATCH 10/12] update: movement --- __pycache__/fill_level.cpython-313.pyc | Bin 2934 -> 2962 bytes main.py | 32 +++++++++++++++++++------ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/__pycache__/fill_level.cpython-313.pyc b/__pycache__/fill_level.cpython-313.pyc index 44a1f1b44772ad082869a9c6f413a7ba8a0cbaf4..60ba9c77b4b531d4305a1c5057d5a6f4babc7424 100644 GIT binary patch delta 64 zcmew+Hc6cOGcPX}0}yyHNNwcKU{rHVwu%WYPAw`1lQAy&$)&lec_qa$E~R 0: - if self.body[i].type == "body" or self.body[i].type == "tail": - self.body[i].x = self.body[i-1].x - self.body[i].y = self.body[i-1].y - self.body[i].rotate = self.body[i-1].rotate - i = i - 1 + self.body[i].x = self.body[i-1].x + self.body[i].y = self.body[i-1].y - self.body[0].x = int(-math.sin(-self.body[0].rotate * math.pi / 180)) + self.body[0].x - self.body[0].y = int(math.cos(-self.body[0].rotate * math.pi / 180)) + self.body[0].y + + if abs(math.cos(self.body[i+1].rotate)) == abs(math.cos(self.body[i-1].rotate)) or abs(math.sin(self.body[i+1].rotate)) == abs(math.sin(self.body[i-1].rotate)): + self.body[i].type = "body" + self.body[i].rotate = self.body[i-1].rotate + else: + self.body[i].type = "body-rotate" + self.body[i].rotate = (self.body[i+1].rotate - 90) % 360 + + + + i = i - 1 + self.body[0].x = int(-math.sin(-(vector * 90) * math.pi / 180)) + self.body[0].x + self.body[0].y = int(math.cos(-(vector * 90) * math.pi / 180)) + self.body[0].y # print(f"Move {vector}") From c7c5b6429bf5d9c2220dd003f16166d9146f0e65 Mon Sep 17 00:00:00 2001 From: PABLO Date: Wed, 7 May 2025 01:15:15 +0300 Subject: [PATCH 11/12] update: movement --- DATA/Sprites/Snake/body.aseprite | Bin 468 -> 465 bytes DATA/Sprites/Snake/body.png | Bin 371 -> 342 bytes DATA/Sprites/Snake/head.aseprite | Bin 486 -> 443 bytes DATA/Sprites/Snake/head.png | Bin 329 -> 305 bytes DATA/Sprites/Snake/tail.png | Bin 315 -> 222 bytes __pycache__/fill_level.cpython-313.pyc | Bin 2962 -> 2934 bytes main.py | 107 ++++++++++++++++--------- 7 files changed, 71 insertions(+), 36 deletions(-) diff --git a/DATA/Sprites/Snake/body.aseprite b/DATA/Sprites/Snake/body.aseprite index b2d7e37a33bc8a997f2d2ad341ea793764f737d0..fce8482037791e3c4aaa0c20008b78e7fad14b48 100644 GIT binary patch delta 175 zcmcb@e36;);zY)J#=wb<8|&vYFfgzx00{;zhW|_;8Uz#=co-_?Bqto;JtV&3pZoEO zDZ#7?w?)m|d08(Xl6~>dd7FOre8vbKm%~3^D2cUsE}2N=>h} bd{QyD=^JI17qNMQkNJ|`urMelXg>!4h6zIU delta 178 zcmcb}e1)0u%0$L`#*m4P8|xP_FfgzxFfecd>HkbX0t|Q<6c{SzBqua9d|+Mm|M0UF zf6w1a{~&*)?V^IAz}W`22~Q_{6$tXz{_Myw`{$Md;azeyc~0frx_4Yw{xq;p4DQ$V zaWvUg74(=VJR&K$-&fbjcg=23-trl8L5E~xZTFQlpUz3T%%CHu>``d0nJE#!leYUUw?|(`x*bCU zDz~6pLmM$0-Y0m#6x~UmRow^?om|J^a5#R4J6h=oY-O6;ZU6uP07*qoM6N<$f}}l+ A`2YX_ delta 331 zcmV-R0krsJ!&YAk03boRU4QRc+Td;hFo7rraNJ)+ zf=;aHX+u^8JZ)G6Fjm0RhO7$QuJ>{PsW`5i3JE3`V#@7UaUV#~i2~Mr;8H+`$N5X; zcL99;d@4)_Fv?$K8>Xhem;!S#97E{k0FYM!6LOsXF+{xl^nErkPpBC%LE0PyPQJ d#`-h=hQE9AB~Kwdp#%T`002ovPDHLkV1f#UmRA4( diff --git a/DATA/Sprites/Snake/head.aseprite b/DATA/Sprites/Snake/head.aseprite index 039b8f74758b768d4fd8e39c8d37a290721b490e..482db0b221c20f119f34788b78af9594a3a8933e 100644 GIT binary patch delta 147 zcmaFHyqlSE_e92eM(c@<+v}Sd7#LU;fCK|4!+$0a4Fa+Zd<+$Hk`olO xB+syX@?&yPkDU9LO~o25x~7*dI6Rr!s3E)}*M93;rDJ(XUlmgPz%x$i1l5jmBHX%2YqYoyB%bmFNlA{kw!*$EF8Yz97~l$_6;rj05GCuk8v+dJpcdz diff --git a/DATA/Sprites/Snake/head.png b/DATA/Sprites/Snake/head.png index 370d62f41b6655d419ef71acc923759dfe5e0f4e..30ba40a1548445f46a055b7e6031693abf31b988 100644 GIT binary patch delta 266 zcmV+l0rmdL0L^}YVrAvYY85kHC7-H7FC)pv4#P|jo2+MIZynXZ)!*W)>Q!s~O)rZR=OfW-< zrQbgK${;Mq4afOselg^q`Ni=2lNrPBPi8nBj?1HrS^EtB!+#7VM3Vz_R&|2kYEg7p!%N}%PDaLGC+3(6U8P{2$*Q?``ag8!lMCO6tEC$IU&bPG+|?4 zV8G0ZLQ*_9EoWdD1le%l3nF42K&)ekwU{CY;ByG6mC+~|1*2dT3^)J)AmpZE=AoRt Q00000NkvXXt^-0~f_30=+yDRo delta 290 zcmV+-0p0$w0?7i9Fn<99NkljtYKo z4p%{%kYGSib#x0fWtVFR$&IpQii5Rf}0O*?#Y1z%r)3QU~gxu?R0@)fV^^cD+HpMpbre$~if_V<3(z9;O7{}5KQ8?kp-$+%c o3#bEAH@L74SQ`hd1G_u$0?LN8|06E8{{R3007*qoM6N<$f`7+-CIA2c diff --git a/DATA/Sprites/Snake/tail.png b/DATA/Sprites/Snake/tail.png index ec9f76bb793f5fbd7573ca813f8447f6e11e9d7f..8c21d5d68d1695953dd4bea83fcb0706159b6f1c 100644 GIT binary patch delta 181 zcmV;m080P60^R|TF@KmzL_t(og=1hC1*2dTjDk@xz<`kw&0%xY{v-2OrQ9OfJd!ma zTPmW&#qj3dH#kkKW5VXB{bywPPn-kLeTi-6c-@m7!f5dhPRKt zG6>6Y!)d&(!v(MfFDW5~>RB!VE6+7qpNgM6c|#C00000NkvXXu0mjfr~gZN delta 275 zcmV+u0qp+X0lNZ_F@N<*L_t(oh1Hdz4udcdhW{>8AVDKY#v?I1!DAt2$0M->fdOE3FPUH`A&rL6-q*Zal$-Jz^Atn-GV%CXKH{O;h+9*^78arQfL0VrX4 zQRUKY_yB(Y955_j=Pez;(2Wi-G(ah;9Lw}NRsihzM*%F;3x8#u9ji1V02)IGkraRu zmJ?JGfVOYEhJG;sprc;|(Dsc7pi(XZ_*E{QzZf8#eM~tUKwCc>;JZBb^dbO_s}}{J zsh56hLbX|7k$u1&jjFj2J-6g1LdHm^?( 0: self.body[i].x = self.body[i-1].x self.body[i].y = self.body[i-1].y - + self.body[i].rotate = self.body[i-1].rotate if self.body[i-1] != "body-rotate" else self.convert_rot_to_tail(self.body[i-1].rotate, self.body[i].rotate) - if abs(math.cos(self.body[i+1].rotate)) == abs(math.cos(self.body[i-1].rotate)) or abs(math.sin(self.body[i+1].rotate)) == abs(math.sin(self.body[i-1].rotate)): - self.body[i].type = "body" - self.body[i].rotate = self.body[i-1].rotate - else: - self.body[i].type = "body-rotate" - self.body[i].rotate = (self.body[i+1].rotate - 90) % 360 + self.body[i].type = self.body[i-1].type + + # elif (self.body[i].type == "tail") and self.body[i-1].type == "body-rotate": + # self.body[l].rotate = self.convert_rot_to_tail(self.body[l-1].rotate, self.body[l].rotate) - - i = i - 1 - self.body[0].x = int(-math.sin(-(vector * 90) * math.pi / 180)) + self.body[0].x - self.body[0].y = int(math.cos(-(vector * 90) * math.pi / 180)) + self.body[0].y + + self.body[0].rotate = vector * 90 + self.body[0].x = int(math.cos(math.radians(self.body[0].rotate))) + self.body[0].x + self.body[0].y = int(math.sin(math.radians(self.body[0].rotate))) + self.body[0].y + + if self.body[0].rotate != self.body[1].rotate: + self.body[1].type = "body-rotate" + self.body[1].rotate = self.calculate_rot(self.body[0].rotate, self.body[1].rotate) + else: + self.body[1].type = "body" + + + self.body[l].type = "tail" + # self.body[l].rotate = lf.body[l-1].type == "body-rotate" else self.body[l-1].rotate # print(f"Move {vector}") + class Level_data(): def __init__(self, level_data_json = []): @@ -120,8 +155,8 @@ class MYGAME(arcade.Window): # food self.food_list = arcade.SpriteList() - self.food_sleep = 300 - self.delay = 400 + self.food_sleep = 200 + self.delay = 200 self.food = [] # Счет self.score = 0 @@ -133,7 +168,7 @@ class MYGAME(arcade.Window): # Загрузка змеи for body in self.snake.body: snake_sprite = arcade.Sprite(f"./DATA/Sprites/Snake/{body.type}.png", self.scale_) - snake_sprite.angle = 90 + snake_sprite.angle = 0 snake_sprite.center_x = self.level_start[0] - 16 + ( body.x + 1 ) * 32 * self.scale_ snake_sprite.center_y = self.level_start[1] - 16 + ( body.y + 1 ) * 32 * self.scale_ self.player_list.append(snake_sprite) @@ -171,7 +206,7 @@ class MYGAME(arcade.Window): i = 0 while i < len(self.snake.body): self.player_list[i] = arcade.Sprite(f"./DATA/Sprites/Snake/{self.snake.body[i].type}.png", self.scale_) - self.player_list[i].angle = self.snake.body[i].rotate + self.player_list[i].angle = 360 - self.snake.body[i].rotate self.player_list[i].center_x = self.level_start[0] - 16 + ( self.snake.body[i].x + 1 ) * 32 * self.scale_ self.player_list[i].center_y = self.level_start[1] - 16 + ( self.snake.body[i].y + 1 ) * 32 * self.scale_ i = i + 1 @@ -230,20 +265,20 @@ class MYGAME(arcade.Window): if len(self.player_list) > 0: if key in (arcade.key.UP, arcade.key.W): - if self.floor_grid[self.snake.body[0].y + 1][self.snake.body[0].x] == 1 and self.snake.body[0].rotate != 180 and not(self.snake.check_contact(self.snake.body[0].x ,self.snake.body[0].y+1)): - self.snake.move(0) + if self.floor_grid[self.snake.body[0].y + 1][self.snake.body[0].x] == 1 and self.snake.body[0].rotate != 270 and not(self.snake.check_contact(self.snake.body[0].x ,self.snake.body[0].y+1)): + self.snake.move(1) elif key in (arcade.key.DOWN, arcade.key.S): - if self.floor_grid[self.snake.body[0].y - 1][self.snake.body[0].x] == 1 and self.snake.body[0].rotate != 0 and not(self.snake.check_contact(self.snake.body[0].x ,self.snake.body[0].y-1)): - self.snake.move(2) - - elif key in (arcade.key.LEFT, arcade.key.A): - if self.floor_grid[self.snake.body[0].y][self.snake.body[0].x - 1] == 1 and self.snake.body[0].rotate != 90 and not(self.snake.check_contact(self.snake.body[0].x - 1,self.snake.body[0].y)): + if self.floor_grid[self.snake.body[0].y - 1][self.snake.body[0].x] == 1 and self.snake.body[0].rotate != 90 and not(self.snake.check_contact(self.snake.body[0].x ,self.snake.body[0].y-1)): self.snake.move(3) + elif key in (arcade.key.LEFT, arcade.key.A): + if self.floor_grid[self.snake.body[0].y][self.snake.body[0].x - 1] == 1 and self.snake.body[0].rotate != 0 and not(self.snake.check_contact(self.snake.body[0].x - 1,self.snake.body[0].y)): + self.snake.move(2) + elif key in (arcade.key.RIGHT, arcade.key.D): - if self.floor_grid[self.snake.body[0].y][self.snake.body[0].x + 1] == 1 and self.snake.body[0].rotate != 270 and not(self.snake.check_contact(self.snake.body[0].x + 1,self.snake.body[0].y)): - self.snake.move(1) + if self.floor_grid[self.snake.body[0].y][self.snake.body[0].x + 1] == 1 and self.snake.body[0].rotate != 180 and not(self.snake.check_contact(self.snake.body[0].x + 1,self.snake.body[0].y)): + self.snake.move(0) def on_key_release(self, key, modifiers): """Вызывается, когда пользователь отпускает клавишу""" From f99fe6e27c07cb90803c267170de5b5e13b9534c Mon Sep 17 00:00:00 2001 From: PABLO Date: Thu, 8 May 2025 01:29:18 +0300 Subject: [PATCH 12/12] fix: movement --- DATA/Sprites/Snake/body.png | Bin 342 -> 308 bytes main.py | 92 ++++++++++++++++++++++-------------- 2 files changed, 56 insertions(+), 36 deletions(-) diff --git a/DATA/Sprites/Snake/body.png b/DATA/Sprites/Snake/body.png index 9d8d66773aabbaa69869d56a6bc37b28aee2a3a3..f3a53f97bed8bf468b6cdd9e9110b926e8682325 100644 GIT binary patch delta 269 zcmV+o0rLLV0<;2DbI2BEigSU}a$9O$@B?2p$4b zhtBQTPL;xx;F=@~kPY8r$w_tR>%{;J27~eM5V6DEd1YwtvVTOs`B?xaHS_XVlrKHG zga|q%CRJL((2Y 0: self.body[i].x = self.body[i-1].x self.body[i].y = self.body[i-1].y - self.body[i].rotate = self.body[i-1].rotate if self.body[i-1] != "body-rotate" else self.convert_rot_to_tail(self.body[i-1].rotate, self.body[i].rotate) + self.body[i].rotate = self.body[i-1].rotate + self.body[i].type = self.body[i-1].type + i -= 1 - self.body[i].type = self.body[i-1].type - - # elif (self.body[i].type == "tail") and self.body[i-1].type == "body-rotate": - # self.body[l].rotate = self.convert_rot_to_tail(self.body[l-1].rotate, self.body[l].rotate) - - i = i - 1 - - self.body[0].rotate = vector * 90 self.body[0].x = int(math.cos(math.radians(self.body[0].rotate))) + self.body[0].x self.body[0].y = int(math.sin(math.radians(self.body[0].rotate))) + self.body[0].y @@ -102,14 +122,14 @@ class SNAKE(): self.body[1].type = "body-rotate" self.body[1].rotate = self.calculate_rot(self.body[0].rotate, self.body[1].rotate) else: - self.body[1].type = "body" - - - self.body[l].type = "tail" - # self.body[l].rotate = lf.body[l-1].type == "body-rotate" else self.body[l-1].rotate - # print(f"Move {vector}") + self.body[1].type = "body" + + self.body[len(self.body)-1 ].type = "tail" + self.body[len(self.body)-1 ].rotate = self.calc_tail_rotate() + + class Level_data(): def __init__(self, level_data_json = []): if level_data_json: @@ -176,8 +196,8 @@ class MYGAME(arcade.Window): # Загрузка пола for floor in self.Lvl_data.floor: floor_sprite = arcade.Sprite(floor["sprite"], self.scale_) - floor_sprite.center_x = self.level_start[0] - 16 + ( floor["x"] + 1 ) * 32 * self.scale_ - floor_sprite.center_y = self.level_start[1] - 16 + ( floor["y"] + 1 ) * 32 * self.scale_ + floor_sprite.center_x = self.level_start[0] - 16 + ( floor["x"] + 1 ) * 32 * self.scale_ + floor_sprite.center_y = self.level_start[1] - 16 + ( floor["y"] + 1 ) * 32 * self.scale_ self.floor_list.append(floor_sprite) # Загрузка врагов @@ -221,7 +241,7 @@ class MYGAME(arcade.Window): self.food_list[i].kill() self.food.pop(i) self.score += 1 - self.snake.add_dody() + self.snake.add_body() self.player_list.append(arcade.Sprite()) i += 1 # Enemy_spawn