Java 画图板用随机数搞“混沌游戏”

今晚做了这样的一个任务:用随机数在画图板里面生成四个点,然后选出其中的三个点组成一个三角形,把三角形的三个顶点标为1、2、3,另一个点标为4,把4点随机与1、2、3三个点中一个点进行连接,取连线的中点,把中点作为4,再重复随机与1、2、3点中的一个点连接……一直重复
并且把点用画图板展现出来。

以下是代码部分:

1、生成画图板,并往里面加按钮和监听器
package draw;
	import java.awt.FlowLayout;
	import javax.swing.JFrame;
	import java.awt.Graphics;
	import javax.swing.JButton;
public class DrawUI {
	public void showUI(){
		JFrame drawFrame=new JFrame();
		drawFrame.setTitle("画图板");
		drawFrame.setSize(1500, 800);
		drawFrame.setLocationRelativeTo(null);
		drawFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		drawFrame.setLayout(new FlowLayout());
		
		DrawListener drawL = new DrawListener();
		drawFrame.addMouseListener(drawL);
		
		

		JButton lineBtn = new JButton("直线");
		drawFrame.add(lineBtn);
		lineBtn.addActionListener(drawL);
		
		JButton cyBtn = new JButton("圆");
		drawFrame.add(cyBtn);
		cyBtn.addActionListener(drawL);
		
		JButton nameBtn = new JButton("名字");
		drawFrame.add(nameBtn);
		nameBtn.addActionListener(drawL);
		
		JButton recBtn = new JButton ("矩形");
		drawFrame.add(recBtn);
		recBtn.addActionListener(drawL);
		
		JButton picBtn = new JButton("图形");
		drawFrame.add(picBtn);
		picBtn.addActionListener(drawL);
		
		JButton ranBtn = new JButton("随机数");
		drawFrame.add(ranBtn);
		ranBtn.addActionListener(drawL);
		
		JButton siBtn = new JButton("四个点");
		drawFrame.add(siBtn);
		siBtn.addActionListener(drawL);
		
		drawFrame.setVisible(true);
		
		Graphics g=drawFrame.getGraphics();
		drawL.setGraphics(g);
	}
	
	public static void main(String[]args){
		DrawUI ui = new DrawUI();
		ui.showUI();
		
	}
}

2、定义数组存放点的坐标,并生成随机数放在数组里面
	int X1[] = {0,0,0,0},Y1[] = {0,0,0,0};
/
/
/
/
	else if("四个点".equals(type)){

    		int i=0;
    	   	int a;	
    	   	int b;


    		
    		for(;i<4;i+=1)
    		{
    		a=(int)(1+Math.random()*(800-1+1));
    		b=(int)(1+Math.random()*(800-1+1));
    		X1[i]=a;
    		Y1[i]=b;		
    		System.out.println(a+" "+b);
    		Color color=new Color(233,23,242);
    		g.setColor(color);
    		g.drawLine(X1[i], Y1[i], X1[i], Y1[i]);
    		
    		}
    		g.drawLine(X1[2], Y1[2], X1[1], Y1[1]);
    		g.drawLine(X1[2], Y1[2], X1[3], Y1[3]);
    		g.drawLine(X1[1], Y1[1], X1[3], Y1[3]);
    		
    	
    		
    	}
    	
    	else if("随机数".equals(type)){
     		
    		 
    	

    		for(int n=1;n<100000;n+=1){
    			    	   	int c;	   	
    		c=(int)(1+Math.random()*(3-1+1));
    		//System.out.println(c);
    		if(c==1){
    			X1[0]=(X1[0]+X1[1])/2;
    			Y1[0]=(Y1[0]+Y1[1])/2;
    			g.drawLine(X1[0],Y1[0],X1[0],Y1[0]);
    			//System.out.println(X1[0]+" "+Y1[0]);
    			//中点连线
    			//g.drawLine(X1[0], Y1[0],X1[1],  Y1[1]);
    		}
    		if(c==2){
    			X1[0]=(X1[0]+X1[2])/2;
    			Y1[0]=(Y1[0]+Y1[2])/2;
    			g.drawLine(X1[0],Y1[0],X1[0],Y1[0]);
    			//System.out.println(X1[0]+" "+Y1[0]);
    			//g.drawLine(X1[0], Y1[0],X1[2],  Y1[2]);
    		}
    		if(c==3){
    			X1[0]=(X1[0]+X1[3])/2;
    			Y1[0]=(Y1[0]+Y1[3])/2;
    			g.drawLine(X1[0],Y1[0],X1[0],Y1[0]);
    			//System.out.println(X1[0]+" "+Y1[0]);
    			//g.drawLine(X1[0], Y1[0],X1[3],  Y1[3]);
    		}
    		
    		}
    	
    	}
    	
我很懒也很忙,下面送上上面代码区的完整代码。。。。
package draw;
	import java.awt.event.MouseListener;

	import java.awt.event.MouseEvent;
	import java.awt.event.ActionEvent;
	import java.awt.event.ActionListener;
	import java.awt.Graphics;
	import java.awt.Color;
public class DrawListener implements MouseListener,ActionListener{
	public Graphics g;
	
	String type = "";
	int x1,x2,y1,y2;
	
	int X1[] = {0,0,0,0},Y1[] = {0,0,0,0};

	public void actionPerformed(ActionEvent e){
	
		String action=e.getActionCommand();
		type=action;
	}
	
	public void setGraphics(Graphics arg){
		g=arg;
	}

