所以基本上我正在学习一些基本的java,我现在正在写一个小“游戏”,告诉你点击哪个按钮,如果你点击正确的那个,你会得到一个点。按钮定义为b1,b2,b3和b4。它们上面的文字说“按钮1”,“按钮2”,“按钮3”和“按钮4”。
我希望实现的是每次单击按钮时,都会随机重新分配值,以便例如b1文本可能会显示“按钮3”。但它会是随机的。我使用Java随机来实现我想要的工作,但现在我需要解决按钮被赋予相同值的问题。例如,b1和b3可能都被命名为“按钮2”。我不确定如何解决这个问题,任何帮助将不胜感激。这让我很沮丧。
好的,所以这是我的代码.....终于。有一个可怕的互联网连接atm。
我在需要帮助的地方发表评论
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Gui extends JFrame implements ActionListener {
private JButton b1 = new JButton("Button 1");
private JButton b2 = new JButton("Button 2");
private JButton b3 = new JButton("Button 3");
private JButton b4 = new JButton("Button 4");
private static JLabel label = new JLabel();
private static JLabel label2 = new JLabel("You currently have 0 points.");
private JPanel p = new JPanel(new GridBagLayout());
private int points = 0;
private int randomButton;
public Gui() {
super("Button Game");
newLabel();
setSize(400, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
b4.addActionListener(this);
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(10,10,10,10);
c.gridx = 2;
c.gridy = 1;
p.add(b1,c);
c.gridx = 1;
c.gridy = 2;
p.add(b2, c);
c.gridx = 3;
c.gridy = 2;
p.add(b3, c);
c.gridx = 2;
c.gridy = 3;
p.add(b4, c);
c.gridx = 2;
c.gridy = 2;
p.add(label, c);
c.gridx = 2;
c.gridy = 4;
p.add(label2, c);
add(p);
}
public void rearrangeButtons() {
//HERE IS WHERE I AM HAVING THE PROBLEM
//b1.setText("Button " + randomButton);
//b2.setText(newText);
//b3.setText(newText);
//b4.setText(newText);
}
public static int random(int range) {
return (int)(java.lang.Math.random() * (range+1));
}
public static void newLabel() {
switch(random(3)) {
case 0:
label.setText("Press button 1");
break;
case 1:
label.setText("Press button 2");
break;
case 2:
label.setText("Press button 3");
break;
case 3:
label.setText("Press button 4");
break;
}
}
@Override
public void actionPerformed(ActionEvent e) {
String number = label.getText();
if (e.getSource() == b1) {
if (number.endsWith("1")) {
points++;
newLabel();
} else {
points = 0;
}
}
if (e.getSource() == b2) {
if (number.endsWith("2")) {
points++;
newLabel();
} else {
points = 0;
}
}
if (e.getSource() == b3) {
if (number.endsWith("3")) {
points++;
newLabel();
} else {
points = 0;
}
}
if (e.getSource() == b4) {
if (number.endsWith("4")) {
points++;
newLabel();
} else {
points = 0;
newLabel();
}
}
rearrangeButtons();
label2.setText("You currently have " + points + " points.");
}
}
答案 0 :(得分:2)
Collections
为您提供了一种简单的方法:
在List
:
List<String> myList =
new ArrayList<String>(Arrays.asList("text1", "text2", "text3", "text4"));
每次要更改按钮上的文本时,随机播放列表并指定:
Collections.shuffle(myList);
b1.setText(myList.get(0));
b2.setText(myList.get(1));
b3.setText(myList.get(2));
b4.setText(myList.get(3));
答案 1 :(得分:1)
编辑:Brian使用Shuffle的方式更好;忘了那个方法,哈哈。我的错。忽略这个答案并使用它。
使用"button 1", "button 2", "button 3", "button 4"
每次单击一个按钮时,创建一个ArrayList,它是上述数组的副本(不是引用的副本)。例如:ArrayList<String> copy = new ArrayList<String>(intialArrayList);
然后使用JButton#setText
和Math.Random()为第一个按钮选择其中一个字符串。 每次选择字符串时,都要从副本中删除字符串。(这样就无法设置按钮文本两次)。
然后重复其余按钮,但要确保生成的随机数首先在0-3之间,然后是0-2,然后是0-1。
例如:
int j = 3;
ArrayList<String> copy = new ArrayList<String>(initialArrayList);
for(int i = 0; i< 3; i++) {
//int rand = generate random number between i and j
String text = copy.get(rand);
// setText(text) for each b1, b2, b3, b4;
// copy.remove(text);
j--;
}
为此创建一个单独的方法,这样您就不必为每个actionPerformed
方法输入此内容。
这就是我如何做到的。
答案 2 :(得分:0)
也许每次要重置按钮文本时,都会构建4个文本“按钮1”,“按钮2”,“按钮3”,“按钮4”的列表。随机选择一个,将其分配给b1,然后将其从列表中删除,现在只剩下3个可用文本。从剩余的3列表中再次随机选择并将其分配给b2。继续,直到您的可用文本列表为空(或在这种情况下为4次)。当您需要再次重置这些文本时,只需将可用文本列表重置为“按钮1”,“按钮2”,“按钮3”,“按钮4”并重复。