diff --git a/source/application/BobBuilder/GameBuilders.cpp b/source/application/BobBuilder/GameBuilders.cpp
index 02cbf052d8a5f8939e05a35e35221e11b1629236..72fa274ffa790b377d3d54a8042e94ff1566887c 100644
--- a/source/application/BobBuilder/GameBuilders.cpp
+++ b/source/application/BobBuilder/GameBuilders.cpp
@@ -16,7 +16,7 @@ void CommonBuilder::create_context(float static_objects_ratio, float dynamic_obj
     for (auto& row : m_rooms)
         for (auto& room : row)
             if (room != nullptr)
-                empty_rooms_buffer.emplace_back(room);
+                empty_rooms_buffer.emplace_back(room.get());
     ///> в рандомное место располагаем пакмана
     float id = std::rand() % empty_rooms_buffer.size();
     m_context.pacman.set_location(empty_rooms_buffer[id]);
@@ -70,12 +70,11 @@ void CommonBuilder::create_state(IStateManager &state_manager, const sf::VideoMo
  * @brief Созданный лабиринт и контекст назначаем созданному состоянию игры GameState
  */
 void CommonBuilder::set_all_to_state() {
-    std::vector<Room*> rooms;
+    std::vector<std::unique_ptr<Room>> rooms;
     for (auto& row : m_rooms)
         for (auto& col : row)
-            rooms.emplace_back(col);
-    Maze maze(rooms);
-    m_game_state->set_maze(std::move(maze)); ///> назначаем лабиринт
+            rooms.emplace_back(std::move(col));
+    m_game_state->set_maze(Maze(rooms)); ///> назначаем лабиринт
     m_game_state->set_context(std::move(m_context));
 }
 
@@ -99,11 +98,11 @@ void SimpleBuilder::create_rooms() {
     int room_size = static_cast<int>(m_room_size);
     sf::Vector2f left_pos = sf::Vector2f{ config::MENU_WIDTH, (m_height - m_room_size * rows + m_room_size)/2};
     for (int row = 0; row < rows * room_size; row += room_size) {
-        std::vector<Room*> row_vec;
+        std::vector<std::unique_ptr<Room>> row_vec;
         for (size_t col = 0; col < cols * room_size; col += room_size) {
-            Room* room = new Room(m_room_size);
+            std::unique_ptr<Room> room = std::make_unique<Room>(m_room_size);
             room->set_position({config::MENU_WIDTH + col, row + left_pos.y});
-            row_vec.emplace_back(room);
+            row_vec.emplace_back(std::move(room));
         }
         m_rooms.emplace_back(std::move(row_vec));
     }
@@ -144,9 +143,9 @@ void ComplexBuilder::create_rooms() {
     auto starting_point = sf::Vector2f{config::MENU_WIDTH, (m_height - m_room_size*room_quantity_row)/2 + + m_room_size/2};
 
     for (int row = 0; row < room_quantity_row * room_size; row += room_size) {
-        std::vector<Room*> vector_row;
+        std::vector<std::unique_ptr<Room>> vector_row;
         for (int col = 0; col < room_quantity_col * room_size; col += room_size) {
-            auto room = new Room(m_room_size);
+            auto room = std::make_unique<Room>(m_room_size);
             room->set_position(sf::Vector2f {(col + starting_point.x), (row + starting_point.y)});
             vector_row.emplace_back(std::move(room));
         }
diff --git a/source/application/BobBuilder/GameBuilders.h b/source/application/BobBuilder/GameBuilders.h
index f14164be34a79df92ad921b8cb5ab5fe11428ef6..c1708c2106f2acdd029bff7587d65fbba01e5285 100644
--- a/source/application/BobBuilder/GameBuilders.h
+++ b/source/application/BobBuilder/GameBuilders.h
@@ -19,7 +19,7 @@ protected:
     float m_width;
     float m_height;
     float m_room_size;
-    std::vector<std::vector<Room*>> m_rooms;
+    std::vector<std::vector<std::unique_ptr<Room>>> m_rooms;
     GameContext m_context;
     std::unique_ptr<GameState> m_game_state;
 };
diff --git a/source/application/Drawable/Entity/Pacman.h b/source/application/Drawable/Entity/Pacman.h
index e01c0cfc92cbddd700a03c19bd70fe8d176c2e55..446f726d1f38208dfe8c5b8665f04eb3e861f541 100644
--- a/source/application/Drawable/Entity/Pacman.h
+++ b/source/application/Drawable/Entity/Pacman.h
@@ -16,6 +16,8 @@ public:
     void move(Room::Direction direction);
     void prepare_for_drawing() override;
     void set_lives() { m_lives = 3;}
+    bool is_active() { return is_second;}
+    void set_active() { is_second = true;}
     void draw_into(sf::RenderWindow& window) override;
     std::unique_ptr<IGameEvent> visit(Food* ptr_entity) override;
     std::unique_ptr<IGameEvent> visit(Enemy* ptr_entity) override;
@@ -30,4 +32,5 @@ private:
     sf::Sound m_sound;
     MyTexture* m_ptr_texture;
     bool m_second_player = false;
+    bool is_second = false;
 };
diff --git a/source/application/Drawable/Maze/Maze.h b/source/application/Drawable/Maze/Maze.h
index e833b0243cbdd434bacba40843f54645925b9770..bb2faa71b7b29b1c751626b9967926e100584c31 100644
--- a/source/application/Drawable/Maze/Maze.h
+++ b/source/application/Drawable/Maze/Maze.h
@@ -30,10 +30,10 @@ public:
 class Maze: public IDrawable {
 public:
     Maze() = default;
-    explicit Maze(std::vector<Room*>& rooms) : m_rooms(rooms) {};
+    explicit Maze(std::vector<std::unique_ptr<Room>>& rooms) : m_rooms(std::move(rooms)) {};
     void draw_into(sf::RenderWindow& m_window) override;
 private:
-    std::vector<Room*> m_rooms;
+    std::vector<std::unique_ptr<Room>> m_rooms;
 };
 
 ///стена, которая хранит в себе информацию о том в какой комнате находится
diff --git a/source/application/Event/IGameEvent.cpp b/source/application/Event/IGameEvent.cpp
index 90c2073e8a73f9d1164f5eba3e782ba35a6f9009..88181e53e77e282a569ce3fa08ed89f0cee9ba09 100644
--- a/source/application/Event/IGameEvent.cpp
+++ b/source/application/Event/IGameEvent.cpp
@@ -44,7 +44,7 @@ void PacmanLoseLifeEvent::handle(GameContext *context) {
     pacman_lose_life.lose_life();
 
     if (pacman_lose_life.died()) {
-        if (context->pacman.died() && !m_second_player && context->pacman2.get_lives() == 3)
+        if (context->pacman.died() && !context->pacman2.is_active())
             context->state = GameContext::LOST;
         if (context->pacman.died() && context->pacman2.died())
             context->state = GameContext::LOST;
@@ -69,6 +69,6 @@ SwampEvent::SwampEvent(Room* swamp_location) : m_swamp_location(swamp_location)
 void SwampEvent::handle(GameContext* context) {
     if (context->pacman.get_lives() > 0)
         context->pacman.set_lives();
-    if (context->pacman2.get_lives())
+    if (context->pacman2.get_lives() > 0)
         context->pacman2.set_lives();
 }
diff --git a/source/application/State/GameState.cpp b/source/application/State/GameState.cpp
index 2dd5d4b31dff07351fa9ba201e17c00b8927424f..703ffcdb3ed6f1ff42fd2939a740693c56966b37 100644
--- a/source/application/State/GameState.cpp
+++ b/source/application/State/GameState.cpp
@@ -106,6 +106,7 @@ void GameState::update() {
         if (ptr_event)  game_events.emplace_back(std::move(ptr_event));
 
         if (context.pacman2.get_location() != nullptr) {
+            context.pacman2.set_active();
             IVisitor* ptr_visitor2 = &(context.pacman2);
             auto ptr_event2 = ptr_entity->accept(ptr_visitor2);
             if (ptr_event2)  game_events.emplace_back(std::move(ptr_event2));