自动细胞机是发生在图形用户界面上细胞生成与死去的自动游戏,以一个活着的细胞为中心的九宫格里,如果邻居中活着的细胞<2 或者 >3,则该细胞死去。如果一个死去的细胞周围邻居正好有3个活着的细胞,则该细胞重生。

自动细胞机的代码实行数据与业务分离,一共有4个类,专类专用,Cell类制造的对象Cell是最小的单位,参与了Field类的不少函数,field类主要包含了程序的数据,View类把field类呈现在画板上,CellMachine类则让View与Field发生联系,并不断重绘变化后的画报。

备注:本人对该程序的理解还不很到位,如有纰漏,欢迎斧正。

Cell类

1.返回布尔值的属性alive,用isAlive方法获取;

2.die方法把alive属性设置为false;

3.reborn方法把alive属性设置为true;

4.draw方法传入画笔g、x坐标、y坐标、尺寸size,先drawRect,判断属性alive为真后再fillRect,默认颜色为黑色。

Field类

1.有2个整数型属性width和height,一个Cell型的二维数组field。

2.在构造器中把weidth和height传入field中作为数组行列长度。

3.getWidth方法和getHeight方法用于获取属性width和height的值。

4.place方法把参数中的一个Cell传进参数中的行与列在field中的位置。

5.get方法通过参数中的row与col得到field[row][col]. 6.getNeighbor方法传进row和col两个整数,用一个ArrayList来接收邻居。遍历field[row][col]周围[(row - 1), (row + 2)]和[(col - 1), (col + 2)],并add进arrayList。

View类

1.给常量GRID_SIZE赋值为16,表示每一个Cell的尺寸为16像素。有Field型属性theField。

2.在构造器中,把传进来的每一个field赋值给theField。

3.View继承了JPanel,覆盖draw方法,在draw方法中用一个双层遍历for循环,get到theField的每一个值,判断其不为空后调用cell的draw方法。draw的横纵坐标,为所在行列乘以GRID_SIZE。

CellMachine类

1.类中只有main一个方法,制造了一个field对象,对各类的数据进行操作。

2.用一个双层for循环,用place往field中放进一个个Cell元素。

3.用一个双层for循环,用get取出field的每一个元素,并进行Math.abs < 0.2的判断,即有1/5的几率抽中某个细胞重生。

4.CellMachine继承了JFrame,对JFrame进行常规的设置(setDefaultCloseOperation setResizable setTitle setVisible等),把field传入View中,field和view在cellmachine中发生了联系。

5.用一个三层for循环,先通过规定循环的总次数,再取出field的每一个细胞。如果该细胞为活细胞,对它周围活着的邻居进行数量统计,数量 <2 或者数量 >3,则对该cell调用die方法。如果该细胞为死细胞,对它周围活着的邻居进行数量统计,数量 =3,则对该细胞调用reborn方法。

6.用一个线程,设置每运行一次休眠200毫秒。

public class Cell {private boolean alive = false;public void die(){ alive = false; }public void reborn(){ alive = true; }public boolean isAlive(){ return alive; }public void draw(Graphics g, int x, int y, int size){g.drawRect(x, y, size, size);if(alive){g.fillRect(x, y, size, size);}}
}public class Field {private int width;private int height;private Cell[][] field;public Field(int width, int height) {this.width = width;this.height = height;field = new Cell[height][width];}public int getWidth() {return width;}public int getHeight() {return height;}public Cell place(int row, int col, Cell o){Cell ret = field[row][col];field[row][col] = o;return ret;}public Cell get(int row, int col){return field[row][col];}public Cell[] getNeighbor(int row, int col){ArrayList<Cell> list = new ArrayList<>();for (int i = -1; i < 2; i++) {for (int j = -1; j < 2; j++) {int r = row+i;int c = col+j;if(r > -1 && r < height && c > -1 && c < width && !(r == row && c == col)){list.add(field[r][c]);}}}return list.toArray(new Cell[list.size()]);}
}public class View0 extends JPanel{
//    private static final long serialVersionUTD = -5258995676212660595L ;  //???private static final int GRID_SIZE = 16;private Field theField;public View0(Field field){theField = field;}@Overridepublic void paint(Graphics g) {super.paint(g);for (int row = 0; row < theField.getHeight(); row++) {for (int col = 0; col < theField.getWidth(); col++) {Cell cell = theField.get(row,col);if(cell != null){cell.draw(g, col*GRID_SIZE, row*GRID_SIZE, GRID_SIZE);}}}}public Dimension getPreferredSize(){return new Dimension(theField.getWidth()*GRID_SIZE+1, theField.getHeight()*GRID_SIZE+1);}
}public class CellMachine {public static void main(String[] args) {Field field = new Field(30,30);for (int row = 0; row < field.getHeight(); row++) {for (int col = 0; col < field.getWidth(); col++) {field.place(row,col,new Cell());}}for (int row = 0; row < field.getHeight(); row++) {for (int col = 0; col < field.getWidth(); col++) {Cell cell = field.get(row,col);if(Math.random() < 0.2){cell.reborn();}}}View0 view = new View0(field);JFrame frame = new JFrame();frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setResizable(false);frame.setTitle("Cells");frame.add(view);frame.pack();frame.setVisible(true);for (int i = 0; i < 1000; i++) {for (int row = 0; row < field.getHeight(); row++) {for (int col = 0; col < field.getWidth(); col++) {Cell cell = field.get(row,col);Cell[] neighbor = field.getNeighbor(row,col);int numOfLive = 0;for (Cell c : neighbor) {if(c.isAlive()){numOfLive++;}}System.out.print("["+row+"]["+col+"]:");System.out.print(cell.isAlive()?"live":"dead");System.out.println(":"+numOfLive+"-->");if( cell.isAlive() ){if(numOfLive < 2 || numOfLive > 3){cell.die();System.out.println("die");}}else if(numOfLive == 3){cell.reborn();System.out.println("reborn");}System.out.println();}}System.out.println("UPDATE");frame.repaint();try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}}}
}

