Помогите пожалуйста понять в чем проблема?
Пишу игру "жизнь" нужно чтобы пользователь выбирал автоматически заполнять вселенную или ему самому решать. Для инициализации Вселенной должен использоваться текстовый файл. Файл имеет структуру: первые два числа — это количество строк и количество столбцов в сетке Вселенной. Затем идёт информация о распределении живых клеток. Распределение состоит из неопределённого количества пар чисел, где каждая пара состоит из номера строки и номера столбца живой клетки. У меня в коде не получается реализовать... Не ругайте сильно, недавно начал изучать)
#include <unistd.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
// Объявляем размер поля и обозначения клеток
const int N = 100;
const int M = 100;
const char ALIVE = '*';
const char NONE = ' ';
void initFromFileOrManual(char* P, const std::string& filename) {
std::ifstream file(filename);
if (file.is_open()) {
int numRows, numCols;
file >> numRows >> numCols;
for (int i = 0; i < numRows; i++) {
for (int j = 0; j < numCols; j++) {
P[i * numCols + j] = NONE;
}
}
int row, col;
while (file >> row >> col) {
P[row * numCols + col] = ALIVE;
}
file.close();
std::cout << "Вселенная успешно инициализирована из файла." << std::endl;
} else {
std::cout << "Ошибка открытия файла." << std::endl;
}
int manualChoice;
std::cout << "Желаете ввести данные вручную? (1 - Да, 0 - Нет): ";
std::cin >> manualChoice;
if (manualChoice) {
int numRows, numCols;
std::cout << "Введите количество строк и столбцов: ";
std::cin >> numRows >> numCols;
for (int i = 0; i < numRows; i++) {
for (int j = 0; j < numCols; j++) {
int cellChoice;
std::cout << "Введите значение ячейки (" << i << ", " << j << "): ";
std::cin >> cellChoice;
P[i * numCols + j] = (cellChoice == 0) ? NONE : ALIVE;
}
}
std::cout << "Вселенная успешно инициализирована вручную." << std::endl;
}
}
void initpole(char* P) {
for (int i = 0; i < N * M; ++i) P[i] = NONE;
P[4 * N + 10] = NONE; P[4 * N + 11] = ALIVE; P[4 * N + 12] = ALIVE;
P[5 * N + 10] = ALIVE; P[5 * N + 11] = ALIVE; P[5 * N + 12] = NONE;
P[6 * N + 10] = NONE; P[6 * N + 11] = ALIVE; P[6 * N + 12] = NONE;
}
void Pokaz_pole(char* P, int generation) {
int count = 0;
for (int i = 0; i < M; ++i) {
for (int j = 0; j < N; ++j) {
std::cout << P[i * N + j] << ".";
if (P[i * N + j] == ALIVE) count++;
}
std::cout << std::endl;
}
std::cout << "Поколение: " << generation << std::endl;
std::cout << "Количество клеток: " << count << std::endl;
}
void Zapis_Fail(const char* P, int generation) {
std::ofstream file;
file.open("generation_" + std::to_string(generation) + ".txt");
if (file.is_open()) {
for (int i = 0; i < M; ++i) {
for (int j = 0; j < N; ++j) {
file << P[i * N + j];
}
file << std::endl;
}
file.close();
std::cout << "Файл успешно записан." << std::endl;
}
else {
std::cout << "Ошибка открытия файла." << std::endl;
}
}
int getlinecell(char* P, int i, int j) {
// Определение количества живых соседей
int count = 0;
for (int m = i - 1; m <= i + 1; ++m) {
for (int n = j - 1; n <= j + 1; ++n) {
if (m >= 0 && m < M && n >= 0 && n < N && !(m == i && n == j) && P[m * N + n] == ALIVE) {
count++;
}
}
}
return count;
}
bool boolgoto(char* P) {
char P2[N * M];
for (int i = 0; i < N * M; ++i) {
P2[i] = P[i];
}
for (int i = 0; i < M; ++i) {
for (int j = 0; j < N; ++j) {
int n = getlinecell(P, i, j);
if (P[i * N + j] == NONE && n == 3) {
P2[i * N + j] = ALIVE;
}
if (P[i * N + j] == ALIVE && (n < 2 || n > 3)) {
P2[i * N + j] = NONE;
}
}
}
bool finish = true;
for (int i = 0; i < N * M; ++i) {
if (P[i] != P2[i]) {
finish = false;
break;
}
}
if (finish) {
return true;
}
for (int i = 0; i < N * M; ++i) {
P[i] = P2[i];
}
return false;
}
int main() {
char P[N * 40 * M * 20];
std::string filename = "universe.txt"; // имя файла для инициализации
initFromFileOrManual(P, filename);
cout << "***Добро пожаловать в программу, цель которой - смоделировать жизнь клеток.***" << endl << endl;
cout << "Правила:" << endl;
cout << "1. Клетка выживает, если и только если она имеет двух или трех соседей из восьми возможных" << endl;
cout << "2. Если у клетки только один сосед или вовсе ни одного, она погибает в изоляции.";
cout << "3. Если клетка имеет четырех или больше соседей, она погибает от перенаселения." << endl;
cout << "4. В любой пустой позиции, у которой ровно три соседа, в следующем поколении появляется новая клетка." << endl << endl;
cout << "Для ввода поколения: " << endl;
cout << "Поставьте . , чтобы было пустое пространство;" << endl;
cout << "Поставьте * , чтобы была живая клетка." << endl << endl;
cout << "Задайте первое поколение." << endl << endl;
cout << "Требуется ввести " << M << " столбца и " << N << " строки игрового поля:" << endl << endl;
void init_world();
char P[N * M];
initpole(P);
bool finish = false;
int generation = 0;
do {
Pokaz_pole(P, generation);
finish = boolgoto(P);
sleep(1);
generation++;
} while (!finish);
return 0;
}
https://replit.com/@andrejkozyrev17/CandidFrozenMaintenance#main.cpp