2013-07-07 3 views
2

Я разрабатываю игру «Minesweeper» для Andoid на Java, и у меня есть проблема при открытии ячеек. Как убедиться, что я нажимаю на ячейку, открытую рядом с пустыми ячейками? (Как это делается в Miner для Windows). Введение: У меня есть массив, который я получаю из потока сокетов bluetooth. Массив так:Алгоритм Android Minesweeper

1 9 1 0 
1 1 1 0 
0 0 0 0 
0 0 0 0 

9-кладезь 0-это пустая ячейка подсчитывать 1-Ближайшая мин

После того, что я вычислить игровое поле

функции
array = Model.getGameField(); 
int size = array.length; 
for (int i = 0; i < size; i++) 
for (int j = 0; j < size; j++) 
{ 
    ((TableRow) table.getChildAt(i)).getChildAt(j).setTag(array[i][j] + ""); 
} 

OnClick:

if (iWantToSetFlag == 0) 
       { 
        tmpBtn = ((Button) v); 
        if (!(tmpBtn.getTag().equals("9"))) 
        { 
         OpenButtons(tmpBtn.getId()/10,  tmpBtn.getId() % 10); 
         recreateTable(); 
        } 
        else 
         startLose(); 
      } 
      else 
      { 
       if (((Button) v).getText().equals("M")) 
        ((Button) v).setText(""); 
       else 
        ((Button) v).setText("M"); 
      } 

У меня есть функция

private void OpenButtons(int x, int y) 
    { 
     array[x][y] = -1; 
        for (int k = -1; k < 2; k++) 
     { 
      for (int k1 = 1; k1 >= -1; k1--) 
      { 
        if (x + k >= 0 && x + k < array.length && y - k1 >= 0 && y - k1 < array[x + k].length) 
         if (array[x + k][y - k1] == 0) 
          OpenButtons(x + k, y - k1); 
      } 
     } 

    } 

, которые рекурсивно открывают ячейки, но у меня есть ошибка StackOverFlow. Помоги пожалуйста.

+2

'«... рекурсивно открытые клетки, но у меня есть ошибки StackOverflow Помогите пожалуйста..»' - которые, как правило, для меня значит, что у вас есть проблемы с остановкой условия в рекурсии. –

+3

Кстати, игнорирование индекса массива за пределами границ - плохая идея; очень, *** очень *** плохая идея. –

+0

Но я не игнорирую это. –

ответ

2

Вы должны называть свой рекурсию с измененными параметрами:

if (array[x + k][y - k1] == 0) 
    OpenButtons(x + k, y - k1); 

И, конечно же, как уже было упомянуто в комментариях к вопросу, вы должны проверить массив ограничивает себя вместо того, чтобы просто игнорируя исключения :

if (x + k >= 0 && x + k < array.length && 
    y - k1 >= 0 && y - k1 < array[x + k].length) { ... 

положить перед вашим другом if -clause будет проверять только поля, которые на самом деле существуют. Избавление от вашего злонамеренного пустого try-catch.


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

private void OpenButtons(int x, int y) { 
    Queue<Point> toOpen = new LinkedBlockingQueue<>(); 
    toOpen.add(new Point(x, y)); 
    array[x][y] = -1; 
    while (!toOpen.isEmpty()) { 
     Point p = toOpen.poll(); 
     x = p.x; 
     y = p.y; 
     for (int k = -1; k < 2; k++) { 
      for (int k1 = 1; k1 >= -1; k1--) { 
       if (x + k >= 0 && x + k < array.length && y - k1 >= 0 
         && y - k1 < array[x + k].length) 
        if (array[x + k][y - k1] == 0) { 
         array[x + k][y - k1] = -1; 
         toOpen.add(new Point(x + k, y - k1)); 
        } 
      } 
     } 
    } 
} 
+0

Теперь я понимаю, насколько глупым был мой вопрос. :) Спасибо! –

+0

Я меняю свой код, но Exception все еще бросает. –

+0

Возможно, я не выхожу из рекурсии. но как выйти из него? –