В общем коротко о сути проблемы:
Приспичило мне написать консольную версию Сапёра на C++ 5.02
Все хорошо, кроме одного:
В оригинале, когда открываешь пустую клетку - открываются все соседние пустые клетки вплоть до клеток с цифрами. Коряво объяснил - но суть, уверен, понятна.
Это легче всего в мозгу мне приходит в голову в виде рекурсии.
читать дальше
Чтобы не разбираться с нахождением на краю или в углу поля я увеличил его размеры со всех четырех сторон. То есть вместо поля 9х9 получилось 11х11 (это все обозначается как статический двумерный целочисленный массив).
По моей задумке - это должно было лишить меня проблем.
Более того НОВЫМ границам я задал значения в каждой ячейке равными 11 (пустая клетка соответственно - 0, мина - 9, а все остальные - количество мин.)
Извините, я не знаю спец. сайтов для "подсветки" - если дадите ссылку - буду признателен.
На тот, что сверху написан я зашел. Но к моему стыду я не разобрался что там да как...
Поэтому вот это вот - та рекурсия, которую я написал:
void rek(y,x)
{
c[y][x]=a[y][x]+48; //открываю текущую клетку.
if(c[y][x]=='0') // если она пустая, то выполняю следующее.
{
if(a[y][x-1]==0)
rek(y,x-1);
else
c[y][x-1]=a[y][x-1]+48; // проверяю - пустая ли клетка сбоку - если да - тогда закидываю ее координаты в рекурсивную ф-ию. если нет - просто открываю ее.
if(a[y-1][x]==0)
rek(y-1,x);
else
c[y-1][x]=a[y-1][x]+48;
if(a[y+1][x]==0)
rek(y+1,x);
else
c[y+1][x]=a[y+1][x]+48;
if(a[y][x+1]==0)
rek(y,x+1);
else
c[y][x+1]=a[y][x+1]+48;
if(a[y-1][x+1]==0)
rek(y-1,x+1);
else
c[y-1][x+1]=a[y-1][x+1]+48;
if(a[y+1][x-1]==0)
rek(y+1,x-1);
else
c[y+1][x-1]=a[y+1][x-1]+48;
if(a[y+1][x+1]==0)
rek(y+1,x+1);
else
c[y+1][x+1]=a[y+1][x+1]+48;
if(a[y-1][x-1]==0)
rek(y-1,x-1);
else
c[y-1][x-1]=a[y-1][x-1]+48;
}
}
Так она вызывается в программе:
if(f=='x' && a[y][x]!=9) // f - переменная char. 'x' - элемент управления, так сказать (открытие поля). То есть: "Открыв поле, если там не мина."
{
rek(y,x); // х, у - координаты на поле.
gotoxy(1,1);
Output(); // это просто вывод массива.
gotoxy(x,y);
}
Так вот сама проблема. При запуске выдается сообщение такого рода: Thread stopped и бла-бла-бла.
Как быдто я выхожу за размер масива...
Причем такая ошибка только если у меня в рекурсивной ф-ии идет проверка ПРОТИВОПОЛОЖНЫХ от начальной клетки ячеек.
то есть например - вышее ее и ниже. (если например выше и правее, в верхнем левом углу и верхнем правом углу - тогда работает).
В общем вопрос - как это можно исправить.
Не обязательно код - можно просто подкинуть идею.
Заранее спасибо.