Пока оставил параметры ширины и высоты поля фиксированными. Работает нормально.
Но моя версия игры лишь основа, которую стоит доработать. Просьба помочь с этим.
Требования:
1) Текущее состояние Вселенной выводится на консоль в виде таблицы из символов. Мёртвая клетка помечается символом "пробел", живая клетка помечается символом *.
2) На каждом шаге на консоль должно выводиться текущее состояние Вселенной, а также информация о номере поколения и количестве живых клеток на текущий момент.
3) При завершении игры на консоли должно присутствовать состояние Вселенной на момент окончания игры, номер поколения, количество живых клеток и причина завершения игры.
Причины:
1) Колония развивается (в случае дальнейшего роста количества живых клеток)
2) Колония умирает (в случае уменьшения количества клеток)
3) Колония погибла (в случае конца игры по причине отсутствия живых клеток)
4) Колония стагнирует (в случает отсутствия изменений)
Но моя версия игры лишь основа, которую стоит доработать. Просьба помочь с этим.
Требования:
1) Текущее состояние Вселенной выводится на консоль в виде таблицы из символов. Мёртвая клетка помечается символом "пробел", живая клетка помечается символом *.
2) На каждом шаге на консоль должно выводиться текущее состояние Вселенной, а также информация о номере поколения и количестве живых клеток на текущий момент.
3) При завершении игры на консоли должно присутствовать состояние Вселенной на момент окончания игры, номер поколения, количество живых клеток и причина завершения игры.
Причины:
1) Колония развивается (в случае дальнейшего роста количества живых клеток)
2) Колония умирает (в случае уменьшения количества клеток)
3) Колония погибла (в случае конца игры по причине отсутствия живых клеток)
4) Колония стагнирует (в случает отсутствия изменений)
C++:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <chrono>
#include <thread>
const int width = 40; // параметр ширины поля
const int height = 40; // параметр высоты поля
using Board = int[width][height]; // сокращение для удобства
void fill_rand(Board board) {
std::srand(std::time(nullptr));
for (int i = 0; i < width; ++i) {
for (int j = 0; j < height; ++j) {
if (rand() % 10 == 0) {
board[i][j] = 1; // живая клетка
}
else {
board[i][j] = 0; // мертвая клетка
}
}
}
}
void print(Board board) {
for (int i = 0; i < width; ++i) {
for (int j = 0; j < height; ++j) {
if (board[i][j] == 1) { // Проверка на жизнь
std::cout << "*"; // Если жива, то *
}
else {
std::cout << " "; // Если мертва, то пробел
}
}
std::cout << std::endl;
}
}
void copy(Board src, Board dst) {
for (int i = 0; i < width; ++i) {
for (int j = 0; j < height; ++j) {
dst[i][j] = src[i][j]; // копия прошлого поколения
}
}
}
int get_x(int i) {
return(width + i) % width;
}
int get_y(int j) {
return(height + j) % height;
}
void step(Board board) {
Board prev; // предыдущее состояние
copy(board, prev);
for (int i = 0; i < width; ++i) {
for (int j = 0; j < height; ++j) {
/*(i - 1, j - 1) (i - 1, j) (i - 1, j + 1)
(i, j - 1) (i, j) (i, j + 1)
(i + 1, j - 1) (i + 1, j) (i + 1, j + 1)*/
int counter_neighbors = 0;
counter_neighbors += prev[get_x(i - 1)][get_y(j - 1)]; // верхняя левая
counter_neighbors += prev[get_x(i - 1)][get_y(j)]; // верхняя центральная
counter_neighbors += prev[get_x(i - 1)][get_y(j + 1)]; // верхняя правая
counter_neighbors += prev[get_x(i)][get_y(j - 1)]; // средняя левая
counter_neighbors += prev[get_x(i)][get_y(j + 1)]; // средняя правая
counter_neighbors += prev[get_x(i + 1)][get_y(j - 1)]; // нижняя левая
counter_neighbors += prev[get_x(i + 1)][get_y(j)]; // нижняя центральная
counter_neighbors += prev[get_x(i + 1)][get_y(j + 1)]; // нижняя правая
if ((prev[i][j] == 0) && (counter_neighbors == 3)) {
board[i][j] = 1; // описал условия задачи
}
else if ((counter_neighbors < 2) || (counter_neighbors > 3)) {
board[i][j] = 0;
}
}
}
}
int main() {
Board board;
fill_rand(board);
for (int k = 0; k < 100; ++k) {
print(board);
step(board);
std::this_thread::sleep_for(std::chrono::milliseconds(200));
std::system("cls");
}
return 0;
}