diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..4a7f5bc
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,9 @@
+cmake-build-debug/
+CMakeCache.txt
+cmake_install.cmake
+Makefile
+TanksGame
+
+*.o
+
+/build/
\ No newline at end of file
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..13566b8
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/.name b/.idea/.name
new file mode 100644
index 0000000..7367234
--- /dev/null
+++ b/.idea/.name
@@ -0,0 +1 @@
+TanksGame
\ No newline at end of file
diff --git a/.idea/TankiGame.iml b/.idea/TankiGame.iml
new file mode 100644
index 0000000..f08604b
--- /dev/null
+++ b/.idea/TankiGame.iml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/.idea/editor.xml b/.idea/editor.xml
new file mode 100644
index 0000000..ddf3db3
--- /dev/null
+++ b/.idea/editor.xml
@@ -0,0 +1,345 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..0b76fe5
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..d965816
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,4 @@
+{
+ "C_Cpp.default.compileCommands": "${workspaceFolder}/cmake-build-debug/compile_commands.json",
+ "C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools"
+}
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..8dd7b48
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,41 @@
+cmake_minimum_required(VERSION 3.16)
+project(TanksGame LANGUAGES CXX)
+
+set(CMAKE_CXX_STANDARD 20)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_AUTORCC ON)
+set(CMAKE_AUTOUIC ON)
+
+find_package(Qt5 REQUIRED COMPONENTS Core Widgets Multimedia)
+
+add_executable(TanksGame
+ src/main.cpp
+ src/GameScene.cpp
+ src/GameModel.cpp
+ src/InputController.cpp
+ include/GameScene.h
+ include/GameModel.h
+ include/InputController.h
+ src/Bonus.cpp
+ src/Tank.cpp
+ src/TankView.cpp
+ src/EnemyTank.cpp
+ src/KamikazeEnemy.cpp
+ src/LightEnemy.cpp
+ src/HeavyEnemy.cpp
+ src/TwinShooterEnemy.cpp
+ src/Wall.cpp
+ src/BrickWall.cpp
+ src/Bullet.cpp
+ include/TankView.h
+)
+
+target_link_libraries(TanksGame PRIVATE
+ Qt5::Core
+ Qt5::Widgets
+)
+
+target_link_libraries(TanksGame PRIVATE Qt5::Multimedia)
+target_include_directories(TanksGame PUBLIC ${CMAKE_SOURCE_DIR}/include)
\ No newline at end of file
diff --git a/README.md b/README.md
index 8b13789..496bcac 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,25 @@
+# Tanks
+
+ игра «ТанкиNSU», написанная с использованием Qt5
+
+## Структура проекта
+- `include/` — все заголовочные файлы (.h)
+- `src/` — реализации (.cpp)
+- `CMakeLists.txt` — конфигурация сборки CMake
+
+
+## Краткая инструкция по сборке
+Требования:
+- C++ компилятор с поддержкой C++20
+- CMake >= 3.16
+- Qt5
+
+Сборка из корня проекта :
+
+```bash
+mkdir -p cmake-build-debug
+cd cmake-build-debug
+cmake ..
+cmake --build . --config Debug -- -j 4
+```
diff --git a/include/Bonus.h b/include/Bonus.h
new file mode 100644
index 0000000..f263c59
--- /dev/null
+++ b/include/Bonus.h
@@ -0,0 +1,31 @@
+#pragma once
+
+#include
+
+class GameScene;
+
+class Bonus : public QGraphicsEllipseItem {
+ public:
+ explicit Bonus(qreal x, qreal y, qreal w = 16.0, qreal h = 16.0);
+ ~Bonus() override = default;
+
+ virtual void Apply(GameScene* scene) = 0;
+};
+
+class HealthBonus : public Bonus {
+ public:
+ explicit HealthBonus(qreal x, qreal y);
+ void Apply(GameScene* scene) override;
+};
+
+class MineBonus : public Bonus {
+ public:
+ explicit MineBonus(qreal x, qreal y);
+ void Apply(GameScene* scene) override;
+};
+
+class ScoreBonus : public Bonus {
+ public:
+ explicit ScoreBonus(qreal x, qreal y);
+ void Apply(GameScene* scene) override;
+};
diff --git a/include/BrickWall.h b/include/BrickWall.h
new file mode 100644
index 0000000..9b64ea0
--- /dev/null
+++ b/include/BrickWall.h
@@ -0,0 +1,9 @@
+#pragma once
+#include
+
+class BrickWall : public QGraphicsPixmapItem {
+public:
+ BrickWall(qreal x, qreal y);
+ QRectF GetRect() const;
+ static constexpr int kDurability = 3;
+};
diff --git a/include/Bullet.h b/include/Bullet.h
new file mode 100644
index 0000000..f83719c
--- /dev/null
+++ b/include/Bullet.h
@@ -0,0 +1,26 @@
+#pragma once
+
+#include
+
+enum class Direction;
+enum class BulletOwner {
+ Player,
+ Enemy,
+};
+
+class Bullet final : public QGraphicsPixmapItem {
+public:
+ explicit Bullet(qreal x, qreal y, Direction direction, BulletOwner owner);
+
+ void Move();
+ Direction GetDirection() const;
+ BulletOwner GetOwner() const;
+ QRectF GetBoundingRect() const;
+
+private:
+ Direction m_direction;
+ BulletOwner m_owner;
+
+ static constexpr qreal kSpeed = 5.0;
+ static constexpr qreal kSize = 6.0;
+};
diff --git a/include/CloneFactory.hpp b/include/CloneFactory.hpp
new file mode 100644
index 0000000..fd37b5f
--- /dev/null
+++ b/include/CloneFactory.hpp
@@ -0,0 +1,44 @@
+#pragma once
+
+#include