NCF参数化建筑论坛

标题: C+Z杯参赛 --【生命游戏】 [打印本页]

作者: toplay    时间: 2017-10-9 20:56
标题: C+Z杯参赛 --【生命游戏】

看到这个主题,感觉眼前一阵黑一阵白...
黑白是非,虚拟世界存黑白,真实社会乱是非...
黑夜白天,灯火通明不夜城,雾霾遮蔽少光明...
黑脸白衣,屠狗之辈多仗义,道貌岸然披羊皮...
黑与白的界线俨然已经模糊了,其实黑与白本身就存在辩证的统一
各种色彩加到一起是白色,各种色彩染料加到一起是黑色...
-----------------------------------------------------
黑与白是如此深奥的主题,有无法参透之厚重,做个【生命游戏】抛砖引玉!
1、规则制定
用正方形的格子阵列表示细胞,黑色表示生存,白色表示死亡;
每个细胞有两种状态,即存活或死亡,每个细胞与以自身为中心的周围八格细胞产生互动。

随机确定初始状态。按照规则处理一轮得到下一代细胞状态,不断迭代。
2、随机确定初始状态,实现迭代过程。
[attach]48383[/attach]
3、横向拓展,换成图像干扰的方式获得初始状态。
[attach]48385[/attach]
也可以用二维码(扫二维码加好友)
[attach]48384[/attach]
4、纵向拓展。
为了增加游戏的复杂性,可以修改游戏规则。比如,细胞的生存状态同时由父级和祖父级决定。
规则修改:
[attach]48386[/attach]
5、总结思考
生存状态受一级影响时,变化比较剧烈,容易出现全部死亡的情况,即使出现平衡状态也需要迭代很多次(比如30次左右);而,生存状态受两级影响时,很容易出现平衡状态(比如迭代10次左右)。
因为测试次数并不多,随机因素考虑也不够全面,所以结果不一定十分正确。
总体来说,作为思路拓展练习是个不错的案例。
附一张四个版本的电池截图。
[attach]48387[/attach]
----------------------------------------
[attach]48388[/attach]

大家多多交流!












作者: 疏影    时间: 2017-10-9 22:06
放个代码版的
  1. #_*_coding:UTF-8_*_
  2. #!/usr/bin/python

  3. #Author :CPF
  4. #Datatime :2017-06-03
  5. #copyright

  6. from itertools import groupby
  7. from itertools import count
  8. import random

  9. import Rhino.Geometry as rg
  10. from Grasshopper.Kernel.Data import GH_Path
  11. from Grasshopper import DataTree

  12. class Graph:
  13.     """
  14.     一个二维向量用来存储细胞的的状态值,死为0,生为1.
  15.     """
  16.     DEATH = 0
  17.     LIVE = 1
  18.     def __init__(self,row,col):
  19.         """
  20.         row行,col列,默认状态值为死
  21.         """
  22.         self.vec2 = [[Graph.DEATH for i in range(col)] for k in range(row)]
  23.         self._row = row
  24.         self._col = col
  25.         
  26.     @property
  27.     def row (self):
  28.         return self._row
  29.         
  30.     @property
  31.     def col(self):
  32.         return self._col
  33.         
  34.     def reset(self,live_rate):
  35.         """
  36.         重设细胞的的状态,live_rate为细胞的存活几率。
  37.         """
  38.         for i in range(self._row):
  39.             for k in range(self._col):
  40.                 rand_value = random.uniform(0,1)
  41.                 if live_rate > rand_value:
  42.                     self.vec2[i][k] = Graph.LIVE
  43.                 else:
  44.                     self.vec2[i][k] = Graph.DEATH
  45.         
  46.     def neighbor_live_count(self,row,col):
  47.         """
  48.         获取第row行,第col列的相邻的8个细胞的存活细胞数目
  49.         """
  50.         count = 0
  51.         neighbor = {'right_top':(-1,-1),'top':(-1,0),'left_top':(-1,1),
  52.                     'right':(0,-1),'lift':(0,1),
  53.                     'right_buttom':(1,-1),'buttom':(1,0),'left_buttom':(1,1)}
  54.         for value in neighbor.values():
  55.             if row == 0:
  56.                 neig_row = row + value[0]
  57.             else:
  58.                 neig_row = (row + value[0])%self.row
  59.             if col == 0:
  60.                 neig_col = col + value[1]
  61.             else:
  62.                 neig_col = (col + value[1])%self.col
  63.             if self.vec2[neig_row][neig_col] == Graph.LIVE:
  64.                 count = count + 1
  65.         return count
  66.         
  67.     def updates(self):
  68.         """
  69.         更新细胞的状态值
  70.         """
  71.         lists = []
  72.         for i in range(self._row):
  73.             row_list = []
  74.             for k in range(self.col):
  75.                 count = self.neighbor_live_count(i,k)
  76.                 row_list.append(count)
  77.             lists.append(row_list)

  78.         for i in range(self.row):
  79.             for k in range(self.col):
  80.                 count = lists[i][k]
  81.                 print count
  82.                 if count == 3 :
  83.                     self.vec2[i][k] = Graph.LIVE
  84.                 elif count != 2:
  85.                     self.vec2[i][k] = Graph.DEATH

  86.     def display(self):
  87.         """
  88.         显示细胞状态
  89.         """
  90.         state =[]
  91.         for row in self.vec2:
  92.             state.extend(row)
  93.         return state

  94. if bool:
  95.     graph = Graph(x,y)
  96.     graph.reset(0.4)
  97.     a = graph.display()
  98. else:
  99.     graph.updates()
  100.     a = graph.display()
复制代码

作者: skywoolf    时间: 2017-10-9 23:54
是元胞自动机吧,好久没见人弄了~手好快!
作者: 安豆    时间: 2017-10-10 09:54
围观兔子
作者: toplay    时间: 2017-10-10 10:07
安豆 发表于 2017-10-10 09:54
围观兔子

不知是何方大圣,感谢支持!
作者: toplay    时间: 2017-10-10 10:09
skywoolf 发表于 2017-10-9 23:54
是元胞自动机吧,好久没见人弄了~手好快!

抢红包抢习惯了,手快有手慢无
作者: FOREVER.M    时间: 2017-10-10 13:57
围观兔子,学习学习
作者: hababy    时间: 2017-10-15 20:29
牛逼!!!!!
作者: lzm16888    时间: 2019-12-2 07:55
学习学习。。。。。。。。。。。。。。。。。。
作者: qq1105563190    时间: 2021-1-19 00:42
ncf看到了兔神,不得了不得了
作者: chujiu    时间: 2022-8-31 10:46
高手啊 这个厉害了




欢迎光临 NCF参数化建筑论坛 (http://ncf-china.com/) Powered by Discuz! X3.2