2017-01-01 2 views
0

Я пишу тронный твитер на Яве, и у меня были некоторые проблемы с частью, в которой подсчитывается количество бомб. По какой-то причине, либо некоторые клетки обнаруживают дополнительные бомбы, либо вообще не имеют бомб (даже странно, некоторые клетки работают нормально). Может ли кто-нибудь помочь? Благодаря!minesweeper окружающие мины работает в половину времени

примечание: key[][] является int[][] массив, который записывает местоположение бомб, обозначенный как 9.

0 представляет собой пустое пространство

int count представляет количество бомб, которые находятся в 8 клеток, окружающих каждый клетки (именно поэтому у меня есть 8 примерка задвижки петли для учета пограничных клеток)

пса: простите за плохое форматирование

EDIT: Я понял, где моя проблема была (я назвал i дважды). Любые предложения относительно того, как я мог сделать этот код более простым и эффективным?

private void numberSet() { 

    int count = 0; 
    for (int i = 0; i < key.length; i++) { 
     for (int a = 0; a < key[0].length; a++) { 

      if (key[i][a] == 0) { 

       try { 
        if (key[i + 1][a] == 9) { 
         count++; 
        } 

       } catch (java.lang.ArrayIndexOutOfBoundsException e) { 
        continue; 
       } 
       try { 
        if (key[i - 1][a] == 9) { 
         count++; 
        } 

       } catch (java.lang.ArrayIndexOutOfBoundsException e) { 
        continue; 
       } 
       try { 
        if (key[i][a + 1] == 9) { 
         count++; 
        } 

       } catch (java.lang.ArrayIndexOutOfBoundsException e) { 
        continue; 
       } 
       try { 
        if (key[i][a - 1] == 9) { 
         count++; 
        } 

       } catch (java.lang.ArrayIndexOutOfBoundsException e) { 
        continue; 
       } 
       try { 
        if (key[i + 1][a + 1] == 9) { 
         count++; 
        } 

       } catch (java.lang.ArrayIndexOutOfBoundsException e) { 
        continue; 
       } 
       try { 
        if (key[i - 1][a + 1] == 9) { 
         count++; 
        } 

       } catch (java.lang.ArrayIndexOutOfBoundsException e) { 
        continue; 
       } 
       try { 
        if (key[i + 1][a - 1] == 9) { 
         count++; 
        } 

       } catch (java.lang.ArrayIndexOutOfBoundsException e) { 
        continue; 
       } 
       try { 
        if (key[i - 1][i - 1] == 9) { 
         count++; 

        } 

       } catch (java.lang.ArrayIndexOutOfBoundsException e) { 
        continue; 
       } 
       key[i][a] = count; 
      } 
      count = 0; 
     } 
    } 

} 
+5

Я чувствую, что вам следует избавиться от всех блоков try/catch. Он должен быть закодирован таким образом, что индекс массива за пределами границ не может произойти, и если он все еще произойдет *, то * вы хотите, чтобы возникло исключение, чтобы программа взрывалась, и вы знаете, что не указали ее правильно. –

+1

небольшой отзыв о фрагментах кода: если вы не используете его уже, получите себе подходящую IDE - например IntelliJ https://www.jetbrains.com/idea/download/ - и используйте «Reformat Code», чтобы привести свой код в хорошей форме, перед тем, как вставить его в форум или в StackOverflow. Если ваш код легче читать, люди с большей вероятностью помогут вам. –

+0

как тест, чтобы увидеть, является ли i или a 0 первым? –

ответ

2

Я бы серьезно подумал о том, чтобы полностью отказаться от того, как вы это делаете. Когда я начал писать код, я тоже сделал игру с тральщиком, и я сделал то, что вы делали. После нескольких ревизий я смог поместить все это в несколько циклов. Я попытался достаточно прокомментировать в своем коде, чтобы рассказать вам, что делает каждая строка. Этот код не проверен, поэтому, вероятно, он не будет работать сразу, чтобы быть полностью честным. Тем не менее, я просмотрел его несколько раз, и похоже, что это сработает со мной. Я предлагаю вам взять этот код и попытаться заставить его работать. Попробуйте.

//For every Cell on the board 
for (int i = 0; i < key.length; i++){ 
    for (int a = 0; a < key[0].length; a++){ 

     //If it Is not a mine 
     if (key[i][a] == 0){ 
      int count = 0; 

      //Position of cells around key[i][a] relative to key[i][a] 
      for (int x = -1; x < 2; x++){ 
       for (int y = -1; y < 2; y++){ 

        //Storing x and y test points 
        int testX = i + x;//testX = i-1, i, and i+1 
        int testY = i + y;//testY = i-1, y, and y+1 

        //If the testX and testY values are within the range of the array 
        if ((testX >= 0 && testX < key[0].length) && testY >= 0 && testY < key.length){ 

         //If there is a mine 
         if (key[testX][testY] == 9){ 
          count++; 
         } 
        } 
       } 
      } 

      key[i][a] = count; 

      //count = 0; This is redundant. Line 7 count gets set to 0. 
     } 
    } 
} 
+0

Кстати, если у вас есть какие-либо вопросы по вышеуказанному коду, не стесняйтесь спрашивать –

+0

кажется, что приращения на счетчике не доходят до конца петель –

+0

Вы полностью право, мое плохое. @Brian Lee Я исправил эту часть.Все еще не может обещать, что это работает. –

2

Похоже, вы злоупотребляя continue заявление, оно будет двигаться назад к выполнению цикла for и, следовательно, не выполнить различные проверки, чтобы увеличить count.

В заявках catch вы ничего не должны делать.

+0

Это правда. Если вы удалите все свои «продолжения», вы, вероятно, будете в порядке. –

1
if(key[i-1][i-1] == 9){ 

Это похоже на все ваши другие, у которых есть я и. Этот использует i дважды. Может, это твоя проблема?

+0

А может быть, вы должны использовать цикл for или что-то еще, поэтому вы не повторяете в основном одно и то же 8 раз. Вот как может произойти такая ошибка. –

+0

OH я не видел этого –

Смежные вопросы