Проверка влево / вправо в массиве int для Tetris, Android / Java - PullRequest
0 голосов
/ 22 января 2012

Я пытаюсь сделать тетрис для андроида, чтобы помочь освоить программирование игр для андроида. Мой goLeft / Rights нарушает право при нажатии кнопки, код для перехода влево находится в классе, отдельном от массива полей int и массива частей списка. Доступ к массиву полей осуществляется с помощью ссылочной переменной (TetrisWorld tetrisworld;). В то время как массив списка деталей является общедоступным, доступ к нему осуществляется через код переменной (части), для которого есть код goLeft (). Разрывается в: if (tetrisworld.fields [x] [part.y]! = 0) Код для левого:

public void goLeft() {
    int x = 0;
    for(int i = 0; i < 4; i++) {
        TetrisParts part = parts.get(i);
        x = part.x - 1;
        if(tetrisworld.fields[x][part.y] != 0) {
            noleft = true;
            break;
        }
    }
    if(noleft == false) {
        for(int i = 0; i < 4; i++) {
            TetrisParts part = parts.get(i);
            part.x--;
        }
    }
}

Код поля массива int:

int fields[][] = new int[WORLD_WIDTH][WORLD_HEIGHT];

WORLD_WIDTH и WORLD_HEIGHT - это конечные статические целые, ширина 9 и высота 19

Я попытался поставить if (tetrisworld.fields [0] [0] == 0), и он все еще падает, поэтому я не думаю, что это связано с переменными. Кроме того, он не выходит за пределы, даже если я еще не добавил код, чтобы проверить это, потому что у меня появляется тероид вокруг x = 5, и так как я не могу идти влево / вправо, как только у меня нет шансов на это случается

Я пытался переместить методы goLeft / Right в класс игрового экрана, который имеет "world = TetrisWorld ();" и он все еще глючит в том же месте

UPDATE:

Хорошо, просто добавив:

tetrisworld != null

к первому, если оператор исправил это, мой вопрос теперь, почему это исправило это? Почему я не могу двигаться без этой проверки? Насколько я знаю, это явно не пустая причина; теперь он полностью отзывчив.

Но более простой способ решить эту проблему, который прост в SOOOO, - это поменять fields на статический ... и получить к нему доступ, например: TetrisWorld.fields, поэтому мой обновленный код:

public void goLeft()
  {
  noleft = false;
  for (int i = 0; i < 4; i++)
     {
     part = parts.get(i);
     if (part.x - 1 < 0 || TetrisWorld.fields[part.x - 1][part.y] != 0)
        {
        noleft = true;
        break;
        }
     }
  if (noleft == false)
     {
     for (int i = 0; i < 4; i++)
        {
        part = parts.get(i);
        part.x--;
        }
     }
  }

Ответы [ 3 ]

0 голосов
/ 23 января 2012

Похоже, вы получаете java.lang.NullPointerException при попытке доступа к массиву в tetrisworld.В строке, которую вы упоминаете, есть несколько способов, которыми это может произойти:

if(tetrisworld.fields[x][part.y] != 0) {
  1. tetrisworld может быть нулевым.
  2. Член fields tetrisworld может бытьnull.
  3. Второй массив, который вы ищите с помощью tetrisworld.fields[x].
  4. Значение part может быть нулевым.

Наличиебыстрый просмотр вашего исходного кода, мне кажется, что вы никогда не инициализируете tetrisworld, либо при объявлении с использованием:

TetrisWorld tetrisworld = new TetrisWorld();

, либо в каком-то другом месте, которое наверняка произошло до того, как ваш метод goLeft()называется.

0 голосов
/ 29 января 2012

Хорошо, я думаю, что нашел ответ, ссылаясь на: http://en.wikipedia.org/wiki/Null_Object_pattern

Очевидно, java сгенерирует NPE, если вы сначала не проверите его, если у вас нулевая ссылка? Есть ли способ инициализировать его без выполнения TetrisWorld tetrisworld = new TetrisWorld();, потому что он уже создан в другом классе, поэтому я получаю тысячу ошибок, фактическое переполнение стека! Lul ... Все еще не на 100% положительно. Пожалуйста, прокомментируйте, чтобы проверить и, возможно, предложить лучший способ сделать это.

0 голосов
/ 22 января 2012

Похоже, вы нажали IndexOutOfBoundsException.

Когда вы делаете x = part.x - 1;, ваша переменная x может стать меньше tan tan, поэтому ваш код будет действовать как if(tetrisworld.fields[-1][part.y] != 0

...