一点关于细胞自动机的见解

个人非常喜欢翁恺老师的网课。在学习细胞自动机之后产生了一点自己的想法。在这里写出来,本人现在的水平尚且达不到Java入门,一点愚昧见解还请大佬们海涵。

贴上源码

感谢@一条sin大佬贴出来的代码,原文链接https://blog.csdn.net/weixin_42546792/article/details/101168863

小弟在这里CTRL C+V一下。

package cellmachine;
import javax.swing.JFrame;
import cell.Cell;
import field.*;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.5) {cell.reborn();}}}View view =new View(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.print(":"+numOfLive+"-->");if(cell.isAlive()) {if(numOfLive<2||numOfLive>3) {cell.die();System.out.print("die");}}else if(numOfLive==3) {cell.reborn();System.out.print("reborn");}System.out.println();}}System.out.println("UPDATE");frame.repaint();try {Thread.sleep(200);} catch(InterruptedException e) {e.printStackTrace();}}}}
————————————————
版权声明:本文为CSDN博主「一条sin」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42546792/article/details/101168863
package field;
import java.util.ArrayList;
import cell.Cell;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<Cell>();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()]);}
}
————————————————
版权声明:本文为CSDN博主「一条sin」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42546792/article/details/101168863
package field;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.*;
import cell.Cell;public class View extends JPanel {private static final long serialVersionUID=-5258995676212660595L;private static final int GRID_SIZE=16;private Field theField;public View(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);}}}}@Overridepublic Dimension getPreferredSize() {return new Dimension(theField.getWidth()*GRID_SIZE+1,theField.getHeight()*GRID_SIZE+1);}
}
————————————————
版权声明:本文为CSDN博主「一条sin」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42546792/article/details/101168863
package cell;import java.awt.*;public class Cell {private boolean alive=false;public void reborn() {alive=true;}public boolean isAlive() {return alive;}public void die() {alive=false;}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);}}
}
————————————————
版权声明:本文为CSDN博主「一条sin」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42546792/article/details/101168863

我的思考

在源码中,首先生成网格以及初代细胞。在后续的更迭中,每次判断都是从 row=0 到 height-1;从col=0到 width-1。那我的理解就是如此行列递增的产生先后顺序对后面的细胞不公平。举个简单的例子:如下图所示:

假如循环是自左向右,自上向下扫描每一个细胞。我选取了一个孤立细胞团,就是除了这三个黑的,周围全都是白的。
对于上1(上面那排第一个,下同),周围俩活得,所以状态不变。
那么对于上2由于周围邻居达到三个,所以会重生,即在下一轮绘图时,格子会变成黑色。
但是!但是!但是!重点来了,在判断完上2之后,上3在扫描邻居状态的时候会判断定出邻居中有三个活着的细胞,那么复活,但是实际上目前他们呢周围只有中2和中3是活着的,不满足复活条件,按理说在一下轮应该状态不变。可是由于先判断了上2,上2 的状态变成了alive,所以他们靠着目前版图上还不存在上2获得了重生。
那么同理,中1判断周围俩(上2和中2)活得,那我也不死了。
中二,我周边四个活得(上2,上3,中1和中3),那我死了。
。。。。。。。。。
但是实际上呢,不应该仅仅是中2和下2重生,中1和中3死亡吗???

由于先判断了上面一排,改变了他们细胞的状态,就造成了下面两排的细胞不按剧本走。实际上这个状态是该细胞未来(下一轮)才会出现的结果。但是在代码里,判断的依据仅仅是isAlive。我个人觉得对后面的细胞不公平。判断不合理。

小小的修改

在实现业务逻辑的代码里,

for(Cell c:neighbor) {if(c.isFill()) {numOfLive++;//周围共计多少活细胞}}

邻居的数量不依赖isAlive,我用图片中是否被填充颜色判断,周围有几个填充色,就是几个活着的细胞。

在cell的代码中,

 private boolean fullfill=false;public boolean isFill() {return fullfill;}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);this.fullfill = true;}elsethis.fullfill = false;}

引入 isFill,来判断目前的窗口里的格子状态。
每一轮frame.repaint之后,更新每个cell的填充状态,以此来判断下一轮的生或死。
同样,主函数中的判断条件也要改变。

if(cell.isFill()) {if(numOfLive<2||numOfLive>3) {cell.die();System.out.print("die");}}
else if(numOfLive==3) {cell.reborn();System.out.print("reborn");}

就写这些吧,其实挺无聊的,就是脑子一抽,突然这么想了。改了几行代码而已。见笑了。

日敲代码三千行,不辞长作死肥宅。

关于翁恺老师Java网课中细胞自动机的一点点想法相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  10. 上海建桥学院计算机网课,宅家当学霸,快来pick网课中的“神仙笔记”~

    原标题:宅家当学霸,快来pick网课中的"神仙笔记"~ 不知不觉开学已经快一个多月了 不知道在家上网课的大家 是否已经适应了呢? 作为我们"学习伴侣"的笔记 是 ...

最新文章

  1. 使用AMDU工具从无法MOUNT的DISKGROUP中抽取数据文件
  2. 【AI大咖】ML宗师乔教主,Science评选的全世界最有影响力的计算机科学家
  3. Err Welcoe to emergency mode
  4. android 环境配置和安装, Android系统包说明,基本控件,常用代码,ADB 命令行,APK文件确解,小技艺,...
  5. 《软件设计精要与模式》推荐序三
  6. BZOJ1031: [JSOI2007]字符加密Cipher
  7. 美团王兴:互联网下半场基本功不过关 活下去都很难
  8. java graphics旋转_Java图像之自定义角度旋转(实例)
  9. 【小知识】二分类问题,应该选择sigmoid还是softmax?
  10. CSS:display和visibility隐藏的区别
  11. 游戏及开发人员的认识
  12. MyEclipse的破解
  13. BT1120协议详解
  14. MySQL8数据恢复
  15. 信息技术c语言试题,全国信息技术水平考试C语言考试试卷.doc
  16. MAC(多路访问控制)协议
  17. SiT1602:SiTime低功耗单端有源晶振
  18. PV、UV、IP分别是什么意思
  19. 多少秒算长镜头_电影术语中长镜头是什么意思?
  20. 混合现实手术规划模拟系统——阿里云资源+MR技术在医疗行业的典型应用

热门文章

  1. PCWORLD评出的十大杀毒软件
  2. 蓝桥杯2015年第六届C/C++省赛A组第三题-奇妙的数字
  3. 金蝶K3 Wise—BOM批量多级展开
  4. 配置HP LaserJet M1536dnf MFP打印机通过TCPIP共享多台计算机
  5. 论文中三线式表格的快速插入(word)
  6. java模块化实践(基于jdk11)-1
  7. 2019年 Github 上最热门的 Java 开源项目
  8. mx250显卡天梯图_mx250显卡天梯图_2020最新笔记本显卡天梯图,看看你的显卡排在哪里吧...
  9. 计算机操作系统|汤小丹|第四版|习题答案(五)
  10. PopClip:你会热爱的文本穿梭机