我正在制作的一款小型XO游戏的一部分是,每当我按下一个按钮时,它就会变成X符号,然后计算机会选择一个随机按钮来放置O符号。
让我感到困惑的部分是计算机将选择的随机按钮。我有一个带有9个按钮的JButton
数组,但是当计算机选择时,将有机会选择一个已经带有符号X的按钮,这将破坏游戏。
不重复不成问题,并且很容易解决,但是我如何在生成随机数的同时给带有X符号的按钮一个不可用的状态?到目前为止,这是我的代码:
在执行操作的方法中:
if (e.getSource().equals(button1)) {
button1.setIcon(X);
xoro = true;
button1.setEnabled(false);
button1.setForeground(Color.BLACK);
}
执行随机数并选择按钮的方法:
void computer_play(JButton[] buttons, ImageIcon O, ImageIcon X)
{
Random rand = new Random();
int randomnumber = rand.nextInt(8);
buttons[randomnumber].setIcon(O);
buttons[randomnumber].setEnabled(false);
}
答案 0 :(得分:1)
我建议保留一个单独的可用按钮数组,方法是过滤主数组或保持最新的单独数组。然后生成一个介于0和此较小数组长度之间的随机整数。 完全未经测试,未经编译的代码。
void computer_play(JButton[] buttons, ImageIcon O, ImageIcon X)
{
JButton[] availableButtons = buttons.stream().filter((j) -> j.getIcon() == null).toArray(size -> new JButton[size]);
Random rand = new Random();
int randomnumber = rand.nextInt(availableButtons.length);
availableButtons[randomnumber].setIcon(O);
availableButtons[randomnumber].setEnabled(false);
}
答案 1 :(得分:-1)
只需解决我的问题,并想在这里将解决方案发布给有类似问题的任何人。
我创建了一个列表,其中包含从0到8的9个数字
List<Integer> randomize = new ArrayList<>();
for(int i =0; i < 9; i++)
{
randomize.add(i);
}
然后通过Collections.shuffle(randomize);
现在我们有8个无重复的“随机”数字(问题1已解决)
所以现在我会做类似button[randomize.get(0)].setIcon(O)
的事情
并通过randomize.remove(0)删除该索引。当我按下按钮以避免重复时,该选择的号码将被删除。
当涉及到用户播放的按钮时,我会保留按钮位置的记录,并在按下类似的按钮时将其从列表中删除:
randomlist.remove(new Integer(Arrays.asList(buttons).indexOf(button1)));
现在我已经完成了作业!这是程序的图片: