NCF参数化建筑论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 38499|回复: 10
打印 上一主题 下一主题

[参赛作品] C+Z杯参赛 --【生命游戏】

[复制链接]
1m
发表于 2017-10-9 22:06:02 | 显示全部楼层
放个代码版的
  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()
复制代码

评分

参与人数 1强度 +1 收起 理由
toplay + 1 疏影横斜手很快,暗香浮动现大神

查看全部评分

小黑屋|手机版|NCF参数化建筑论坛 ( 浙ICP备2020044100号-2 )    辽公网安备21021102000973号

GMT+8, 2024-5-3 18:36 , Processed in 0.066184 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表