/
Mihail05
/
ProjectworkLife1
Обзор
Документация
Войти
/
Mihail05
/
ProjectworkLife1
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
1
198 строк
7 KB
Mihail05
update 1
30 янв 2026, 17:14
Верифицирован
30 янв 2026, 17:14
c89cd74
Код
Авторство
О чём код?
#include <iostream> #include <chrono> // для замедленния потока #include <thread> // #include <fstream> // для файла bool** create_empty_map(int rows, int cols); bool read_map_from_file(std::string filename, bool**& out_grid, int& rows, int& cols); void print_map(bool** arr, int rows, int cols); void print_field_with_stats(char** arr, int width, int height, int generation, int stars_count); int check_neighbors(int x, int y, int width, int height, char** field); void game_of_life(char** arr, int width, int height); int get_x(int i, int width); int get_y(int j, int height); const int width = 10; const int height = 10; bool** create_empty_map(int rows, int cols) { bool** arr = new bool* [rows]; // цикл по строкам for (int i = 0; i < rows; i++) { arr[i] = new bool[cols] {false}; } return arr; } bool read_map_from_file(std::string filename, bool**& out_grid, int& rows, int& cols) { std::ifstream file(filename); //проверить на ошибку открытия if (file.fail()) { std::cout << "Error opening file!\n"; return false; } //Считываем строки и столбцы file >> rows >> cols; //Создаём массив out_grid = create_empty_map(rows, cols); //считываем все живые клетки и проставляем в карту while (file.good()) { int i, j; // координаты живой из файла file >> i >> j; //Проверяем выход за границы массива if ((i < 0) || (i >= rows) || (j < 0) || (j >= cols)) { std::cout << "Error coordinates: " << i << " " << j << "\n"; return false; } // НАЗНАЧАЕМ ЖИВОЙ out_grid[i][j] = true; } //возвращаем успех, хорошо считали файл return true; } //печать поля void print_map(bool** arr, int rows, int cols) { for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { std::cout << (arr[i][j] ? "*" : "-") << " "; } std::cout << '\n'; } std::cout << '\n'; } int main() { setlocale(LC_ALL, "rus"); bool** grid = nullptr; // Объявление массива для хранения картинок int rows, cols; bool ok_read = read_map_from_file("in.txt", grid, rows, cols); if (!ok_read) { return 1; } char** arr = new char* [width]; for (int i = 0; i < width; ++i) { arr[i] = new char[height] {'-'}; } // Заполнение * arr[1][1] = '*'; arr[1][2] = '*'; arr[2][2] = '*'; arr[3][2] = '*'; arr[1][3] = '*'; arr[2][3] = '*'; arr[0][1] = '*'; arr[2][0] = '*'; arr[2][1] = '*'; arr[2][2] = '*'; arr[7][3] = '*'; arr[7][4] = '*'; arr[7][5] = '*'; // запускаем игру Жизни print_field_with_stats(arr, width, height, 1, 3); game_of_life(arr, width, height); // очистка памяти for (int i = 0; i < width; ++i) { delete[] arr[i]; } delete[] arr; return 0; } void print_field_with_stats(char** arr, int width, int height, int generation, int stars_count) { std::cout << "Generation: " << generation << " Alive cells: " << stars_count << "\n\n"; for (int i = 0; i < width; ++i) { // Выводим поле и показываем статистику for (int j = 0; j < height; ++j) { std::cout << arr[i][j] << ' '; } std::cout << '\n'; } std::cout << "\n"; std::this_thread::sleep_for(std::chrono::seconds(1)); //замедленяем на одну секунду } // Основная игра void game_of_life(char** arr, int width, int height) { bool changed = true; // пока истино программа работает int generation = 0; // переменная нужна для счёта генераций while (changed && generation < 100) { // ограничиваем максимальное количество поколений char** next_gen = new char* [width]; for (int i = 0; i < width; ++i) { next_gen[i] = new char[height] {'-'}; } int stars_count = 0; changed = false; for (int i = 0; i < width; ++i) { for (int j = 0; j < height; ++j) { int neighbors = check_neighbors(i, j, width, height, arr); if (arr[i][j] == '*' && (neighbors < 2 || neighbors > 3)) { next_gen[i][j] = '-'; // умирает из-за одиночества или перенаселённости меньше 2 или более 3 } else if (arr[i][j] == '-' && neighbors == 3) { next_gen[i][j] = '*'; // рождается новая звезда если 3 клетки рядом changed = true; } else { next_gen[i][j] = arr[i][j]; // остается неизменной } if (next_gen[i][j] == '*') { stars_count++; // считаем звезды, если = *, то увеличиваем переменную } } } print_field_with_stats(next_gen, width, height, ++generation, stars_count); // освобождаем старую версию поля for (int i = 0; i < width; ++i) { delete[] arr[i]; } delete[] arr; arr = next_gen; // используем новое поле } } int get_x(int i, int width) { return (width + i) % width; } // используем эти функции для закольцовывания стлобца int get_y(int j, int height) { return (height + j) % height; } int check_neighbors(int x, int y, int width, int height, char** field) { int count = 0; for (int dx = -1; dx <= 1; ++dx) { // Проверяем соседние клетки for (int dy = -1; dy <= 1; ++dy) { if ((dx != 0 || dy != 0)) { // пропускаем саму клетку int nx = (x + dx + width) % width; int ny = (y + dy + height) % height; if (field[nx][ny] == '*') { count++; } } } } return count; }