Помогите пожалуйста понять в чем проблема?

Пишу игру "жизнь" нужно чтобы пользователь выбирал автоматически заполнять вселенную или ему самому решать. Для инициализации Вселенной должен использоваться текстовый файл. Файл имеет структуру: первые два числа — это количество строк и количество столбцов в сетке Вселенной. Затем идёт информация о распределении живых клеток. Распределение состоит из неопределённого количества пар чисел, где каждая пара состоит из номера строки и номера столбца живой клетки. У меня в коде не получается реализовать... Не ругайте сильно, недавно начал изучать)

#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


Ответы (0 шт):