Как остановить изменение цвета кнопок, которые были нажаты, после определенного количества цветных кнопок

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

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

Я также хочу, чтобы они могли изменять цвет кнопок только близко к тому, который они изначально выбрали (только по вертикали и горизонтали)

Вот мой код

public void actionPerformed(ActionEvent evt){
if(submarine.isSelected())
{
button[r][c].setBackground(Colour.green)

board[r][c]=+1
}

Массив кнопок хранит положение текущей используемой кнопки, в то время как доска должна хранить положение корабля.

редактировать: когда я запускаю программу, у меня есть сетка, представляющая доску. затем я сделал радиокнопки группы 4, представляющие корабли (подводная лодка, крейсер, эсминец и линкор), и еще одну группу для ориентации (вертикальной или горизонтальной).

если игрок выбирает радиокнопку, например, подводную лодку (имеющую длину 4), а вертикальную кнопку нажимает, а цвет следующих 3-х в случае меняется на красный. Теперь я хочу, чтобы игрок мог один раз разместить корабль на сетке. в моем примере, после того, как пользователь поместит подводную лодку (4 красные кнопки по вертикали), он сможет только изменить положение, т.е. создать новые наборы из 4 красных кнопок на сетке (если они хотят изменить положение кораблей), что означает ранее выбранные кнопки очищаются.

Я также не хочу, чтобы кнопки перекрывали сетку. например, если они выбирают подводную лодку и вертикаль после размещения 4 красных кнопок, указывающих на подводную лодку. если они затем выберут новый корабль, например линкор, длиной 6 . новые кнопки не должны перекрывать предыдущую подводную лодку

Надеюсь, это проясняет ситуацию. если вы все еще не поняли, дайте мне знать


person Casper Josiah    schedule 28.03.2021    source источник


Ответы (1)


Возможно, попробуйте изменить свою логику, если я правильно понимаю:

Прямо сейчас вы выбираете место для определенного корабля определенной длины. Но зачем вам выбирать больше мест для вашего корабля?

Вместо этого добавьте еще две радиокнопки, которые будут определять ориентацию корабля: одну для горизонтальной ориентации и одну для вертикальной ориентации. Таким образом, когда игрок выбирает место, кнопки автоматически подсвечиваются либо в горизонтальном, либо в вертикальном направлении, при этом, конечно, выделяется правильное количество. Пример: был выбран корабль длиной 4 и выбрана горизонтальная ориентация. Теперь игрок выбирает 3, 2 (при условии, что 3 — это третья строка, а 2 — второй столбец) на сетке. 3, 3; 3, 4; 3, 5 также подсвечиваются красным вместе с выбранным, чтобы показать, где будет находиться корабль.

Чтобы выделить правильное количество, вы можете использовать циклы for. Выполните цикл для длины выбранного корабля, а затем увеличьте либо столбец c, если выбрано горизонтально, либо строку r, если выбрано вертикально, и установите для всех этих кнопок красный цвет, т.е.

Button currentButton = null;
for(int i = 0; i<ship.length; i++){
    if(horizontalOrientation.isSelected())
        currentButton = button[selected r][selected c + i];
        if(currentButton.getMarked == true){
            currentButton.setBackground(Color.RED);
            break;
        }
        else{
            currentButton.setBackground(Color.GREEN);
            currentButton.setMarked(true);
        }
    else
        //same code but for vertical orientation (and incrementing r instead)
}

Я уверен, что приведенный выше код можно уменьшить по сравнению со всеми теми if else, но это основная идея.

person LuckyBandit74    schedule 29.03.2021
comment
@ LuckyBandit74 спасибо, но как предотвратить перекрытие позиций кораблей - person Casper Josiah; 29.03.2021
comment
@Casper Josiah Хорошим способом предотвращения перекрытия было бы пометить каждую кнопку как отмеченную (вы можете создать класс, который расширяет JButton, а затем иметь логический атрибут с именем isMarked. У вас также будет метод получения с именем getMarked()). Затем при циклическом выделении каждого красным (или зеленым, я не уверен, какой цвет для чего предназначен), если кнопка уже отмечена, разорвите цикл и установите кнопку как зеленую (или наоборот, но я думаю, что зеленый означает, что это хорошо и красный meams - person LuckyBandit74; 29.03.2021
comment
Извините, места не хватило, я думаю, что зеленый означает "хорошо", а красный означает "нет". Я могу отредактировать свой код, чтобы учесть это. - person LuckyBandit74; 29.03.2021
comment
да, не могли бы вы показать это в своем коде, цвета на самом деле не имеют большого значения, я просто использую их в качестве примера, просто чтобы убедиться, что они не перекрываются. - person Casper Josiah; 29.03.2021
comment
@Casper Josiah Да, я редактировал свой код. Теперь любое перекрытие должно разорвать петлю и показать красным то место, где оно впервые перекрылось. В том же операторе else, где существует разрыв, вы можете добавить некоторую обработку, чтобы предотвратить фактическое размещение корабля пользователем. Может быть, корабль должен иметь все зеленые маркеры, прежде чем его можно будет проверить. Не знаю, остальное зависит от вас. Надеюсь, поможет - person LuckyBandit74; 29.03.2021