今天是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。