翁恺老师 | 细胞自动机相关推荐

  1. c++基础入门(根据浙大翁恺老师视频整理)

    把以前的笔记搬上来一下 根据浙大翁恺老师视频整理 https://www.bilibili.com/video/BV1yQ4y1A7ts?p=2 01第一个c++程序 02什么是对象 通过操作访问数据 ...

  2. 浙大翁恺pat练习题_单词长度(翁恺老师C语言入门第八周测试题1)

    [更新]:写好程序后没在mooc的线上测试系统跑过,有部分格式上的bug,目前已经更新了,线上测试通过. 题目内容: 你的程序要读入一行文本,其中以空格分隔为若干个单词,以'.'结束.你要输出这行文本 ...

  3. 翁恺老师 | 城堡游戏解读

    这是我自己对城堡游戏的解读,解读后自己才不会囫囵吞枣地假装自己懂了. 城堡游戏是一个根据目前所处的房间与方向,来指明下一步所处位置与出口的小游戏. 翁恺老师讲课的精妙之处在于,从最简单也最缺乏设计感的 ...

  4. [翁恺老师 城堡游戏(无bug

    @[翁恺老师 城堡游戏(无bug) ]( Game.java类 package Castle; /***注意,这里的package 你们自己记得修改import java.util.*;public ...

  5. 翁恺老师Java进阶城堡游戏源码

    刚开始学习Java,在比站发现了翁恺老师的课程,讲的很不错.Castle源码我找了很久都没有找到老师课上自己讲的那个程序,于是我决定做一回搬运工,自己敲了出来,现在也方便一下大家,大家一起学习,一起进 ...

  6. 浙江大学翁恺老师的城堡游戏源代码

    许多小伙伴们可能因为课程关闭无法查看课件了,所以下面我来给出翁恺老师的源代码 Game.java中的: package castle;import java.util.*;public class G ...

  7. 中国大学Mooc浙大翁恺老师《零基础学Java语言》编程作业

    感谢中国大学Mooc平台给我学习的机会,感谢翁恺老师深入浅出的讲解. 写此文为纪念我从无到有的学习和成长.便于以后回顾. 另外: 此答案仅供参考,用于启发没有思路的同学.切勿照搬,自欺欺人. 提交作业 ...

  8. 中国大学Mooc浙大翁恺老师《零基础学Java语言》编程作业(续)(5~ 7)

    感谢中国大学Mooc平台给我学习的机会,感谢翁恺老师深入浅出的讲解. 写此文为纪念我从无到有的学习和成长.便于以后回顾. 此答案仅供参考. 提交作业时需把 public class Homework_ ...

  9. 翁恺老师 Python 暑期夏令营开营 | Mo-Tutor全新教学模式上线

    (已更新至最新版本) 为了强化大家对Python学习的认识,我们邀请到浙江大学计算机学院的教学名师--"中文慕课第一人"."浙江大学永平杰出教学贡献奖"获得者. ...

  10. 程序设计入门——C语言(翁恺老师)我的作业

    程序设计入门--C语言(翁恺老师)我的作业 第一周 程序设计与C语言 1 输出"Hello World"(5分) 题目内容: 请输出一行,内容为 Hello World 请注意大小 ...

最新文章

  1. 理解标准输出流方法:WriteLine和Write
  2. window 命令行大全
  3. kettle的基本介绍
  4. 云计算的新界面—Kubernetes容器技术
  5. 数据导出生成word附件使用POI的XWPFTemplate对象
  6. matlab 反激变压器,基于matlab的反激电路设计..doc
  7. 从头算和密度泛函理论_PHP Laravel教程–如何从头开始构建关键字密度工具
  8. Poj(3615),Floyd,最大值中的最小值
  9. 向量的大小和方向,零向量的方向_3
  10. C语言读取raw格式图像,求指导,如何用c语言实现读取*.raw格式图像
  11. GAN生成式对抗网络简介及MINST实现
  12. Week8 CSP模拟 T2 HRZ学英语
  13. dreamer Waver cc 2014 安装失败解决
  14. mysql存密码_存储用户ID和密码到mysql数据库的方法
  15. 购买Apple移动硬盘
  16. wing101 缩进不管用_与lg wing一起使用最有用的双屏手机
  17. linux 虚拟光驱软件,Ubuntu Linux下强大的虚拟光驱软件 :AcetoneISO
  18. C语言-小黄鸭☞循环结构while
  19. 关于srand()与rand()函数的理解-----必看系列
  20. 水晶报表(Crystal Report)- 水晶报表常见问题总结

热门文章

  1. 如何用3DsMax制作笔记本电脑
  2. Java通过坐标点进行拟合函数
  3. 数学建模(十)博弈论
  4. uploadify ajax,Uploadify预防未来的Ajax请求
  5. 抽象代数基本概念(一):代数系
  6. 数字图像处理冈萨雷斯版学习(一)
  7. 数字图像处理(冈萨雷斯)学习 第二章 数字图像基础
  8. 数据中心存储改造方案
  9. 远程计算机上不接受445端口,服务器禁止远程445端口
  10. 修改计算机系统参数软件,机器码修改专家(修改电脑机器码工具) v2.0官方版