2015-11-20 41 views
1

我有我的程序運行的地方,我有一個變量radius,這樣球的大小可以是int,但我想知道如何使這個程序更復雜,添加隨機大小的球。小,中,大等148線我試圖改變它int radius = (int)(5*Math.random);,但它沒有奏效。我必須對我的代碼執行其他操作才能使其工作嗎?如果還有其他提示,他們會非常感激。謝謝多球程序,隨機化球的大小

import javax.swing.Timer; 
import java.util.ArrayList; 
import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 

public class MultipleBallApp extends JApplet 
{ 
    public MultipleBallApp() 
    { 
    add(new BallControl()); 
    } 

    class BallControl extends JPanel { 
    private BallPanel ballPanel = new BallPanel(); 
    private JButton jbtSuspend = new JButton("Suspend"); 
    private JButton jbtResume = new JButton("Resume"); 
    private JButton jbtAdd = new JButton("+1"); 
    private JButton jbtSubtract = new JButton("-1"); 
    private JScrollBar jsbDelay = new JScrollBar(); 

    public BallControl() { 
     // Group buttons in a panel 
     JPanel panel = new JPanel(); 
     panel.add(jbtSuspend); 
     panel.add(jbtResume); 
     panel.add(jbtAdd); 
     panel.add(jbtSubtract); 

     // Add ball and buttons to the panel 
     ballPanel.setBorder(new javax.swing.border.LineBorder(Color.red)); 
     jsbDelay.setOrientation(JScrollBar.HORIZONTAL); 
     ballPanel.setDelay(jsbDelay.getMaximum()); 
     setLayout(new BorderLayout()); 
     add(jsbDelay, BorderLayout.NORTH); 
     add(ballPanel, BorderLayout.CENTER); 
     add(panel, BorderLayout.SOUTH); 

     // Register listeners 
     jbtSuspend.addActionListener(new Listener()); 
     jbtResume.addActionListener(new Listener()); 
     jbtAdd.addActionListener(new Listener()); 
     jbtSubtract.addActionListener(new Listener()); 
     jsbDelay.addAdjustmentListener(new AdjustmentListener() 
     { 
     @Override 
     public void adjustmentValueChanged(AdjustmentEvent e) { 
      ballPanel.setDelay(jsbDelay.getMaximum() - e.getValue()); 
     } 
     }); 
    } 

    class Listener implements ActionListener 
    { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == jbtSuspend) 
      ballPanel.suspend(); 
     else if (e.getSource() == jbtResume) 
      ballPanel.resume(); 
     else if (e.getSource() == jbtAdd) 
      ballPanel.add(); 
     else if (e.getSource() == jbtSubtract) 
      ballPanel.subtract(); 
     } 
    } 
    } 

    class BallPanel extends JPanel 
    { 
    private int delay = 10; 
    private ArrayList<Ball> list = new ArrayList<Ball>(); 

    // Create a timer with the initial dalay 
    protected Timer timer = new Timer(delay, new ActionListener() { 
     @Override /** Handle the action event */ 
     public void actionPerformed(ActionEvent e) 
     { 
     repaint(); 
     } 
    }); 

    public BallPanel() 
    { 
     timer.start(); 
    } 

    public void add() 
    { 
     list.add(new Ball()); 
    } 

    public void subtract() 
    { 
     if (list.size() > 0) 
     list.remove(list.size() - 1); // Remove the last ball 
    } 

    @Override 
    protected void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 

     for (int i = 0; i < list.size(); i++) 
     { 
     Ball ball = (Ball)list.get(i); // Get a ball 
     g.setColor(ball.color); // Set ball color 

     // Check boundaries 
     if (ball.x < 0 || ball.x > getWidth()) 
      ball.dx = -ball.dx; 

     if (ball.y < 0 || ball.y > getHeight()) 
      ball.dy = -ball.dy; 

     // Adjust ball position 
     ball.x += ball.dx; 
     ball.y += ball.dy; 
     g.fillOval(ball.x - ball.radius, ball.y - ball.radius, 
      ball.radius * 2, ball.radius * 2); 
     } 
    } 

    public void suspend() 
    { 
     timer.stop(); 
    } 

    public void resume() 
    { 
     timer.start(); 
    } 

    public void setDelay(int delay) 
    { 
     this.delay = delay; 
     timer.setDelay(delay); 
    } 
    } 

    class Ball 
    { 
    int x = 0; 
    int y = 0; // Current ball position 
    int dx = 10; // Increment on ball's x-coordinate 
    int dy = 10; // Increment on ball's y-coordinate 
    int radius = 5; // Ball radius 
    Color color = new Color((int)(Math.random() * 256), 
     (int)(Math.random() * 256), (int)(Math.random() * 256)); 
    } 

    /** Main method */ 
    public static void main(String[] args) 
    { 
    JFrame frame = new JFrame(); 
    JApplet applet = new MultipleBallApp(); 
    frame.add(applet); 
    frame.setTitle("MultipleBallApp"); 
    frame.setLocationRelativeTo(null); // Center the frame 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(400, 200); 
    frame.setLocationRelativeTo(null); // Center the frame 
    frame.setVisible(true); 
    } 
} 
+1

「沒有工作」是什麼意思?另外,假設你的意思是'Math.random()* 5',那將返回0,1,2,3或4.這就是你想要的嗎? – blm

+1

嘗試'int radius =(int)(5 * Math.random()+ 1);',這樣您永遠不會得到半徑爲0.或者如果您希望最大大小爲5'int radius =(int) (4 * Math.random()+ 1);' – gonzo

+0

@gonzo工作!非常感謝你!如果我想讓球以不同的速度前進(更快,更慢),那麼我是否會按照與半徑相同的方式繼續前進? – ttrigger10

回答

1

確保在試圖隨機化球的半徑時不會得到0作爲半徑。

int radius = (int)(4*Math.random()+1);