Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <thread>
- #include <mutex>
- #include <vector>
- #include <chrono>
- #include <cstdlib>
- #include <atomic>
- #include <condition_variable>
- #include <windows.h> // Для использования функций Windows API для обработки ввода
- using namespace std;
- // Константы для настройки игры
- const int ROAD_WIDTH = 20; // Ширина дороги
- const int ROAD_HEIGHT = 2; // Высота дороги (количество полос)
- const char PLAYER_CHAR = 'P'; // Символ игрока
- const char OBSTACLE_CHAR = '#'; // Символ препятствия
- const char EMPTY_CHAR = ' '; // Символ пустого места
- const int PLAYER_START_LANE = 0; // Начальная полоса игрока
- class Game {
- public:
- // Конструктор, инициализирующий состояние игры
- Game() : gameOver(false), playerLane(PLAYER_START_LANE), score(0) {
- road.resize(ROAD_HEIGHT, vector<char>(ROAD_WIDTH, EMPTY_CHAR)); // Инициализация дороги пустыми символами
- }
- // Функция запуска игры
- void run() {
- // Запуск потоков для обработки ввода, рендеринга и управления препятствиями
- thread inputThread(&Game::processInput, this);
- thread renderThread(&Game::render, this);
- thread obstaclesThread(&Game::processObstacles, this);
- // Ожидание завершения всех потоков
- inputThread.join();
- renderThread.join();
- obstaclesThread.join();
- }
- private:
- atomic<bool> gameOver; // Флаг завершения игры
- atomic<int> playerLane; // Текущая полоса игрока
- int score; // Счет игры
- vector<vector<char>> road; // Массив для хранения состояния дороги
- mutex mtx; // Мьютекс для синхронизации доступа к общим данным
- condition_variable cv; // Условная переменная для синхронизации
- // Функция обработки ввода пользователя
- void processInput() {
- while (!gameOver) {
- // Проверка состояния клавиш W и S для управления игроком
- if (GetAsyncKeyState('W') & 0x8000) {
- unique_lock<mutex> lock(mtx); // Блокировка мьютекса
- playerLane = max(playerLane - 1, 0); // Перемещение игрока вверх
- cv.notify_all(); // Уведомление всех ждущих потоков
- }
- if (GetAsyncKeyState('S') & 0x8000) {
- unique_lock<mutex> lock(mtx); // Блокировка мьютекса
- playerLane = min(playerLane + 1, ROAD_HEIGHT - 1); // Перемещение игрока вниз
- cv.notify_all(); // Уведомление всех ждущих потоков
- }
- this_thread::sleep_for(chrono::milliseconds(50)); // Небольшая задержка для уменьшения нагрузки на процессор
- }
- }
- // Функция рендеринга игры
- void render() {
- while (!gameOver) {
- this_thread::sleep_for(chrono::milliseconds(100)); // Задержка для замедления рендеринга
- #ifdef _WIN32
- system("cls"); // Очистка консоли на Windows
- #else
- system("clear"); // Очистка консоли на других платформах
- #endif
- unique_lock<mutex> lock(mtx); // Блокировка мьютекса
- // Отрисовка дороги и игрока
- for (int i = 0; i < ROAD_HEIGHT; ++i) {
- for (int j = 0; j < ROAD_WIDTH; ++j) {
- if (i == playerLane && j == 1) {
- cout << PLAYER_CHAR; // Отрисовка игрока
- }
- else {
- cout << road[i][j]; // Отрисовка дороги
- }
- }
- cout << endl;
- }
- // Отрисовка счета
- cout << "Score: " << score << endl;
- }
- }
- // Функция обработки препятствий
- void processObstacles() {
- while (!gameOver) {
- this_thread::sleep_for(chrono::milliseconds(500)); // Задержка для замедления движения препятствий
- unique_lock<mutex> lock(mtx); // Блокировка мьютекса
- // Перемещение препятствий влево
- for (int i = 0; i < ROAD_HEIGHT; ++i) {
- for (int j = 0; j < ROAD_WIDTH - 1; ++j) {
- road[i][j] = road[i][j + 1]; // Перемещение препятствия на одну позицию влево
- }
- road[i][ROAD_WIDTH - 1] = EMPTY_CHAR; // Очистка последней колонки
- }
- // Случайное добавление новых препятствий
- if (rand() % 2 == 0) {
- road[rand() % 2][ROAD_WIDTH - 1] = OBSTACLE_CHAR; // Добавление препятствия в последнюю колонку
- }
- // Проверка столкновений
- if (road[playerLane][1] == OBSTACLE_CHAR) {
- gameOver = true; // Завершение игры при столкновении
- cout << "Game Over! Final Score: " << score << endl; // Вывод итогового счета
- return;
- }
- score++; // Увеличение счета при успешном движении
- }
- }
- };
- int main() {
- srand(static_cast<unsigned>(time(nullptr))); // Инициализация генератора случайных чисел
- Game game; // Создание экземпляра игры
- game.run(); // Запуск игры
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement