NCF参数化建筑论坛
标题: C+Z杯参赛 --【生命游戏】 [打印本页]
作者: toplay 时间: 2017-10-9 20:56
标题: C+Z杯参赛 --【生命游戏】
黑与白
看到这个主题,感觉眼前一阵黑一阵白...
黑白是非,虚拟世界存黑白,真实社会乱是非...
黑夜白天,灯火通明不夜城,雾霾遮蔽少光明...
黑脸白衣,屠狗之辈多仗义,道貌岸然披羊皮...
黑与白的界线俨然已经模糊了,其实黑与白本身就存在辩证的统一
各种色彩加到一起是白色,各种色彩染料加到一起是黑色...
-----------------------------------------------------
黑与白是如此深奥的主题,有无法参透之厚重,做个【生命游戏】抛砖引玉!
1、规则制定
用正方形的格子阵列表示细胞,黑色表示生存,白色表示死亡;
每个细胞有两种状态,即存活或死亡,每个细胞与以自身为中心的周围八格细胞产生互动。
- 当前细胞存活时,周围存活细胞<2时,该细胞死亡。(模拟生命数量稀少)
- 当前细胞存活时,周围有2-4个存活细胞,该细胞存活。
- 当前细胞存活时,周围存活细胞>4时,该细胞死亡。(模拟生命数量过多)
- 当前细胞死亡时,周围存活细胞=3时,该细胞存活。(模拟繁殖)
随机确定初始状态。按照规则处理一轮得到下一代细胞状态,不断迭代。
2、随机确定初始状态,实现迭代过程。
[attach]48383[/attach]
3、横向拓展,换成图像干扰的方式获得初始状态。
[attach]48385[/attach]
也可以用二维码(扫二维码加好友)
[attach]48384[/attach]
4、纵向拓展。
为了增加游戏的复杂性,可以修改游戏规则。比如,细胞的生存状态同时由父级和祖父级决定。
规则修改:
- 当前细胞存活时,周围存活细胞<2,且父级>1时,该细胞死亡。(模拟生命数量稀少,且在减少)
- 当前细胞存活时,周围存活细胞>4时,且父级<5时,该细胞死亡。(模拟生命数量多,且在增多)
- 当前细胞存活时,周围存活细胞>6时,且父级>6时,该细胞死亡。(模拟生命数量过多)
- 当前细胞死亡时,周围存活细胞=3时,且父级=3时,该细胞存活。(模拟繁殖)
[attach]48386[/attach]
5、总结思考
生存状态受一级影响时,变化比较剧烈,容易出现全部死亡的情况,即使出现平衡状态也需要迭代很多次(比如30次左右);而,生存状态受两级影响时,很容易出现平衡状态(比如迭代10次左右)。
因为测试次数并不多,随机因素考虑也不够全面,所以结果不一定十分正确。
总体来说,作为思路拓展练习是个不错的案例。
附一张四个版本的电池截图。
[attach]48387[/attach]
----------------------------------------
[attach]48388[/attach]
大家多多交流!
作者: 疏影 时间: 2017-10-9 22:06
放个代码版的
- #_*_coding:UTF-8_*_
- #!/usr/bin/python
- #Author :CPF
- #Datatime :2017-06-03
- #copyright
- from itertools import groupby
- from itertools import count
- import random
- import Rhino.Geometry as rg
- from Grasshopper.Kernel.Data import GH_Path
- from Grasshopper import DataTree
- class Graph:
- """
- 一个二维向量用来存储细胞的的状态值,死为0,生为1.
- """
- DEATH = 0
- LIVE = 1
- def __init__(self,row,col):
- """
- row行,col列,默认状态值为死
- """
- self.vec2 = [[Graph.DEATH for i in range(col)] for k in range(row)]
- self._row = row
- self._col = col
-
- @property
- def row (self):
- return self._row
-
- @property
- def col(self):
- return self._col
-
- def reset(self,live_rate):
- """
- 重设细胞的的状态,live_rate为细胞的存活几率。
- """
- for i in range(self._row):
- for k in range(self._col):
- rand_value = random.uniform(0,1)
- if live_rate > rand_value:
- self.vec2[i][k] = Graph.LIVE
- else:
- self.vec2[i][k] = Graph.DEATH
-
- def neighbor_live_count(self,row,col):
- """
- 获取第row行,第col列的相邻的8个细胞的存活细胞数目
- """
- count = 0
- neighbor = {'right_top':(-1,-1),'top':(-1,0),'left_top':(-1,1),
- 'right':(0,-1),'lift':(0,1),
- 'right_buttom':(1,-1),'buttom':(1,0),'left_buttom':(1,1)}
- for value in neighbor.values():
- if row == 0:
- neig_row = row + value[0]
- else:
- neig_row = (row + value[0])%self.row
- if col == 0:
- neig_col = col + value[1]
- else:
- neig_col = (col + value[1])%self.col
- if self.vec2[neig_row][neig_col] == Graph.LIVE:
- count = count + 1
- return count
-
- def updates(self):
- """
- 更新细胞的状态值
- """
- lists = []
- for i in range(self._row):
- row_list = []
- for k in range(self.col):
- count = self.neighbor_live_count(i,k)
- row_list.append(count)
- lists.append(row_list)
- for i in range(self.row):
- for k in range(self.col):
- count = lists[i][k]
- print count
- if count == 3 :
- self.vec2[i][k] = Graph.LIVE
- elif count != 2:
- self.vec2[i][k] = Graph.DEATH
- def display(self):
- """
- 显示细胞状态
- """
- state =[]
- for row in self.vec2:
- state.extend(row)
- return state
- if bool:
- graph = Graph(x,y)
- graph.reset(0.4)
- a = graph.display()
- else:
- graph.updates()
- a = graph.display()
复制代码
作者: skywoolf 时间: 2017-10-9 23:54
是元胞自动机吧,好久没见人弄了~手好快!
作者: 安豆 时间: 2017-10-10 09:54
围观兔子
作者: toplay 时间: 2017-10-10 10:07
不知是何方大圣,感谢支持!
作者: toplay 时间: 2017-10-10 10:09
抢红包抢习惯了,手快有手慢无
作者: 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://bbs.ncf-china.com/) |
Powered by Discuz! X3.2 |