问题描述
我创建了一个战舰 GUI 程序,带有一个按钮网格,然后我创建了一堆单选按钮来选择用户想要放置在网格上的船只 一旦用户选择了一个单选按钮,他们就可以改变网格上按钮的颜色。即定位船
我的问题是,一旦用户选择了一个单选按钮,他们就可以随心所欲地更改网格按钮的颜色。
我还希望他们只能更改与他们最初选择的按钮颜色接近的按钮颜色(仅限垂直和水平)
这是我的代码
public void actionPerformed(ActionEvent evt){
if(submarine.isSelected())
{
button[r][c].setBackground(Colour.green)
board[r][c]=+1
}
button 数组存储当前使用的按钮的位置,而 board 应该存储船的位置
编辑:当我运行程序时,我有一个代表棋盘的网格。然后我制作了一个代表船舶(潜艇、巡洋舰、驱逐舰和战舰)的第 4 组单选按钮和另一个代表方向(垂直或水平)的组
如果玩家选择了一个单选按钮,例如“潜艇(长度为 4)和垂直”,则按下该按钮,并且接下来 3 的颜色在案例中变为“红色”。现在我希望玩家能够一次在网格上定位一艘船。在我的示例中,在用户放置潜艇(垂直 4 个红色按钮)后,他们应该只能更改位置,即在网格上创建一组新的 4 个红色按钮(如果他们希望更改船只位置),这意味着以前的选定的按钮被清除。
我也不希望按钮在网格上重叠。例如,如果他们在放置指示潜艇的 4 个红色按钮后选择潜艇和垂直。如果他们然后选择一艘新船,例如“战舰”,长度为 6 。新按钮不应与之前的潜艇重叠
希望这能澄清事情。如果你还是不明白,请告诉我
解决方法
如果我理解正确,也许可以尝试重新设计您的逻辑:
现在,您为特定长度的特定船只选择一个位置。但是为什么你需要为你的船选择更多的位置?
相反,还有两个单选按钮将确定船舶的方向:一个用于水平方向,另一个用于垂直方向。这样,当玩家选择一个位置时,按钮会自动在水平或垂直方向突出显示,当然也会突出显示正确的数量。示例:选择了长度为 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 的代码中缩减,但这是主要思想。