2010-10-15 3 views
4

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

+0

Не шутите, и у него есть достойные ответы на предыдущие вопросы ... движение вперед. – andersoj

+0

Кроме того, рассмотрите ответы на голосование, которые вы сочтете полезными. – trashgod

+0

Сделаю, извините за несоблюдение надлежащего этикета. Теперь, когда я это имею в виду, я буду следить за ним более внимательно. –

ответ

5

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

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

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

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

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

+0

Является ли расположение для 2D-массива (x, y), например battleField [1] [2], позицией (1, 2)? –

+0

Ничего, я ответил на свой вопрос. Большое вам спасибо за помощь, это именно то, что я искал! –

2

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

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

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

+0

Это определенно полезно для того, что мне нужно, спасибо тонну! Мне нужно использовать что-то вроде этого, чтобы получить местоположение сетки кнопки, поэтому я могу сказать, попал ли я на корабль или нет. Еще раз спасибо! –

4

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

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); 

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

+0

Oooo ... Я не знал, что могу это сделать! Большое вам спасибо, я определенно буду использовать это в хорошем использовании! –

2

Для справки, здесь является связанной matching game, который использует сетка кнопок. Связанный с этим answer демонстрирует применение шаблона Model-View-Controller к простой игре.

+0

Спасибо! Это довольно аккуратно, и мне придется изучить возможность реализации MVC в моем проекте! –

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