Как я могу получить Массив # кнопки / Сделать это работать более эффективно - PullRequest
1 голос
/ 18 мая 2011

Я делаю сложную программу Tic Tac Toe, которая имеет переменный размер сетки и количество игроков.Но один из моих друзей прокомментировал, что после того, как они сделали ход в 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.

Ответы [ 2 ]

3 голосов
/ 18 мая 2011

Должен сказать, что я не понимаю необходимости петель.В первом цикле for вы получаете кнопку grid - но вы знаете, что это такое, потому что это источник события ... Вы можете просто сохранить карту GridButton в Integer, чтобы получить место в вашем массиве.Зачем искать это?Во втором цикле вы выполняете цикл до 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]);
}
1 голос
/ 18 мая 2011

Вы можете найти индекс 'i' в одном поиске (без зацикливания), если вы используете HashMap.Вам придется использовать правильный тип (например, JButton, я не знал, что вы используете вместо GridButton).

HashMap<GridButton, Integer> buttonIndices = new HashMap<GridButton, Integer>();

'Integer' - это версия объекта, если 'int' какколлекции не могут хранить примитивные типы.

Затем заполните карту каждым GridButton и значением индекса (заполните ...):

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'

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

...