分形和数据结构之抛色子

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

时间: 2024-11-06 15:51:44

分形和数据结构之抛色子的相关文章

分形与数据结构第二篇

一.分形之 迭代实现分形 本次的图形都是在之前的画图工具中实现的. 首先,还是和原来一样建立一个JButton元素组件,然后加上监听方法:再在public void mouseClicked(MouseEvent e) {}方法中实现图形: else if (s.equals("图形2")) { double x1 = 0, y1 = 0, x2 = 0, y2 = 0; double a = -2, b = -2, c = -1.2, d = 2; for (int n = 0; n

分形之概率学下的green tree

     今天做的是分形之随机概率,可以和以前做的那个抛色子的做法非常相似,抛色子是用随机点数控制图形,今天做的树叶图形只是用概率的做法去控制图形而已,做法是如出一辙的: //图形界面 package tree0618; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.Graphics2D: import javax.swing.JFrame; public

几个概率题

原文:http://www.cnblogs.com/orchid/p/4067042.html 1,一根木棒,截成三截,组成三角形的概率是多少? 2,抛一个六面的色子,连续抛直到抛到6为止,问期望的抛的次数是多少? 3,一个木桶里面有M个白球,每分钟从桶中随机取出一个球涂成红色(无论白或红都涂红)再放回,问将桶中球全部涂红的期望时间是多少? 4,你有一把宝剑.每使用一个宝石,有50%的概率会成功让宝剑升一级,50%的概率会失败.如果宝剑的级数大于等于5的话,那么失败会使得宝剑降1级.如果宝剑的级

凯利公式的模拟验证

凯利公式的模拟验证 场景:一个赌局,你跟庄家.你出 1 元,庄家出 0.96元.赌金数目可随之翻倍.    根据每次抛色子的结果的单双决定胜负.    胜者得到双方所下的赌金,计 1.96 元. 问题:如何下注才能做到,风险最小,盈利最大呢? 答案:凯利公式. 凯利公式的作用: 根据赔率与胜率,得出你每次的资金下注比例 公式的两种形式: 公式:(期望报酬率)/(赔率) 公式:(盈利概率×盈利金额-亏损概率×亏损额)/(盈利额 / 亏损额) 凯利公式最初为 AT&T 贝尔实验室物理学家约翰·拉里·

ZOJ 3329-One Person Game(概率dp,迭代处理环)

题意: 三个色子有k1,2,k3个面每面标号(1-k1,1-k2,1-k3),一次抛三个色子,得正面向上的三个编号,若这三个标号和给定的三个编号a1,b1,c1对应则总和置零,否则总和加上三个色子标号和,直到总和不小于n时结束,求抛色子的期望次数. 分析: 该题状态好分析 dp[i]表示和为i时的期望次数,dp[0]是答案 dp[i]=sum(dp[i+tmp]*p[tmp])+dp[0]*p0+1(tmp是三个色子可得到的标号和); 第一次看到这样的方程不怎么解,看了题解才知道用迭代法,每个d

Light oj 1030 概率DP

D - Discovering Gold Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status Practice LightOJ 1030 Description You are in a cave, a long cave! The cave can be represented by a 1

Codeforces Round #365 (Div. 2) A

Description Mishka is a little polar bear. As known, little bears loves spending their free time playing dice for chocolates. Once in a wonderful sunny morning, walking around blocks of ice, Mishka met her friend Chris, and they started playing the g

Mybatis整合Spring实现事务管理的源码分析

一:前言 没有完整看完,但是看到了一些关键的地方,这里做个记录,过程会有点乱,以后逐渐补充最终归档为完整流程:相信看过框架源码的都知道过程中无法完全确定是怎样的流程,毕竟不可能全部都去测试一遍 ,但是看的过程中灵感的显现很重要(就是直觉知道接下来的步骤是什么应该是什么之类的,但是这个自觉是猜的而非蒙的,即过程里是有往会递推看到了一些关键点的而不是抛色子来确定是哪个子类) ,因此自己写的时候也无法将看的过程里产生的想法写得很细,过程也有点跳,如果大家有疑问最好自己去验证(方式就是搜索然后看哪里调用

Flask最强攻略 - 跟DragonFire学Flask - 第八篇 实例化Flask的参数 及 对app的配置

Flask 是一个非常灵活且短小精干的web框架 , 那么灵活性从什么地方体现呢? 有一个神奇的东西叫 Flask配置 , 这个东西怎么用呢? 它能给我们带来怎么样的方便呢? 首先展示一下: from flask import Flask app = Flask(__name__) # type:Flask app.config["DEBUG"] = True 这句 app.config["DEBUG"] = True 可以实现的功能可刺激了 代码只要发生改动,自动