2014-01-06 4 views
0

Моя программа состоит из сетки, состоящей из 2D-массива. Пользовательский ввод удаляет определенные элементы сетки, оставляя пробелы. Моя проблема заключается в том, что элементы над пустыми пространствами выпадают.Применение силы тяжести: 2D-массивы

Оригинал У меня был массив, чтобы проверить, пустое ли место, а если оно пустое, элемент выше будет удален и воссоздан там, где раньше был пробел.

Моя проблема заключается в том, что массив, который я использовал для этого, был Left-> Right, Top-> Down (i ++, j ++), это оставляет мне проблему повторить весь код, чтобы получить новые построенные пробелы , (Например, если я удалю что-то из 3-й строки, вторая строка будет пустой, но я бы уже проверил вторую строку.

Так как это было бы очень неэффективно (в том числе ошибки перегрузки), я решил сделать резерв, bottom-> top, right-> left array (i -, j--), моя проблема заключается в том, что я получаю массив за пределами ошибки, хотя я убедился, что это невозможно для него чтобы выйти за пределы

Вот кусок кода, который дает неполадок

public static void dropBall(){ 
for (i =Settings.row-1;i>=0;i--){ 
    for (j =Settings.col-1;i>=0 ; j--){ 
    if (i <0||j<0)break; 
    if (Settings.grid[i+1][j]==666){ 
    //checking if the space below has the 666 ID (666 ID equals to blank)     
    Settings.grid[i+1][j]=Settings.grid[i][j]; //Deleting the current blank     
    } 
    } 
} 
} 

. Примечание: Settings.row and Settings.col подобны something.lenght, что означает, что они имеют длину сетки, хотя сетка начинается с 0.

Как избежать ошибки outofBounds в этой ситуации?

+1

_ "Settings.row [...] подобны something.lenght" _. Итак, вы начинаете 'i' на' length-1', и вы делаете 'grid [i + 1]'. Поэтому на первой итерации в вашем операторе if это эквивалентно 'grid [length] [j]'. Вот почему вы получаете это исключение. –

+0

Правда, я полностью забыл, что внизу нет ничего под собой, или, по крайней мере, ничто в упомянутом массиве – Oak

ответ

0
  • На Line3:

      for (j =Settings.col-1;i>=0 ; j--){ 
    

изменение:

   for (j =Settings.col-1;j>=0 ; j--){ 
  • и вы можете удалить if линию после того, как.

  • и начать i на Settings.row-2 вместо

  • попробовать это:

    public static void dropBall(){ 
        for (i =Settings.row-1;i>=0;i--){ 
         for (j =Settings.col-1;j>=0 ; j--){ 
          if (Settings.grid[i+1][j]==666){ 
           //checking if the space below has the 666 ID (666 ID equals to blank)     
           Settings.grid[i+1][j]=Settings.grid[i][j]; //Deleting the current blank     
           Settings.grid[i][j] = 666; 
          } 
         } 
        } 
    } 
    
+0

Это правда. В соответствии с инструкцией if я был несколько отстранен, поэтому я определил ограничения, чтобы предотвратить это , а третья строка 'i> = 0', скорее всего, из-за перехода с ++ на - (в 50-й раз), но, честно говоря, я ее не видел. В соответствии с началом 'i' в' Settings.row-2', настолько очевидным и простым, что я чувствую себя глупым, чтобы забыть это сделать, а вместо этого пытаюсь создать 50 строк для предотвращения одной ошибки. Большое спасибо за Вашу помощь. – Oak

0
  1. Старт со второго ряда на дне, а не с первого (так как не находится рядом ниже):

     for (i = Settings.row-2 ... // instead of row-1 
    
  2. Удалите эту строку (она избыточна):

     if (i <0||j<0)break; 
    
Смежные вопросы