简单的java随机数
java两种随机数生成方式(均为伪随机):
1.Math.random() 生成0-1之间的随机数,取0不取1;
2.
Random ra=new Random(x);
int result=ra.nextInt(y);
x是种子,给的种子相同每一次生成的随机数序列是相同的,不给的话默认以当前系统时间的毫秒数为种子生成随机数,这种方式可以当成真随机数用。y是最大值,result得到的是0-y之间的随机数,取0不取y。
弹球动画扩展
1.首先是移动方式的扩展,我们分别横竖坐标给一个-5-5之间的随机数作为移动速度,使得弹球可以以随机的方向和速度移动,考虑到边界问题,每次到达左右边界使x方向上的移动速度乘以-1以使其反方向移动。
Ball(BallMain ballMain,int x,int y,Color color){
this.ballMain=ballMain;
this.x=x;
this.y=y;
ridi=random.nextInt(10)+20;
moveX=random.nextInt(5)+1;
moveY=random.nextInt(5)+3;
this.color=color;
}
public void move() {
if(x-ridi<0||x+ridi>ballMain.getWidth()) {
moveX*=-1;
}
if(y-ridi<0||y+ridi>ballMain.getHeight()) {
moveY*=-1;
}
x+=moveX;
y+=moveY;
}
2.接着是重绘问题,考虑到后续的扩展,像之前那样
(1)画一个球
(2)根据移动方法在移动后的位置画新的球。
(3)用窗体的颜色覆盖原先的球所在的位置。
进行重绘显得不太适用。
这里我们采用
(1)记录下所有球的坐标。
(2)用窗体大小的空白方框覆盖整个窗体,即将所有球擦除。
(3)根据移动函数修改要移动球的坐标。
(4)将所有球重新绘制到窗体上。
的做法重绘。
同时为了避免闪光问题
(1)采用双缓冲,即将所有球画在一张图片上,再将图片绘制到窗体上。
(2)不为每个球单独创建线程,而是创建一个管理所有球的线程进行统一重绘。
public class ControlBall extends Thread{
private BallMain ballMain;
private ArrayList<Ball>bArrayList;
ControlBall(BallMain ballMain,ArrayList<Ball> bArrayList){
this.ballMain=ballMain;
this.bArrayList=bArrayList;
}
@Override
public void run() {
super.run();
while(true) {
if(image==null) {
image=new BufferedImage(ballMain.getWidth(), ballMain.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
ig=image.getGraphics();
}
ig.setColor(ballMain.getContentPane().getBackground());
ig.fillRect(0, 0, ballMain.getWidth(), ballMain.getHeight());
for(int i=0;i<bArrayList.size();i++) {
bArrayList.get(i).draw(ig);
}
ballMain.getGraphics().drawImage(image, 0, 0, ballMain);
for(int i=0;i<bArrayList.size();i++) {
//必须先移动,否则会报错
bArrayList.get(i).move();
bArrayList.get(i).crash(bArrayList);
}
//ballMain.repaint();上面的代码可以放到主窗体的paint中,然后调用repaint
//方法重绘,但是这样的话不要调用super.paint(g);方法,否则会出现闪烁问 //题
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}