Java 多球程序,用于随机化球的大小

Java 多球程序,用于随机化球的大小,java,multithreading,timer,jpanel,Java,Multithreading,Timer,Jpanel,我让我的程序在有一个变量半径的地方运行,这样球的大小可以是int,但是我想知道如何通过添加球的随机大小使这个程序更复杂。小、中、大等等。在第148行,我试着把它改成intradius=(int)(5*Math.random)但它不起作用。我必须对我的代码做些别的事情才能使它工作吗?如果您有任何其他提示,我们将不胜感激。谢谢 import javax.swing.Timer; import java.util.ArrayList; import java.awt.*; import javax.s

我让我的程序在有一个变量
半径
的地方运行,这样球的大小可以是
int
,但是我想知道如何通过添加球的随机大小使这个程序更复杂。小、中、大等等。在第148行,我试着把它改成
intradius=(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);
  }
}
导入javax.swing.Timer;
导入java.util.ArrayList;
导入java.awt.*;
导入javax.swing.*;
导入java.awt.event.*;
公共类multipleballap扩展了JApplet
{
公共多路报警()
{
添加(新的BallControl());
}
类BallControl扩展了JPanel{
专用BallPanel BallPanel=新的BallPanel();
私有JButton jbtSuspend=新JButton(“挂起”);
私有JButton jbtResume=新JButton(“恢复”);
私有JButton jbtAdd=新JButton(“+1”);
私有JButton jbtSubtract=新JButton(“-1”);
private JScrollBar jsbDelay=new JScrollBar();
公共控制(){
//将面板中的按钮分组
JPanel面板=新的JPanel();
面板。添加(jbtSuspend);
面板。添加(jbtResume);
添加面板(jbtAdd);
面板。添加(jbtSubtract);
//将球和按钮添加到面板
setboorder(newjavax.swing.border.LineBorder(Color.red));
jsbDelay.setOrientation(JScrollBar.HORIZONTAL);
setDelay(jsbDelay.getMaximum());
setLayout(新的BorderLayout());
添加(jsbDelay,BorderLayout.NORTH);
添加(ballPanel、BorderLayout.CENTER);
添加(面板,边界布局。南部);
//注册侦听器
jbtSuspend.addActionListener(新的Listener());
jbtResume.addActionListener(newlistener());
jbtAdd.addActionListener(newlistener());
jbtSubtract.addActionListener(newlistener());
addAdjustmentListener(新的AdjustmentListener()
{
@凌驾
公共无效调整值已更改(调整事件e){
setDelay(jsbDelay.getMaximum()-e.getValue());
}
});
}
类侦听器实现ActionListener
{
@凌驾
已执行的公共无效操作(操作事件e){
如果(例如getSource()==jbtSuspend)
ballPanel.suspend();
else if(e.getSource()==jbtResume)
ballPanel.resume();
else if(例如getSource()==jbtAdd)
ballPanel.add();
else if(例如getSource()==jbtSubtract)
ballPanel.subtract();
}
}
}
类BallPanel扩展了JPanel
{
专用int延迟=10;
private ArrayList list=new ArrayList();
//创建一个具有初始延迟的计时器
受保护的计时器=新计时器(延迟,新ActionListener(){
@Override/**处理操作事件*/
已执行的公共无效操作(操作事件e)
{
重新油漆();
}
});
公共事务委员会()
{
timer.start();
}
公共无效添加()
{
添加(新球());
}
公共空减()
{
如果(list.size()>0)
list.remove(list.size()-1);//移除最后一个球
}
@凌驾
受保护组件(图形g)
{
超级组件(g);
对于(int i=0;igetWidth())
ball.dx=-ball.dx;
if(ball.y<0 | | ball.y>getHeight())
ball.dy=-ball.dy;
//调整球位
ball.x+=ball.dx;
ball.y+=ball.dy;
g、 圆角椭圆(ball.x-ball.radius,ball.y-ball.radius,
球半径*2,球半径*2);
}
}
公众假期暂停
{
timer.stop();
}
公众简历()
{
timer.start();
}
公共无效设置延迟(整数延迟)
{
延迟=延迟;
定时器。设置延迟(延迟);
}
}
班级舞会
{
int x=0;
int y=0;//当前球位置
int dx=10;//球的x坐标增量
int dy=10;//球的y坐标增量
int radius=5;//球半径
颜色=新颜色((int)(Math.random()*256),
(int)(Math.random()*256),(int)(Math.random()*256));
}
/**主要方法*/
公共静态void main(字符串[]args)
{
JFrame=新JFrame();
JApplet applet=新的MultipleBallApp();
frame.add(applet);
frame.setTitle(“MultipleBallApp”);
frame.setLocationRelativeTo(null);//将帧居中
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架。设置尺寸(400200);
frame.setLocationRelativeTo(null);//将帧居中
frame.setVisible(true);
}
}

尝试随机化球的半径时,请确保半径不为0

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

“不起作用”是什么意思?另外,假设您的意思是
Math.random()*5
,它将返回0、1、2、3或4。这就是你想要的吗?试试
intradius=(int)(5*Math.random()+1),这样就永远不会得到半径为0的值。或者如果希望最大大小为5
intradius=(int)(4*Math.random()+1)@gonzo成功了!非常感谢你!如果我想让球以不同的速度(更快,更慢)移动,我会以与半径相同的方式移动吗?
如果我想让球以不同的速度移动(更快,更慢),我会以与半径相同的方式移动吗?
-试试看会发生什么。它适用于你的颜色和半径,为什么你会期望其他属性出现问题?先尝试一下,这就是你学习的方式,如果它没有按你期望的方式工作,你可以问一个问题。@gonzo在这种情况下,方法调用的两倍*几个方法调用*每个方法调用的几乎是瞬间的时间=仍然是0