Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка рекурсивной функции, Вечный цикл 
:(
    Опции темы
ONLINEdever
  Дата 16.6.2012, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте! Пишу код игры сапёр, но в функции проверки почему-то получается вечный рекурсивный цикл.
Функция Calc_OpenFreeFields возвращает объект $innerArray но с открытыми клетками после нажатия.
$type может быть left - открытие ячейки, right - флажок
$innerArray и $bombArray - объекты вида 
Код

[0]=>
  [0]=>
  [1]=>
  [2]=>b
  [3]=>
  [4]=>
[1]=>
  [0]=>
  [1]=>
  [2]=>
  [3]=>
  [4]=>b
и т.п.

Буква b означает, что в ячейке бомба ($bombArray)
Буква f означает, что в ячейке флажок, n? означает, что в ячейке цифра ? ($innerArray)

Код

$bomb = 0;

function Calc_OpenFreeFields($innerArray,$bombArray,$x,$y,$type,$callback = false){
global $bomb;

$x = (int)$x;
$y = (int)$y;

if($type == 'left'){
//1
if($innerArray->$x->$y == 'd') return $innerArray; 

//2
$innerArray->$x->$y = 'd';

//3
$bomb = 0;
$chk_x = $x-1;
$chk_y = $y;
if(($bombArray -> $chk_x -> $chk_y) == 'b'){ $bomb++; }
$chk_x = $x-1;
$chk_y = $y-1;
if(($bombArray -> $chk_x -> $chk_y) == 'b'){ $bomb++; }
$chk_x = $x;
$chk_y = $y-1;
if(($bombArray -> $chk_x -> $chk_y) == 'b'){ $bomb++; }
$chk_x = $x+1;
$chk_y = $y;
if(($bombArray -> $chk_x -> $chk_y) == 'b'){ $bomb++; }
$chk_x = $x;
$chk_y = $y+1;
if(($bombArray -> $chk_x -> $chk_y) == 'b'){ $bomb++; }
$chk_x = $x+1;
$chk_y = $y+1;
if(($bombArray -> $chk_x -> $chk_y) == 'b'){ $bomb++; }
$chk_x = $x-1;
$chk_y = $y+1;
if(($bombArray -> $chk_x -> $chk_y) == 'b'){ $bomb++; }
$chk_x = $x+1;
$chk_y = $y-1;
if(($bombArray -> $chk_x -> $chk_y) == 'b'){ $bomb++; }

if($bomb > 0){ 
if($callback != true)
$innerArray->$x->$y = ('n'.(string)$bomb); 
}else{
$chk_x = $x-1;
$chk_y = $y;
if(($innerArray -> $chk_x -> $chk_y) == ''){ $innerArray = Calc_OpenFreeFields($innerArray,$bombArray,$chk_x,$chk_y,$type,true); if($bomb > 0){ $bomb = 0; return $innerArray; } }
$chk_x = $x-1;
$chk_y = $y-1;
if(($innerArray -> $chk_x -> $chk_y) == ''){ $innerArray = Calc_OpenFreeFields($innerArray,$bombArray,$chk_x,$chk_y,$type,true); if($bomb > 0){ $bomb = 0; return $innerArray; } }
$chk_x = $x;
$chk_y = $y-1;
if(($innerArray -> $chk_x -> $chk_y) == ''){ $innerArray = Calc_OpenFreeFields($innerArray,$bombArray,$chk_x,$chk_y,$type,true); if($bomb > 0){ $bomb = 0; return $innerArray; } }
$chk_x = $x+1;
$chk_y = $y;
if(($innerArray -> $chk_x -> $chk_y) == ''){ $innerArray = Calc_OpenFreeFields($innerArray,$bombArray,$chk_x,$chk_y,$type,true); if($bomb > 0){ $bomb = 0; return $innerArray; } }
$chk_x = $x;
$chk_y = $y+1;
if(($innerArray -> $chk_x -> $chk_y) == ''){ $innerArray = Calc_OpenFreeFields($innerArray,$bombArray,$chk_x,$chk_y,$type,true); if($bomb > 0){ $bomb = 0; return $innerArray; } }
$chk_x = $x+1;
$chk_y = $y+1;
if(($innerArray -> $chk_x -> $chk_y) == ''){ $innerArray = Calc_OpenFreeFields($innerArray,$bombArray,$chk_x,$chk_y,$type,true); if($bomb > 0){ $bomb = 0; return $innerArray; } }
$chk_x = $x-1;
$chk_y = $y+1;
if(($innerArray -> $chk_x -> $chk_y) == ''){ $innerArray = Calc_OpenFreeFields($innerArray,$bombArray,$chk_x,$chk_y,$type,true); if($bomb > 0){ $bomb = 0; return $innerArray; } }
$chk_x = $x+1;
$chk_y = $y-1;
if(($innerArray -> $chk_x -> $chk_y) == ''){ $innerArray = Calc_OpenFreeFields($innerArray,$bombArray,$chk_x,$chk_y,$type,true); if($bomb > 0){ $bomb = 0; return $innerArray; } }
}

//\3

}else if($type=='right'){
$innerArray->$x->$y = ($innerArray->$x->$y=='f'?'':'f');
}

if($callback != true)
$bomb = 0;

return $innerArray;

}


Никак не пойму, в чём проблема? smile 
PM MAIL   Вверх
Wolf1994
Дата 17.6.2012, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 5.10.2004

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



Цитата(ONLINEdever @  16.6.2012,  23:10 Найти цитируемый пост)
почему-то получается вечный рекурсивный цикл.


Потому что проверка на рекурсию находится внутри условия if($bomb > 0){ , а вызов функции в его else.
Код

if($bomb > 0){ 
if($callback != true)
$innerArray->$x->$y = ('n'.(string)$bomb); 
}else{
//...Calc_OpenFreeFields($innerArray,$bombArray,$chk_x,$chk_y,$type,true);...

PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

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


 




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


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

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