    public void mousePressed(MouseEvent e){
    	x1=e.getX();
    	y1=e.getY();

    }
    public void mouseReleased(MouseEvent e){
    	x2=e.getX();
    	y2=e.getY();
    	//画直线
    	if("直线".equals(type)){
    	g.drawLine(x1, y1, x2, y2);}
    	//画圆
    	else if ("圆".equals(type)){
    		g.drawOval(x1, y1, 200, 200);
    	}
    	else if ("名字".equals(type)){
    		Color c=new Color(100,20,240);
    		g.setColor(c);
    		g.drawLine(x1, y1, x1+100, y1);
    		g.drawLine(x1+50, y1, x1+50, y1-50);
    		g.drawLine(x1+50, y1, x1+50, y1+150);
    		g.drawLine(x1+50, y1, x1-20, y1+120);
    		g.drawLine(x1+50, y1, x1+120, y1+120);
    		g.drawLine(x1+140, y1-50, x1+210, y1-50);
    		g.drawLine(x1+210, y1-50,x1+165,y1);
    		g.drawLine(x1+165,y1,x1+270,y1);
    		g.drawLine(x1+270,y1,x1+190,y1+150);
    		g.drawLine(x1+190,y1+150,x1+180,y1+140);
    		g.drawLine(x1+190,y1,x1+155,y1+95);
    		g.drawLine(x1+220,y1,x1+175,y1+95);
    	}
    	else if ("矩形".equals(type)){
    		g.drawLine(x1, y1, x2, y2);
    	}
   
    	else if("四个点".equals(type)){

    		int i=0;
    	   	int a;	
    	   	int b;	
    		for(;i<4;i+=1)
    		{
    		a=(int)(1+Math.random()*(800-1+1));
    		b=(int)(1+Math.random()*(800-1+1));
    		X1[i]=a;
    		Y1[i]=b;		
    		System.out.println(a+" "+b);
    		Color color=new Color(233,23,242);
    		g.setColor(color);
    		g.drawLine(X1[i], Y1[i], X1[i], Y1[i]);
    		
    		}
    		g.drawLine(X1[2], Y1[2], X1[1], Y1[1]);
    		g.drawLine(X1[2], Y1[2], X1[3], Y1[3]);
    		g.drawLine(X1[1], Y1[1], X1[3], Y1[3]);

    	}
    	
    	else if("随机数".equals(type)){

    		for(int n=1;n<100000;n+=1){
    			    	   	int c;	   	
    		c=(int)(1+Math.random()*(3-1+1));
    		//System.out.println(c);
    		if(c==1){
    			X1[0]=(X1[0]+X1[1])/2;
    			Y1[0]=(Y1[0]+Y1[1])/2;
    			g.drawLine(X1[0],Y1[0],X1[0],Y1[0]);
    			//System.out.println(X1[0]+" "+Y1[0]);
    			//中点连线
    			//g.drawLine(X1[0], Y1[0],X1[1],  Y1[1]);
    		}
    		if(c==2){
    			X1[0]=(X1[0]+X1[2])/2;
    			Y1[0]=(Y1[0]+Y1[2])/2;
    			g.drawLine(X1[0],Y1[0],X1[0],Y1[0]);
    			//System.out.println(X1[0]+" "+Y1[0]);
    			//g.drawLine(X1[0], Y1[0],X1[2],  Y1[2]);
    		}
    		if(c==3){
    			X1[0]=(X1[0]+X1[3])/2;
    			Y1[0]=(Y1[0]+Y1[3])/2;
    			g.drawLine(X1[0],Y1[0],X1[0],Y1[0]);
    			//System.out.println(X1[0]+" "+Y1[0]);
    			//g.drawLine(X1[0], Y1[0],X1[3],  Y1[3]);
    		}
    		}
    	}	
    }   
    public void mouseClicked(MouseEvent e){}
    public void mouseEntered(MouseEvent e){}    
    public void mouseExited(MouseEvent e){}
}

展示一下最后效果

最初我们做的时候是把中点和其他点连成了线。。。很low,点了n次才出现这样子的图:
在这里插入图片描述
然后直接加了 循环,让它自己搞了几千次,成了这鬼样子,有点奇葩,它变得很有规则
在这里插入图片描述
然后我们不再输出线,直接输出几万个点,就变得更加神奇了:在这里插入图片描述
它其实展现出一种规律:当只有一个线、一个点时候,我们看不出什么东西,他们都是很普通的很无聊的,等到几千几万个弄出来后,变化就很大了。

收获

今晚最大的收获其实是胡哥最后点出来的东西:
这正是一种混沌:
举几个例子:
假如在一场大型演唱会的时候,发生了火灾,我们人类,会有很大的可能发生踩踏事件。
而大海里的鱼群,在有大鱼捕食时,那么多的鱼,他们能够完美的躲避,鱼群内部不会发生碰撞摩擦,它们是怎样做到的。
我们看蚂蚁的时候,感觉它们只是一些低级生物,没有智慧,没有想法。但是,当无数个蚂蚁聚集在一起的时候,它们就展现出来了超乎我们想象的智慧:它们能够有序的搬运食物,对抗敌人。
草原上的兔子,数量在上升到一定阶段后会下降,这些数量的关系能不能用一些方法表达出来?
面对这些问题,我现在还说不出原因和解决方案。。。。

这个世界上其实有很多东西和计算机很相似,计算机的神奇有时候在于它能模拟到现实世界。就比如这个代码,它慢慢的就展现出让人很舒适的美。

要多拓展这些领域,继续学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值