分形和数据结构之抛色子

今天是2016年6月5日,必须要说,今天才真正懂得身为一个程序员的幸福。今天是我和何思小伙伴在蓝杰十多天的学习以来第一次独立写代码。虽然我们写的慢,很多方法的运用都不是很熟练,在今天的写代码的过程中甚至还怀疑自己的智商,BUT当那个美丽的图形出现的那一瞬间,世界都美丽了,熊哥都变帅了! 当然我也要总结一下我暴露无遗的缺点

第一点就是还没有想清楚思路就开始动手写,没有总局思想降低的不止是速度,还会使自己思维混乱;

第二点就是性格太轴,第一步没有写出来就绝对不会考虑第二步,其实可以把后面的写出来。再根据运行的结果不断去改进自己的代码;

第三点是没有充分考虑到优质程序的时间复杂度和空间复杂度;

下面就来展示一下我的成果:

 

package 文雅0605;

 

import java.awt.FlowLayout;

import java.awt.Graphics;

 

import javax.swing.JFrame;

 

public class paintingFrame  extends JFrame{

      public static void main(String[] args) {

        paintingFrame pf =new paintingFrame();

        pf.initUI();

      }

      public void initUI(){

             setTitle("美丽的图画");

             setSize(600,500);

             setDefaultCloseOperation(3);

             setLocationRelativeTo(null);

             setLayout(new FlowLayout());

             setVisible(true); 

             Graphics g = getGraphics();

             paintingListener pf = new paintingListener();

             addMouseListener(pf);

             pf.setGraphics(g);

      }

}

 

 

 

package 文雅0605;

 

import java.awt.BasicStroke;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;

import java.util.Random;

 

public class paintingListener implements MouseListener {

      public int x1, y1, x2, y2, x3, y3, x4, y4;

      public int x, y;

      public int i = 0;// 控制点击数

      public int s;// 控制会扔到A,B,C中的哪一个

      public int j;// 控制次数

      // public int ex, ey;

      private Graphics g;

 

      public void setGraphics(Graphics gra) {

             g = (Graphics2D) gra;

      }

 

      public void mouseClicked(MouseEvent e) {

 

             // ((Graphics2D) g).setStroke(new BasicStroke(3));

//原来的做法:

for(i=0;i<4;i++){

x1 = e.getX();

y1 = e.getY();

x2 = e.getX();

y2= e.getY();

x1==x2;

y1==y2;

g.drawLine(x1, y1, x2, y2);

}

结果就是:四个点之后并没有停止继续画点,因为public void mouseClicked(MouseEvent e) {}本来就是一个循环了,再在方法体里面加上一个循环是画蛇添足了,他会在画完四个点之后的下一次点击后继续画点,然后就有无数个点了。这种写法不仅是一种静态的死思维,更是在浪费时间和空间,而且没有保存。真是醉醉的了。

然而我在一条道上走到了黑,当我得知public void mouseClicked(MouseEvent e){}是一个循环的时候,我的第一反应是break。于是乎我是这么写的:

Switch(i++){

Case  i==0:

g.drawLine(x1, y1, x2, y2);

break;

case  i==1:

g.drawLine(x1, y1, x2, y2);

case  i==2:

g.drawLine(x1, y1, x2, y2);

case  i==3:

g.drawLine(x1, y1, x2, y2);

}

依然没有保存,而且吧程序复杂化了。

 

             if (i < 4) {

                    x = e.getX();

                    y = e.getY();

                    g.drawLine(x, y, x, y);

                    if (i == 0) {//一定要把点存起来

                           x1 = x;

                           y1 = y;

                    }

 

                    else if (i == 1) {

                           x2 = x;

                           y2 = y;

                    }

 

                    else if (i == 2) {

                           x3 = x;

                           y3 = y;

                    }

 

                    else if (i == 3) {

                           x4 = x;

                           y4 = y;

                    }

                    i++;

             }

             else {//这个地方我原来写的是:if(i>=4){}这个直接导致我运行程序的结果是:点到第四个点的时候图像就出来了,用elsek就会是在第五个点后才出来图像。其原因不是代码的错,是我自己的逻辑错了。而且也会加大代码的时间复杂度和空间复杂度。

                    Random rand = new Random();

                    for (j = 0; j < 1900000; j++) {

 

                           int s = rand.nextInt(3);// 随机决定要画的点数

                           if (s == 0) {// 如果选中的是A点

                                  x4 = (x1 + x4) / 2;

                                  y4 = (y1 + y4) / 2;

                                  // ex = Math.abs(x1 - x4) / 2 + Math.min(x1, x4);

                                  // ey = Math.abs(y1 - y4) / 2 + Math.min(y1, y4);

                                  // g.drawLine(ex, ey, ex, ey);

                                  // x4 = ex;

                                  // y4 = ey;//这么写加大了代码的时间复杂度

                           } else if (s == 1) {// 如果选中的是B点

                                  x4 = (x2 + x4) / 2;

                                  y4 = (y2 + y4) / 2;

                                  // ex = Math.abs(x2 - x4) / 2 + Math.min(x2, x4);

                                  // ey = Math.abs(y2 - y4) / 2 + Math.min(y2, y4);

                                  // g.drawLine(ex, ey, ex, ey);

                                  // x4 = ex;

                                  // y4 = ey;

                           } else {// 如果选中的是C点

                                  x4 = (x3 + x4) / 2;

                                  y4 = (y3 + y4) / 2;

                                  // ex = Math.abs(x3 - x4) / 2 + Math.min(x3, x4);

                                  // ey = Math.abs(y3 - y4) / 2 + Math.min(y3, y4);

                                  // g.drawLine(ex, ey, ex, ey);

                                  // x4 = ex;

                                  // y4 = ey;

                           }

                           g.drawLine(x4, y4, x4, y4);

                           i = 0;//使得能够重新再绘制图形

                    }

             }

      }

 

      /**

       * Invoked when a mouse button has been pressed on a component.

       */

      public void mousePressed(MouseEvent e) {

 

      }

 

      /**

       * Invoked when a mouse button has been released on a component.

       */

      public void mouseReleased(MouseEvent e) {

 

      }

 

      /**

       * Invoked when the mouse enters a component.

       */

      public void mouseEntered(MouseEvent e) {

 

      }

 

      /**

       * Invoked when the mouse exits a component.

       */

      public void mouseExited(MouseEvent e) {

 

      }

 

}

 

 

胡哥说,没有写错的程序。但是为什么运行结果和你想的不一样呢?因为你不了解它的思维,它的构造。所以以后写程序不仅要专注于消除语法上的bug,更要注重思维上的bug。

转载于:https://www.cnblogs.com/java-7/p/5575612.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值