Игра жизни не печатается правильно. Переполнение стека

У меня есть некоторый код для игры в жизнь, который принимает входные данные пользователей и отображает эти входные данные относительно того, какие ячейки они вводили как живые, но он всегда печатает строку из четырех *, несмотря ни на что. Я возился с изменением вещей по-разному, но он либо печатает одно и то же, либо ничего не отображает. Я провел поиск по нескольким форумам и веб-сайтам, но каждый код, который я нахожу, сделан совершенно по-другому, чего я и ожидал (включая код из stackoverflow).

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

using namespace std;

#include <memory.h>

int main ()
{
const long MaxCols (10);
const long MaxRows (10);
const time_t WaitTime (3);

bool Board [MaxRows + 2] [MaxCols + 2];
long CurrCol;
long CurrRow;
time_t StopTime;
long Generation;
long OriginalArray[MaxRows][MaxCols];
long NewArray[MaxRows][MaxCols];
long Neighbors;

do
{
cout << "Enter a row and col for the living cell: ";
cin >> CurrRow >> CurrCol;
} while (CurrRow != 0 && CurrCol != 0);

for (Generation = 1; ; Generation++)
{

//Display the current generation on the board
system("cls");
cout << "\tCurrent Generation: " << Generation << endl;
for (CurrRow = 1; CurrRow <= MaxRows; CurrRow++)
{
for (CurrCol = 1; CurrCol <= MaxCols; CurrCol++)
cout << (Board [CurrRow + 2] [CurrCol + 2] ? ' ' : '*');
cout << endl;
}
//Loop to determine nieghbors
for(CurrRow=1; CurrRow <= MaxRows + 2; CurrRow++)
{
cout << endl;
for (CurrCol = 1; CurrCol <= MaxCols + 2; CurrCol++)
{
if (OriginalArray[CurrRow][CurrCol] == '*')
{
Neighbors = (OriginalArray, CurrRow, CurrCol);
if (Neighbors != 3 || Neighbors != 4 )
NewArray[CurrRow][CurrCol] = ' ';
else
NewArray[CurrRow][CurrCol] = '*';
}
else
{
Neighbors = (OriginalArray, CurrRow, CurrCol);
if (Neighbors != 2 || Neighbors != 3 )
NewArray[CurrRow][CurrCol] = ' ';
else
NewArray[CurrRow][CurrCol] = '*';
}
cout << "Touch any key to halt the program";
StopTime = time(0) + WaitTime; // time(0) gives the number of seconds since Jan 1, 1970
while (time (0) < StopTime)     // keep looping until the current time catches the stop time
if (_kbhit())               //true if the user has hit a key, false if not hit a key
{
cout << "\nBye" << endl;
exit(0);
}
else;
}
}
}
}

-1

Решение

Бездельничать — это не способ отладки программы. Когда он не ведет себя так, как вы ожидаете, ваш первый шаг должен попытаться понять, почему. Делая то, что, на вашем уровне опыта, в основном будет случайным изменением вашего кода, вы только ухудшите ситуацию. Как упоминал Оли, отладчик — лучший инструмент для этого. Вы должны научиться использовать свои.

Глядя на код, возможно, есть много ошибок, но одна ошибка выскакивает у меня, это

Neighbors = (OriginalArray, CurrRow, CurrCol);

Я понятия не имею, почему вы думаете, что это будет считать количество соседей, но поверьте мне, это не так. Я полагаю, вы сделали предположение, а затем, когда компилятор не пожаловался, вы предположили, что предположение было правильным. Боюсь, что нет.

Так что на этом немного сконцентрироваться. Вам нужен новый код для подсчета количества живых соседей. Подумай об этом.

Там нет кода выше для ввода значений в Совет. Вот некоторый код для этого. Это правильно, насколько это возможно, но это не значит, что он будет работать с остальной частью вашего кода, который нуждается много работы.

// baord uses false for dead cells and true for living cells
bool Board [MaxRows + 2] [MaxCols + 2];

// initially make the whole board dead
for (int i = 0; i < MaxRows + 2; ++i)
for (int j = 0; j < MaxCols + 2; ++j)
Baord[i][j] = false;

// now ask the user for some live cells
for (;;)
{
cout << "Enter a row and col for the living cell (0 0 to quit): ";
int i, j;
cin >> i >> j;
if (i == 0 && j == 0)
break; // user entered 0 0 so quit loop
Board[i][j] = true; // set position i,j to live
}

Две части, которые отсутствовали в вашем коде, первоначально устанавливали мертвую всю доску, а во-вторых, когда вы получили координаты для живой ячейки от пользователя, вы ничего не сделали, чтобы эта ячейка работала.

Еще одна вещь, которая меня смущает в вашем коде — это то, что у вас доски разных размеров

    bool Board [MaxRows + 2] [MaxCols + 2];
long OriginalArray[MaxRows][MaxCols];
long NewArray[MaxRows][MaxCols];

Почему Правление имеет + 2 а другие нет. Это не имеет смысла для меня.

1

Другие решения

Других решений пока нет …