随机数,美丽的地方就在于不确定。
java里面生成随机数大体上来分为两种:
1.调用Math类的静态方法random()去生成一个在0-1之间的double型随机数,如果需要整型,那么就用以下代码(int)(Math.random()*10)的方法来生成一个0-9的随机数。
2.用Random类中生成随机数的方法,如生成一个随机整数就可以用一下代码生成new Random().nextInt(10) 生成的随机数是0-9的,你可以改变里面的参数来生成范围不同的随机数。
接下来我给大家分享下我眼中的随机数~~~~
----------------------------------------------------卖萌分割线/(-w-) \---------------------------------------------------------
在图形界面设计中的画布对象中g.filloval(x,y,width,height);以及设置画布颜色g.setColor(new Color(r,g,b));
我们将在这两个方法中的参数中用随机数去谱写华美的篇章。
首先我在颜色设置上动手脚~
g.setColor(new Color(100,100,100);这样的颜色是简单单调的,那要是换成g.setColor(new Color(new Random().nextInt(255),new Random().nextInt(255),new Random().nextInt(255)),你可以想象到每次产生的图形是不一样的颜色,这样就会有丰富多彩的圆了。
但是一个平面的圆始终不能给我们带来想要的视觉享受,那么如果用上循环,你可以得到意想不到的收获
private void draw3DBall(){
for(int i=0;i<25;i++){
g.setColor(new Color(colorValue1+i*5,colorValue2+i*5,colorValue3+i*5));
g.fillOval(x+i, y+i, 50-i*2, 50-i*2); //colorValue1,colorValue2,colorValue3是三个随机数
}
}
这样画出来的图形不在是圆了,这是一个球!
在颜色上做完手脚,让我们把视线转移到g.filloval()里面的参数里:
我先来介绍下这四个参数吧。java中画的圆是以长度为width,宽度为height,左上角坐标为(x,y)矩形内切出来的圆。也就是说你只要给这四个赋予随机数,那么你画出来的圆就是随机大小,随机分布的!
如果就这样画出来-= -那也太没品味了~
我们这里线程(Thread)让它动起来[email protected]@
public void run() {
while(true){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(flag){
continue;
}
delete3DBall();
x+=VX;
y+=VY;
//撞击返回
if(x>jpPl.getWidth()-50||x<0){
VX = -VX;
}
if(y>jpPl.getHeight()-50||y<0){
VY = -VY;
}
draw3DBall();
}
}
/**
* 绘制新的圆球
*/
private void draw3DBall(){
for(int i=0;i<25;i++){
g.setColor(new Color(colorValue1+i*5,colorValue2+i*5,colorValue3+i*5));
g.fillOval(x+i, y+i, 50-i*2, 50-i*2);
}
}
/**
* 用背景色覆盖原来的圆球
*/
private void delete3DBall(){
for(int i=0;i<25;i++){
g.setColor(jpPl.getBackground());
g.fillOval(x+i, y+i, 50-i*2, 50-i*2);
}
}
球动的原理就是不断改变坐标(x,y),也就是说我们在线程中每一次循环改变一次x,y的值,而这样的该变量*线程休眠时间 = 球运动的速度 ;为了让每个球运动方式不同,我们又可以每个球的线程中x,y的增量不同,这样我们又用到了随机数!
最后的效果就是:
程序源代码:
package cn.jinyejun.My3DBall;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
* 3DBall Play
*
* @author 金晔俊
*
*/
public class WinPlay {
private JFrame jf;
private JPanel jpPl;
private Graphics g;
private ArrayList<GameThread> list = new ArrayList<GameThread>();
public WinPlay() {
initUI();
System.out.println(g);
}
private void initUI() {
jf = new JFrame();
jf.setTitle("3D Ball Play");
jf.setLayout(new BorderLayout());
jf.setSize(600, 500);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setLocationRelativeTo(null);
// 开始、暂停、继续 按钮组;
JPanel jp = new JPanel();
jp.setLayout(new FlowLayout());
JButton jbuSt = new JButton("Start");
jbuSt.setFocusable(false);
JButton jbuPs = new JButton("pause");
jbuPs.setFocusable(false);
JButton jbuCt = new JButton("continue");
jbuCt.setFocusable(false);
jp.add(jbuSt);
jp.add(jbuPs);
jp.add(jbuCt);
jf.add(jp, BorderLayout.NORTH);
// 3D球显示区域
jpPl = new JPanel();
jpPl.setBackground(Color.WHITE);
jpPl.setPreferredSize(new Dimension(500, 500));
jf.add(jpPl);
jf.setVisible(true);
// 获取JpPl画布
g = jpPl.getGraphics();
jbuSt.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
GameThread gt = new GameThread(jpPl, g);
list.add(gt);
gt.start();
}
});
jbuPs.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < list.size(); i++) {
list.get(i).setFlag(true);
}
}
});
jbuCt.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < list.size(); i++) {
list.get(i).setFlag(false);
}
}
});
}
public static void main(String[] args) {
new WinPlay();
}
}
package cn.jinyejun.My3DBall;
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JPanel;
public class GameThread extends Thread{
private JPanel jpPl;
private Graphics g;
private int x,y;
private int VX = new Random().nextInt(5)+1,VY = new Random().nextInt(5)+1;
private boolean flag = false;
private int colorValue1 = Math.abs(new Random().nextInt(255)-5*25);
private int colorValue2 = Math.abs(new Random().nextInt(255)-5*25);
private int colorValue3 = Math.abs(new Random().nextInt(255)-5*25);
public GameThread(JPanel jpPl,Graphics g) {
this.jpPl = jpPl;
this.g = g;
}
@Override
public void run() {
while(true){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(flag){
continue;
}
delete3DBall();
x+=VX;
y+=VY;
//撞击返回
if(x>jpPl.getWidth()-50||x<0){
VX = -VX;
}
if(y>jpPl.getHeight()-50||y<0){
VY = -VY;
}
draw3DBall();
}
}
/**
* 绘制新的圆球
*/
private void draw3DBall(){
for(int i=0;i<25;i++){
g.setColor(new Color(colorValue1+i*5,colorValue2+i*5,colorValue3+i*5));
g.fillOval(x+i, y+i, 50-i*2, 50-i*2);
}
}
/**
* 用背景色覆盖原来的圆球
*/
private void delete3DBall(){
for(int i=0;i<25;i++){
g.setColor(jpPl.getBackground());
g.fillOval(x+i, y+i, 50-i*2, 50-i*2);
}
}
public void setFlag(boolean flag) {
this.flag = flag;
}
}