Задать вопрос
@66demon666
Сетевой админ, АТС-админ

Как правильно залить область и избежать переполнения стека?

Доброй ночи! Если вратце - делаю сапёр, точнее уже всё сделал кроме одной фишечки. А именно, открытие всех пустых клеток, располагающихся рядом, заливка своего рода. Поле представлено двумерным массивом. Написал вот такой код
fillEmptyCells(x, y) {
                    //верхний левый угол
                    this.field[x][y].isOpen = true;
                    if (((x - 1) >= 0) && ((y - 1) >= 0)) {
                        if (this.field[x-1][y-1].bombsNear == 0) {
                            this.field[x-1][y-1].isOpen = true;
                            this.fillEmptyCells(x-1,y-1);
                        }
                    }
                    //верхний правый угол
                    if (((x + 1) < this.height) && ((y - 1) >= 0)) {
                        if (this.field[x+1][y-1].bombsNear == 0) {
                            this.field[x+1][y-1].isOpen = true;
                            this.fillEmptyCells(x+1,y-1);
                        }
                    }
                    //верхний кубик
                    if (((y - 1) >= 0)) {
                        if (this.field[x][y-1].bombsNear == 0) {
                            this.field[x][y-1].isOpen = true;
                            this.fillEmptyCells(x,y-1);
                        }
                    }

                    //нижний левый угол
                    if (((x - 1) >= 0) && ((y + 1) < this.width)) {
                        if (this.field[x-1][y+1].bombsNear == 0) {
                            this.field[x-1][y+1].isOpen = true;
                            this.fillEmptyCells(x-1,y+1);
                        }
                    }
                    //нижний правый угол
                    if (((x + 1) < this.height) && ((y + 1) < this.width)) {
                        if (this.field[x+1][y+1].bombsNear == 0) {
                            this.field[x+1][y+1].isOpen = true;
                            this.fillEmptyCells(x+1,y+1);
                        }
                    }
                    //нижний кубик
                    if (((y + 1) < this.width)) {
                        if (this.field[x][y+1].bombsNear == 0) {
                            this.field[x][y+1].isOpen = true;
                            this.fillEmptyCells(x,y+1);
                        }
                    }
                    //Слева
                    if (((x - 1) >= 0)) {
                        if (this.field[x-1][y].bombsNear == 0) {
                            this.field[x-1][y].isOpen = true;
                            this.fillEmptyCells(x-1,y);
                        }
                    }
                    //Справа
                    if (((x + 1) < this.height)) {
                        if (this.field[x+1][y].bombsNear == 0) {
                            this.field[x+1][y].isOpen = true;
                            this.fillEmptyCells(x+1,y);
                        }
                    }
                },


То есть проверяем все окружающие клетки. При таком подходе я получаю переполнение стека. На бесконечную рекурсию не похоже, да и на маленьком поле глубина рекурсии должна быть не такой уж и большой. Подскажите, пожалуйста, как избежать, или как правильно сделать. Заранее спасибо!
  • Вопрос задан
  • 58 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
PavelK
@PavelK
Здравствуйте.
У Вас бесконечная, потому что запускается, да же если клетка уже была "открыта".
Думаю, стоит добавить условие в начале:
if ( this.field[x][y].isOpen ) { return; }
this.field[x][y].isOpen = true;

а в остальном коде убрать <>.isOpen = true;

И как-то странно, что X у Вас соответствует height... Чуть мозг себе не сломал.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы