/
AirLexa
/
origin
Обзор
Документация
Войти
/
AirLexa
/
origin
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
Races/Races.cpp
154 строки
6 KB
AirLexa
исправление гонок
22 дек 2025, 15:41
22 дек 2025, 15:41
d5e0fdc
Код
Авторство
О чём код?
#include <iostream> #include <windows.h> #include "Dlib_1/TC.h" #include "Dlib_2/Util.h" std::string get_name_tc(TC** tc_arr, int(&tc)[7], bool all) { std::string s = ""; if (tc[0] < 0) return s; // нет ТС в массиве int i = 0; for (; i < 7; i++) { if (!all && (i == 6 || tc[i + 1] < 0)) return tc_arr[tc[i]]->get_name(); if (all && tc[i] < 0) return s; if (all) s.append(i > 0 ? ", " : "").append(tc_arr[tc[i]]->get_name()); } return s; } int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); // массив транспортных средств участвующих в гонке TC** tc_arr = new TC * [7] { new GroundTC("Верблюд", 10, 30), new GroundTC("Верблюд - быстроход", 40, 10), new GroundTC("Кентавр", 15, 8), new GroundTC("Ботинки - вездеходы", 6, 60), new AirTC("Ковёр - самолёт", 10), new AirTC("Орёл", 8), new AirTC("Метла", 20) }; int type = 0, dist = 0; bool is_run = true; std::string s_types[3] = { "Гонка для наземного транспорта.", "Гонка для воздушного транспорта.", "Гонка для наземного и воздушного транспорта." }; std::cout << "Добро пожаловать в гоночный симулятор!" << std::endl; while (is_run) // главный цикл игры { std::cout << "1. " << s_types[0] << std::endl; std::cout << "2. " << s_types[1] << std::endl; std::cout << "3. " << s_types[2] << std::endl; std::cout << "Введите тип гонки: "; std::cin >> type; type--; std::cout << "Укажите расстояние (положительное число) "; std::cin >> dist; std::cout << "Должно быть зарегистрировано как минимум 2 транспорта!\n" << std::endl; int reg_tc[7] = { -1, -1, -1, -1, -1, -1, -1 }; // тут будут зарегистрированные ТС int sel = -1; // переменная выбора действия while (sel != 0) // выборы делаем пока не 0 { std::string s = get_name_tc(tc_arr, reg_tc, false); // тут имя крайней регистрации ТС if (!s.empty()) std::cout << s << ": успешная регистрация!" << std::endl; // была регистрация, показываем ее std::cout << s_types[type] << " Расстояние: " << dist << std::endl; if (reg_tc[0] >= 0) // если уже зарегистрировано хотя бы одно ТС, показываем список std::cout << "Зарегистрированные ТС: " << get_name_tc(tc_arr, reg_tc, true) << std::endl; int tc[7] = { -1, -1, -1, -1, -1, -1, -1 }; // тут будут ТС из текущего списка int n = 0; // счетчик номеро у пунктов текущего списка for (int i = 0; i < 7; i++) // всего 7 ТС { if (type == 0 && tc_arr[i]->is_air_tc()) continue; // пропускаем воздуцшные ТС if (type == 1 && !tc_arr[i]->is_air_tc()) continue; // пропускаем наземные ТС tc[n] = i; // запоминаем какое ТС под каким номером в текущем списке n++; std::cout << n << ". " << tc_arr[i]->get_name() << std::endl; } // если уже зарегистрировано 2 и более ТС if (reg_tc[1] >= 0) std::cout << "0. Начать гонку!" << std::endl; // то вкл пункт старта std::cout << "Выберите действие: "; std::cin >> sel; // проверки на корректность введенного действия if (sel > n || sel < 0 || sel == 0 && reg_tc[1] < 0) { std::cout << "Нет такого действия!\n" << std::endl; sel = -1; continue; } if (sel != 0) // это не начало игры, записываем зарегистрированное ТС for (int i = 0; i < 7; i++) { if (reg_tc[i] == tc[sel - 1]) // если такой транспорт уже имеется { std::cout << "Такой транспорт уже зарегистрирован!\n"; break; } if (reg_tc[i] < 0) // первая свободная от ТС ячейка { reg_tc[i] = tc[sel - 1]; // регистрируем ТС break; } } std::cout << std::endl; } // старт игры! std::cout << "Результаты гонки:\n"; float time_tc[7] = { -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f }; // тут будет время по ТС for (int i = 0; i < 7; i++) { if (reg_tc[i] < 0) break; time_tc[i] = get_time( // записываем время в массив reg_tc[i], tc_arr[reg_tc[i]]->get_v(), tc_arr[reg_tc[i]]->get_dt(), dist); } for (int i = 1; i < 7; ++i) // сортировка по времени for (int j = i; j > 0; --j) if (time_tc[j] < time_tc[j - 1]) { if (time_tc[j] < 0) continue; // отрицательные числа не меняем float f_tmp = time_tc[j]; time_tc[j] = time_tc[j - 1]; time_tc[j - 1] = f_tmp; int i_tmp = reg_tc[j]; reg_tc[j] = reg_tc[j - 1]; reg_tc[j - 1] = i_tmp; } for (int i = 0; i < 7; i++) // выводим на экран результат { if (reg_tc[i] < 0) break; std::cout << (i + 1) << ". " << tc_arr[reg_tc[i]]->get_name(); std::cout << ". Время: " << time_tc[i] << std::endl; } std::cout << "\n0. Закончить игру.\n"; std::cout << "1. Провести еще одну гонку." << std::endl; std::cout << "Выберите действие : "; std::cin >> sel; is_run = sel != 0; // если не 0, продолжаем игру std::cout << std::endl; } for (int i = 0; i < 7; i++) delete tc_arr[i]; delete[] tc_arr; return 0; }