2015-11-17 2 views
0

Я использую 2d-массив, как карту, у меня есть уставка x и y, и мне нужно проверить окружающие области (+1) для трех объектов, пищи, объекта и пространства. Я думал об использовании карты [x + 1] [y + 1], как показано ниже, однако мне пришлось бы повторять этот статус много раз.проверка массива java

if (map[x+1][y+1] == Item.O) 
{ 
    System.out.println("Object is in the way."); 
} 

if (map[x+1][y+1] == Item.F) 
{ 
    System.out.println("Food is in the way."); 
} 

Есть ли другой способ сделать это, я знаю, что есть инструкция switch, но я не думаю, что это сработает. Любая помощь будет оценена :)

+0

'Item' является' enum'? –

+0

Да, извините, забыл добавить это. – Logic

+2

Похоже, вам просто нужен вложенный цикл для этого, чтобы перейти от x-1 к x + 1 и y-1 к y + 1, просто убедитесь, что пропустили (x, y), если необходимо, – phflack

ответ

4

Принято считать, что Item является enum, вы можете действительно использовать switch заявление:

switch(map[x+1][y+1]) { 
    case Item.O : System.out.println("Object is in the way."); break; 
    case Item.F : System.out.println("Food is in the way."); break; 
    ... 
} 

Однако гораздо более гибкое решение будет не хранить enum в массиве , а реальные объекты, которые реализуют общий интерфейс, который предоставляет необходимые методы. Затем реализуйте разные классы, которые реализуют различное поведение ваших объектов.

Иерархия классов может выглядеть следующим образом:

interface PrintText { 
    void printText(); 
} 

class Food implements PrintText { 
    public void printText() { 
     System.out.println("Food is in the way."); 
    } 
} 

class SomeObject implements PrintText { 
    public void printText() { 
     System.out.println("Object is in the way."); 
    } 
} 

Вы можете инициализировать массив, похожий на этот:

// initialize array 
PrintText[][] map = new PrintText[WIDTH][HEIGHT]; 
map[0][0] = new Food(); 
map[0][1] = new SomeObject(); 
... 

А позже вызывать метод так, без какой-либо switch или if заявление - полиморфизм заботится об этом:

// call the method 
map[x+1][y+1].printText(); 

На боковой ноте не используйте необработанные массивы. Вместо этого используйте класс коллекции, например ArrayList.

+0

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

+0

Спасибо, перечисление и предметы были такой болью, я вижу, как я могу добавить это в свой код :) – Logic

+2

Рад, если это помогло :) Ваша проблема просто ** вызывает ** для использования полиморфизма для реализации различного поведения продуктов питания и другие объекты в разных классах с некоторым общим интерфейсом - при этом вы всегда можете добавить другие объекты в более позднее время с низким воздействием на существующий код –

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