Advertisement
ShadyLiar

simple_game

May 15th, 2024
590
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.35 KB | None | 0 0
  1. #include <iostream>
  2. #include <thread>
  3. #include <mutex>
  4. #include <vector>
  5. #include <chrono>
  6. #include <cstdlib>
  7. #include <atomic>
  8. #include <condition_variable>
  9. #include <windows.h> // Для использования функций Windows API для обработки ввода
  10.  
  11. using namespace std;
  12.  
  13. // Константы для настройки игры
  14. const int ROAD_WIDTH = 20;    // Ширина дороги
  15. const int ROAD_HEIGHT = 2;    // Высота дороги (количество полос)
  16. const char PLAYER_CHAR = 'P'; // Символ игрока
  17. const char OBSTACLE_CHAR = '#'; // Символ препятствия
  18. const char EMPTY_CHAR = ' ';    // Символ пустого места
  19. const int PLAYER_START_LANE = 0; // Начальная полоса игрока
  20.  
  21. class Game {
  22. public:
  23.     // Конструктор, инициализирующий состояние игры
  24.     Game() : gameOver(false), playerLane(PLAYER_START_LANE), score(0) {
  25.         road.resize(ROAD_HEIGHT, vector<char>(ROAD_WIDTH, EMPTY_CHAR)); // Инициализация дороги пустыми символами
  26.     }
  27.  
  28.     // Функция запуска игры
  29.     void run() {
  30.         // Запуск потоков для обработки ввода, рендеринга и управления препятствиями
  31.         thread inputThread(&Game::processInput, this);
  32.         thread renderThread(&Game::render, this);
  33.         thread obstaclesThread(&Game::processObstacles, this);
  34.  
  35.         // Ожидание завершения всех потоков
  36.         inputThread.join();
  37.         renderThread.join();
  38.         obstaclesThread.join();
  39.     }
  40.  
  41. private:
  42.     atomic<bool> gameOver;    // Флаг завершения игры
  43.     atomic<int> playerLane;   // Текущая полоса игрока
  44.     int score;                // Счет игры
  45.     vector<vector<char>> road; // Массив для хранения состояния дороги
  46.     mutex mtx;                // Мьютекс для синхронизации доступа к общим данным
  47.     condition_variable cv;    // Условная переменная для синхронизации
  48.  
  49.     // Функция обработки ввода пользователя
  50.     void processInput() {
  51.         while (!gameOver) {
  52.             // Проверка состояния клавиш W и S для управления игроком
  53.             if (GetAsyncKeyState('W') & 0x8000) {
  54.                 unique_lock<mutex> lock(mtx); // Блокировка мьютекса
  55.                 playerLane = max(playerLane - 1, 0); // Перемещение игрока вверх
  56.                 cv.notify_all(); // Уведомление всех ждущих потоков
  57.             }
  58.             if (GetAsyncKeyState('S') & 0x8000) {
  59.                 unique_lock<mutex> lock(mtx); // Блокировка мьютекса
  60.                 playerLane = min(playerLane + 1, ROAD_HEIGHT - 1); // Перемещение игрока вниз
  61.                 cv.notify_all(); // Уведомление всех ждущих потоков
  62.             }
  63.             this_thread::sleep_for(chrono::milliseconds(50)); // Небольшая задержка для уменьшения нагрузки на процессор
  64.         }
  65.     }
  66.  
  67.     // Функция рендеринга игры
  68.     void render() {
  69.         while (!gameOver) {
  70.             this_thread::sleep_for(chrono::milliseconds(100)); // Задержка для замедления рендеринга
  71.  
  72. #ifdef _WIN32
  73.             system("cls"); // Очистка консоли на Windows
  74. #else
  75.             system("clear"); // Очистка консоли на других платформах
  76. #endif
  77.  
  78.             unique_lock<mutex> lock(mtx); // Блокировка мьютекса
  79.  
  80.             // Отрисовка дороги и игрока
  81.             for (int i = 0; i < ROAD_HEIGHT; ++i) {
  82.                 for (int j = 0; j < ROAD_WIDTH; ++j) {
  83.                     if (i == playerLane && j == 1) {
  84.                         cout << PLAYER_CHAR; // Отрисовка игрока
  85.                     }
  86.                     else {
  87.                         cout << road[i][j]; // Отрисовка дороги
  88.                     }
  89.                 }
  90.                 cout << endl;
  91.             }
  92.  
  93.             // Отрисовка счета
  94.             cout << "Score: " << score << endl;
  95.         }
  96.     }
  97.  
  98.     // Функция обработки препятствий
  99.     void processObstacles() {
  100.         while (!gameOver) {
  101.             this_thread::sleep_for(chrono::milliseconds(500)); // Задержка для замедления движения препятствий
  102.  
  103.             unique_lock<mutex> lock(mtx); // Блокировка мьютекса
  104.  
  105.             // Перемещение препятствий влево
  106.             for (int i = 0; i < ROAD_HEIGHT; ++i) {
  107.                 for (int j = 0; j < ROAD_WIDTH - 1; ++j) {
  108.                     road[i][j] = road[i][j + 1]; // Перемещение препятствия на одну позицию влево
  109.                 }
  110.                 road[i][ROAD_WIDTH - 1] = EMPTY_CHAR; // Очистка последней колонки
  111.             }
  112.  
  113.             // Случайное добавление новых препятствий
  114.             if (rand() % 2 == 0) {
  115.                 road[rand() % 2][ROAD_WIDTH - 1] = OBSTACLE_CHAR; // Добавление препятствия в последнюю колонку
  116.             }
  117.  
  118.             // Проверка столкновений
  119.             if (road[playerLane][1] == OBSTACLE_CHAR) {
  120.                 gameOver = true; // Завершение игры при столкновении
  121.                 cout << "Game Over! Final Score: " << score << endl; // Вывод итогового счета
  122.                 return;
  123.             }
  124.  
  125.             score++; // Увеличение счета при успешном движении
  126.         }
  127.     }
  128. };
  129.  
  130. int main() {
  131.     srand(static_cast<unsigned>(time(nullptr))); // Инициализация генератора случайных чисел
  132.     Game game; // Создание экземпляра игры
  133.     game.run(); // Запуск игры
  134.     return 0;
  135. }
  136.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement