`
hellojyj
  • 浏览: 58831 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

丰富多彩的随机数

阅读更多

 随机数,美丽的地方就在于不确定。

 

 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)让它动起来~@@

 

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;
	}
	
	

}

 

  • 大小: 90.9 KB
  • 大小: 88.3 KB
1
0
分享到:
评论
2 楼 hellojyj 2014-04-05  
嗯,谢谢你的意见~初学者~@ TuT
1 楼 freezingsky 2014-04-04  
你没发现你画出的圆,有很多的毛边吗?我建议你用Graphic2D,进行降噪。另外,我觉得你这文章属于一般的粒子运动方面的知识,随机数方面的东西,反而没有说到点子上。

相关推荐

Global site tag (gtag.js) - Google Analytics