Как я могу получить массив # кнопки / сделать этот запуск более эффективным

#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'
  

Это должно заставить вас двигаться в правильном направлении.