#java #arrays #jbutton #delay
#java #массивы #jbutton #задержка
Вопрос:
Я создаю сложную программу для игры в крестики-нолики, которая имеет переменный размер сетки и количество игроков. Но один из моих друзей прокомментировал, что это немного замедляет реакцию после того, как они делают ход в пространстве 64 на 64. Я изучил это и обнаружил проблему, моя программа проверяет каждую кнопку в сетке, чтобы увидеть, была ли она нажата, затем она проверяет каждого игрока, чтобы увидеть, кто сделал ход. Как только он обнаружил оба, он продолжает жить: D. Но это может занять некоторое время при работе с более крупной сеткой. итак, я предпринял попытку исправить это, вставив несколько «перерывов;», но они не помогли найти его быстрее, только чтобы перестать искать быстрее.
public void actionPerformed(ActionEvent gridButtonClicked) {
for (int i = 0; i < gridButton.length; i ) {
if (gridButtonClicked.getSource() == gridButton[i]) {
for(int a = 0;a < amountOfPlayers;a ){
if(turn == a) {
gridButtonOwner[i] = a 1;
gridButton[i].setBackground(playerColors[a]);
gridButton[i].setEnabled(false);
System.out.println("Grid " i ": " gridButtonOwner[i]);
break;
}
}
break;
}
}
}
Что я хочу знать, так это то, могу ли я получить номер массива нажатой кнопки. Например, если gridButtonClicked = gridButton[1], это вернет число 1, или если оно равно gridButton[2], оно вернет 2 и т.д.
- gridButtonOwner — это массив int,
- gridButton — это массив jbutton.
Ответ №1:
Я должен сказать, что я не понимаю необходимости циклов. В первом цикле for вы получаете сеточную кнопку — но вы знаете, что это такое, потому что это источник события… Вы можете просто сохранить отображение GridButton
на целое число, чтобы получить место в вашем массиве. Зачем выполнять цикл, чтобы найти его? Во втором цикле вы выполняете цикл до a == turn
… Это означает, что вы уже знаете, что a
есть, потому что это == turn
. Вы должны быть в состоянии полностью удалить циклы:
// earlier on: myMap = new HashMap<GridButton, Integer>();
public void actionPerformed(ActionEvent gridButtonClicked) {
GridButton gridButton = gridButtonClicked.getSource();
int i = myMap.get(gridButton);
gridButtonOwner[i] = turn 1;
gridButton.setBackground(playerColors[turn]);
gridButton.setEnabled(false);
System.out.println("Grid " i ": " gridButtonOwner[i]);
}
Ответ №2:
Вы можете найти индекс ‘i’ за один поиск (без зацикливания), если используете HashMap. Вам придется использовать правильный тип (например, JButton, я не знал, какой вы используете вместо GridButton).
HashMap<GridButton, Integer> buttonIndices = new HashMap<GridButton, Integer>();
‘Integer’ — это версия объекта, если ‘int’, поскольку коллекции не могут хранить примитивные типы.
Затем заполните карту каждой кнопкой сетки и значением индекса (заполните …):
for (i...) {
buttonIndices.put(gridButton[i], i); // the 'i' is auto-converted to Integer
}
Для поиска ‘i’ для gridButton:
Integer index = buttonIndices(gridButton);
if (index == null) {
// error, not found
error handling stuff...
}
i = index; // converts Integer to int type of 'i'
Это должно заставить вас двигаться в правильном направлении.