2015-03-25 60 views
2

我想做一个游戏,按钮会点亮,用户将不得不按下按钮在给定的时间。我的程序如何随机按下一个按钮?

目前,我的程序有12个按钮可以执行某些操作。我正在努力使这些按钮被程序随机调用。到目前为止,我只有12个按钮可以在用户按下时更改文本。

现在我需要一种方法让它们随机按下程序本身而不是用户。任何想法是如何在java中完成的?

// **** Panels for buttons **** 
     JPanel panelButtons = new JPanel();       // making the panel for the buttons 
     panelButtons.setLayout(new GridLayout(3, 4));    // setting the layout of the buttons to 3x4 as shown above 

     b1 = new JButton(" ⃝");          // creating button and setting its default text 
     b1.setFont(fontText);          // setting the font 
     b1.addActionListener(new ActionListener(){     // action listener to do something when pressed 
      public void actionPerformed(ActionEvent e) { 
        sendMessage(user + "1");      // sends the name of the user that pressed the button and which button 
        String field1 = b1.getText();     // gets the text from the button and stores it in a String 
        if(field1 == " ⃝"){        // checks if the string is equal to an empty circle 
         b1.setText("⬤");       // if true then change to a full circle 
        } 
        else if (field1 == "⬤"){      // opposite of the above if statement 
         b1.setText(" ⃝"); 
        } 
      } 
     }); 
     panelButtons.add(b1);          // adding the button to the panel 

     b2 = new JButton(" ⃝");          // creating button and setting its default text 
     b2.setFont(fontText);          // setting the font 
     b2.addActionListener(new ActionListener(){     // action listener to do something when pressed 
      public void actionPerformed(ActionEvent e) {    
        sendMessage(user + "2");      // sends the name of the user that pressed the button and which button 
        String field2 = b2.getText();     // gets the text from the button and stores it in a String 
        if(field2 == " ⃝"){        // checks if the string is equal to an empty circle 
         b2.setText("⬤");       // if true then change to a full circle 
        } 
        else if (field2 == "⬤"){      // opposite of the above if statement 
         b2.setText(" ⃝"); 
        } 
      } 
     }); 
     panelButtons.add(b2);          // adding the button to the panel 
+0

从1到12生成一个随机数,进行大小写切换,然后根据大小写触发按钮执行的操作。 – 2015-03-25 10:45:22

+0

@CeilingGecko坏主意。下周他需要14个按钮时会发生什么。还是8?每次数字改变时,你都必须更新switch语句。非常烦人和容易出错。 – GhostCat 2015-03-25 10:47:31

+0

@EddyG您的观点有其优点,但要在现实世界的情况下公平,这种重大的设计变更不应该经常发生。 (除非有意)在可维护性和可读性之间应该做出妥协,在这种情况下,由于我们没有看到整体情况,因此可能很难确定从长远来看哪种选择会更好。 – 2015-03-25 10:55:23

回答

2

您可以创建一个保存按钮的列表。使用随机数生成器在列表的长度内创建一个随机数。使用该(随机)索引来修改相应的按钮。

0
  1. 把你的十二个按钮放在一个有序的集合中。
  2. 把你的12个相应的动作放在另一个有序的集合中,形式为Consumer<JButton>'(use Callable`(并且忽略返回),或者如果你没有使用java 8,就创建类似的东西。
  3. 执行从Button集合到动作集合的映射。
  4. 创建实施ActionListener像这样一类:

    private static class Listener implements ActionListener{ 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         button2action.get((JButton)e.getSource()).accept(a); 
        } 
    } 
    
  5. 从设置地图的,如果你想获得随机按钮按下值拿起一个随机元素。

    int randomIndex = new random().nextInt(button2action.entrySet().size()); 
    Iterator<Entry<JButton, Consumer<JButton>>> iter = button2action.entrySet().iterator(); 
    for (int i = 0; i < randomIndex; i++){ 
        Entry<JButton, Consumer<JButton>> entry = iter.next(); 
    } 
    entry.getValue().accept(entry.getKey()); 
    
  6. 如果要添加新按钮,请将新的按钮动作对添加到地图中。

相关问题