一、任务:

能够实现这次的小图形,不得不说真的很开心。图形出来的瞬间真的很激动,之前的纠结,郁闷一扫而空。我想这就是程序的魅力吧。

这次的任务是

1.平面上随机选A,B,C三个点。再随机选一个点,记为P。

2.有一个三面色子,每丢一次,则选中ABC三个中一点。

开始游戏:

1.重复丢色子,如果选中A,则取A和P的中点P1,画黑,

2.如果选中B,则取B和P1的中点P2,画黑

3.如果选中A,则取A和P2的中点P3,画黑

4….一直重复(如每点一下鼠标,丢10000次色子

二、思路:

1.通过确立事件源,来确定监听方法,这里和画图的基本相识;

2.加上监听机制之后,public void mouseClicked(MouseEvent e) {}方法中取得三点,(当然在其他的方法中取得也是一样的),取得三个点,并且存好(这是重点),再随机选一个点,记为P。其他的当做分别作为abc点。

3.加上一个for循环,每点击一次循环10000次,丢10000次色子;

4.在for循环中确认丢色子的方法:利用随机数,int s = rand.nextInt(3);随机值取0,1,2.当取零时,选中的是A;当取1时,抛出的色子是B,当取2时,抛出的是C;

5.先求出中点,再来画线。因为是中点都会变化,所以画完之后要改变它的值。

三、程序:

package fenxingshuzu;import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;import javax.swing.JFrame;
/** 1.新建一个listener类事件处理类继承MouseListener;* 2.新建Tuxing类,实现窗口,实现画布;* 3.把Tuxing类中的画布传到Listener类中去:首先在Listener类中声明对象,在先建一个方法来取得画布;* 在Tuxing类中实例化一个Listener对象,调用刚刚定义的方法,把Listener的画布传过去。*/public class Tuxing {public static void main(String[] args){Tuxing T=new Tuxing ();T.initUT();}public void initUT(){JFrame jf=new JFrame();//实例化一个JFrame对象;jf.setTitle("分形和数据结构");//设置窗体的标题;jf.setSize(400, 500);//窗体的大小jf.setLayout(new FlowLayout());//设置窗体的布局为流失布局;jf.setVisible(true);//设置窗体可见;jf.setLocationRelativeTo( null);//设置窗体显示的位置;jf.setDefaultCloseOperation(3);//设置关闭窗体的按钮;Graphics  g=jf.getGraphics();//设置画布;jf.getContentPane().setBackground(Color.WHITE);//设置窗体画布的颜色;((Graphics2D) g).setColor(Color.BLUE);//转化g的类型,Graphics2D是Graphics的子类;//设置画笔的颜色;Listener l=new Listener();l.setG(g);jf.addMouseListener(l);}
}

Tuxing.java

Listener.java

import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;/** 1.实例化接口中的方法;* 2.设置8个变量来存储ABCP四个点的坐标;* 3.定义一个变量i实现随机数;* 4.定义一个变量Count来实现存储四个数ABCP的坐标;* ctrl+shift+f,调整程序结构;*/
public class Listener implements  MouseListener {Graphics g;private int  x1, y1, x2, y2, x3, y3, x4, y4;//x, y,private int i;//, ex, ey;int count = 0;private Random rand = new Random();/*之前是在for循环中定义实例化的rand,增加了时间复杂度和空间复杂度,每次循环都会实例化一个rand变量,所以不要再循环中定义变量;*/public void setG(Graphics g) {this.g = g;}//利用快捷键可以添加。单击右键,点击Sourse(shift+alt+s),然后点击Generate  Getters and Setters;
public void mouseClicked(MouseEvent e) {if (count < 4){ //用变量控制存储四个值;
//            x = e.getX();
//            y = e.getY();
            g.drawLine(e.getX(), e.getY(), e.getX(), e.getY());/** 之前是写的四个并列的if语句,所以每执行一次都会调用所有的if语句,同样的增加了程序运行的时间,增加了时间复杂度;* 所有要加上else if;来减少程序运行的时间。*/if (count == 0){//存储第一个值A x1 = e.getX();//之前是写的x1=x;这样增加了空间复杂度,时间复杂度;y1 = e.getY();//改成x1=e.getY();可以少定义一个变量;减少占用的空间;} else if (count == 1) {//存储第二个值B x2 = e.getX();y2 = e.getY();} else if (count == 2) {//存储第三个值Cx3 = e.getX();y3 = e.getY();} else if (count == 3) {//存储第四个值P;x4 = e.getX();y4 = e.getY();}count++;}    if (e.getClickCount() == 2) {for (i = 0; i <= 10000; i++) {int s = rand.nextInt(3);//这个不能放在for循环外边;随机数的大小;0到3;取值取0,1,2;if (s == 0) {//当随机数取0时,色子面为A;x4 = (x1 + x4) / 2;y4 = (y1 + y4) / 2;} else if (s == 1) {//当随机数取1时,色子面为B;x4 = (x2 + x4) / 2;y4 = (y2 + y4) / 2;} else {//当随机数取2时,色子面为C。x4 = (x3 + x4) / 2;y4 = (y3 + y4) / 2;}g.drawLine(x4, y4, x4, y4);
/*之前的写法:*         ex = (x1 + x4) / 2;ey = (y1 + y4) / 2;g.drawLine(ex, ey, ex, ey);x4 = ex;y4 = ey; 虽然程序没有错但是增加了一个变量,程序运行所需要的空间增加了;而且每个if语句中都是相同的(画线是在if语句中画,画完在转化);没有简化语句,没有把相同的语句拿出来;增加程序运行的时间;也就是增加了程序的时间和空间复杂度;所以应该注意当所有if语句中,有些语句是一样的时可以挑出来写,写在程序外面;要学会减少不必要的语句;*/ } count = 0;//count值变为0,然后开始下一个图形。不然只能画一个图形; 
}} 

public void mousePressed(MouseEvent e) {/* * // ((Graphics2D )g).setStroke(new BasicStroke(10)); if(count<4){ x= * e.getX(); y = e.getY(); g.drawLine(x, y, x, y);  else if(count==0){ x1=x; * y1=y; } if(count==1){ x2=x; y2=y; } if(count==2){ x3=x; y3=y; } * else if(count==3){ x4=x; y4=y; } count++; } */ } 

public void mouseReleased(MouseEvent e) { } @Overridepublic void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }

运行结果:

四:注意点:

要注意程序的时间和空间复杂度;

1.申明定义变量不要在循环中;

2.相同的代码不要重复;在if语句中,要实现的功能一样时,可以提出来写;

3.尽量减少变量的定义,简化程序;

4.在使用if语句是。还有并列的if语句是,要用else if语句。减少时间和空间复杂度。

首先,理清楚思路再来写程序。

                                                                                                                                                                       

转载于:https://www.cnblogs.com/hesi/p/5576184.html

分形与数据结构第一篇(神奇的色子)相关推荐

  1. JS版数据结构第一篇(栈)

    前端入行门槛低,人员参差不齐 前端就是写页面的 前端的人都不懂数据结构和算法 背景 相信大家在社区经常会听到类似以上的话 由于前端上手比较快,而且平时开发时大部分写的都是业务逻辑以及交互,常常导致我们 ...

  2. 分形与数据结构第二篇

    一.分形之 迭代实现分形 本次的图形都是在之前的画图工具中实现的. 首先,还是和原来一样建立一个JButton元素组件,然后加上监听方法:再在public void mouseClicked(Mous ...

  3. 第一篇:Django基础

    Django框架第一篇基础 一个小问题: 什么是根目录:就是没有路径,只有域名..url(r'^$') 补充一张关于wsgiref模块的图片 一.MTV模型 Django的MTV分别代表: Model ...

  4. 《C语言编程魔法书:基于C11标准》——第一篇 预备知识篇 第1章 C魔法概览1.1 例说编程语言...

    本节书摘来自华章计算机<C语言编程魔法书:基于C11标准>一书中的第1章,第1.1节,作者: 陈轶 更多章节内容可以访问云栖社区"华章计算机"公众号查看. 第一篇 预备 ...

  5. 查询优化器内核剖析第一篇

    查询优化器内核剖析第一篇 查询优化器内核剖析第一篇 查询优化器内核剖析第二篇:产生候选执行计划&执行计划成本估算 查询优化器内核剖析第三篇:查询的执行与计划的缓存 & Hint提示 查 ...

  6. JAVA后端面试100 QA之第一篇

    转载自  JAVA后端面试100 Q&A之第一篇 1. synchronized和reentrantlock异同 相同点 都实现了多线程同步和内存可见性语义 都是可重入锁 不同点 实现机制不同 ...

  7. .net开发笔记(十三) Winform常用开发模式第一篇

    上一篇博客最后我提到"异步编程模型"(APM),之后本来打算整理一下这方面的材料然后总结一下写篇文章与诸位分享,后来在整理的过程中不断的延伸不断地扩展,发现完全偏离了"异 ...

  8. 重温《数据库系统概论》【第一篇 基础篇】【第4章 数据库安全性】

    本篇内容为中国人民大学教授王珊.萨师煊的<数据库系统概论>自学课程的复习笔记,学习视频源于小破站(传送门),对应视频P28-P31,属教材"[第一篇 基础篇]"的&qu ...

  9. 重温《数据库系统概论》【第一篇 基础篇】【第2章 关系数据库】

    本篇内容为中国人民大学教授王珊.萨师煊的<数据库系统概论>自学课程的复习笔记,学习视频源于小破站(传送门),对应视频P9-P15,属教材"[第一篇 基础篇]"的&quo ...

最新文章

  1. 干货 | VMAF视频质量评估在视频云转码中的应用
  2. 解决postgresql数据库localhost可以连接,ip连接不了的问题
  3. POJ1321 棋盘问题(DFS)
  4. 与html相关的知识点整理
  5. 【Storm】storm安装、配置、使用以及Storm单词计数程序的实例分析
  6. ubuntu 安装lamp
  7. crawler_x-requested-with 请求头
  8. leetcode349. 两个数组的交集
  9. 迭代器模式(Iterator)解析例子
  10. 智慧交通不能用WiFi,还能算是智慧出行吗?
  11. ad走线打过孔_ad走线时放置过孔
  12. 在web h5 上 js 绘制汉字 按笔画绘制汉字 汉字拼音 多音字 笔画繁体字 cnchar
  13. 计算机应用主要学PS,计算机应用专业PS模块考试标准.doc
  14. linux把m4s格式转换mp4,m4s格式(B站m4s怎么转换成MP4)
  15. java 苹果vcf解析_iOS开发- 生成/解析.vcf文件
  16. Verilog设计流水灯(一)
  17. 这份职业我有多少期许
  18. Opencv项目实战:01 文字检测OCR(2)
  19. 多线程模拟火车站售票并发
  20. IDEA设置中的 Hard wrap 和 Soft wrap

热门文章

  1. 【Oracle】DBA_AUDIT_TRAIL表SES_ACTIONS字段对应的操作列表
  2. Safe handle has been closed异常的原因及解决思路
  3. 用延迟加载解决CNZZ加载慢的问题
  4. centos7在线yum安装mysql时官方镜像下载过慢的解决方案
  5. 如何在JavaScript中获取字符串数组的字符串?
  6. 创建单实例WPF应用程序的正确方法是什么?
  7. Win10电脑安装打印机驱动运转打印机的方法
  8. popwin.js 弹出小窗口,图片预览;
  9. Pattern类正则表达式的编译表示形式
  10. python标准库os的方法listdir_Python3 os.listdir() 方法