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的值。或者如果希望最大大小为5intradius=(int)(4*Math.random()+1)代码>@gonzo成功了!非常感谢你!如果我想让球以不同的速度(更快,更慢)移动,我会以与半径相同的方式移动吗?如果我想让球以不同的速度移动(更快,更慢),我会以与半径相同的方式移动吗?
-试试看会发生什么。它适用于你的颜色和半径,为什么你会期望其他属性出现问题?先尝试一下,这就是你学习的方式,如果它没有按你期望的方式工作,你可以问一个问题。@gonzo在这种情况下,方法调用的两倍*几个方法调用*每个方法调用的几乎是瞬间的时间=仍然是0