Инициализировать ссылочные переменные для многих объектов? - PullRequest
4 голосов
/ 16 октября 2010

У меня небольшие проблемы с построением сетки для игры «Морской бой» для моего класса Java.До сих пор я мог легко сделать цикл for для добавления объектов JPanel или JButton в JFrame.Однако моя проблема в том, что мне нужно будет снова использовать эти панели или кнопки при игре (например, нажав кнопку, чтобы увидеть, поставил ли ваш противник корабль на этом поле и т. Д.)Есть ли простой способ в Java для инициализации ссылочных переменных для большого количества объектов?Или мне придется декларировать их все по отдельности?

Ответы [ 4 ]

5 голосов
/ 16 октября 2010

Вы можете попробовать многомерный массив JPanels (или любой другой объект). Создайте массив того же размера, что и ваша сетка. Строка ниже инициализирует массив из 5 строк и 5 столбцов.

JPanel[][] battleField = new JPanel[5][5];

Используйте вложенные циклы for для создания панелей в массиве.

for (int rowIndex = 0; rowIndex < battleField.length; rowIndex++)
{
    for (int cellIndex = 0; cellIndex < battleField[rowIndex]; cellIndex++)
    {
         battleField[rowIndex][cellIndex] = new JPanel();
    }
}

Если позже вы захотите сослаться на массив battleField, вы просто превратите его в переменную экземпляра.

4 голосов
/ 16 октября 2010

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

HashMap<JButton, Point> buttonMap = new HashMap<JButton, Point>();

for (int x = 0; x < COLUMNS; x++)
{
  for (int y = 0; y < ROWS; y++)
  {
     JButton btn = new JButton();
     btn.addActionListener(this);
     buttonMap.put(btn, new Point(x, y));
     //then add the button to your container
  }
}

В вашем методе actionPerformed вы можете преобразовать кнопку в точку, в которой она расположена следующим образом.

JButton btn = (JButton)actionEvent.getSource();
Point p = buttonMake.get(btn);

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

2 голосов
/ 16 октября 2010

Для справки: соответствующая игра , в которой используется сетка кнопок.Этот связанный ответ демонстрирует применение шаблона Model-View-Controller к простой игре.

2 голосов
/ 16 октября 2010

Вы всегда можете расширить JButton, чтобы отслеживать необходимую информацию. Простой пример:

class MyButton extends JButton{
    private MyGameInfo mygameInfo;
    private int buttonId;
    //More fields....
    //Getters/Setters
}

Затем вместо создания и добавления JButton объектов в ваш макет создайте MyButton объекты (который также является JButton, поэтому ваш макет не будет изменен) и используйте его дополнительные функции для игровой логики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...