Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Xonix. Зависание. 
:(
    Опции темы
GHOST32
Дата 29.5.2013, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 5.5.2013

Репутация: нет
Всего: нет



Пишу игру Xonix на DevCpp. Игрок должен бегать по полю и отсекать его участки. Поле состоит из клеток, каждой клетке соответствует ячейка двумерного массива. В данный момент я застрял на этапе заливки поля. Алгоритм такой: сначала делим линией поле на 2 части, сравниваем их с помощью рекурсивной функции, а затем закрашиваем меньшую часть опять же с помощью рекурсивной функции.

Выглядит примерно так:

поле вначале
000000
000000
000000
000000

разделили поле на две части
000000
001111
001000
001000

закрасили часть
000000
002222
002222
002222

Проблема в том, что после деления поля линией программа зависает. Возможно проблема в функции, которая считает количество клеток в выделенной части поля.

Код

int CountMass(int Arr[][50], int i, int j)
{
 int x=0; //счетчик клеток
 if(Arr[i][j]==0) //если клетка не закрашена и не выделена
 {
  Arr[i][j]=3  //присваиваем любое значение, чтобы не посчитали повторно
  x++; 
  //уходим в 4 направления
  x += CountMass(Arr,i+1,j);  
  x += CountMass(Arr,i-1,j);
  x += CountMass(Arr,i,j+1);
  x += CountMass(Arr,i,j-1);
  Arr[i][j]=0; // присваиваем изначальное значение клетке, которой присвоили значение 3
 }
 return x; //возвращаем результат
}


Где может быть ошибка?
PM MAIL   Вверх
feodorv
Дата 29.5.2013, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(GHOST32 @  29.5.2013,  20:10 Найти цитируемый пост)
Где может быть ошибка? 

Я же Вам уже намекал, что нужно учитывать границы матрицы:
Цитата(feodorv @  22.5.2013,  00:14 Найти цитируемый пост)
    if( i+1 < MSIZE ) CountMass( i+1, j, Arr, pn);
    if( i > 0 ) CountMass( i-1, j, Arr, pn);
    if( j+1 < MSIZE ) CountMass( i, j+1, Arr, pn);
    if( j > 0 ) CountMass( i, j-1, Arr, pn);




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
GHOST32
Дата 29.5.2013, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 5.5.2013

Репутация: нет
Всего: нет



Цитата(feodorv @ 29.5.2013,  19:34)
Цитата(GHOST32 @  29.5.2013,  20:10 Найти цитируемый пост)
Где может быть ошибка? 

Я же Вам уже намекал, что нужно учитывать границы матрицы:
Цитата(feodorv @  22.5.2013,  00:14 Найти цитируемый пост)
    if( i+1 < MSIZE ) CountMass( i+1, j, Arr, pn);
    if( i > 0 ) CountMass( i-1, j, Arr, pn);
    if( j+1 < MSIZE ) CountMass( i, j+1, Arr, pn);
    if( j > 0 ) CountMass( i, j-1, Arr, pn);

Нет, дело не в границах.

Изначально поле выглядит так.

222222222222
222222222222
220000000022
220000000022
220000000022
220000000022
220000000022
222222222222
222222222222

0 - не закрашенная клетка, 2 закрашенная клетка.

PM MAIL   Вверх
feodorv
Дата 30.5.2013, 05:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(GHOST32 @  29.5.2013,  23:40 Найти цитируемый пост)
Нет, дело не в границах.

Хорошо, пусть границы Вы задали явно, хотя здесь это не очевидно:
Цитата(GHOST32 @  29.5.2013,  20:10 Найти цитируемый пост)
поле вначале
000000
000000
000000
000000



От повторной рекурсии для данного поля Вы всё же не свободны:
Цитата(GHOST32 @  29.5.2013,  20:10 Найти цитируемый пост)
 Arr[i][j]=0; // присваиваем изначальное значение клетке, которой присвоили значение 3

Клетка или посчитана, или нет. Присваивая обратно 0, Вы её делаете снова неподсчитанной и непройденной. 



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1143 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.