1.生命游戏(netlogo)

一、简单叙述

最近需要用到netlogo搞一些骚东西,集中精力研究一下这个破玩意

现在中文文档还是比较少的,只能看官方的英文文档了

进入软件,点击帮助,netlogo用户手册,就能查看

另外碰到高亮代码,不太熟悉,可以全选代码,点击F1,可以查看代码是什么意思

软件自带许多的模型

通过 点击文件,模型库来浏览

接下来分析一下生命游戏的代码

源代码中有些多余的功能给去掉,就简单实现生命游戏的逻辑即可

二、代码分析

1.patches拥有的属性

patch就是二维世界的一个小格子,这也是netlogo中的一种agent(主体)

;;1.每个生命拥有的属性 living live-neighbors
patches-own[
  living?         ;;加个问号是是否活着的意思,是一个布尔型变量,living和?是一个整体,要写在一起
  live-neighbors  ;;活着的邻居数目
]

2.设置两个函数

netlogo中函数的设定是通过

to 函数名
  执行内容
end

这样的方式来实现的

这里设置两个函数 表示生命诞生和死亡

;;2.设置两个函数
to live-birth   ;;生命诞生函数,调用live-birth就执行下方的代码
  set living? true ;;设置生命状态是 活着的
  set pcolor 0 ;;设置小格子的颜色是黑色    0黑9白
end


to live-death  ;;生命死亡函数,调用live-death就执行下方代码
  set living? false ;;设置生命状态是 死亡
  set pcolor 9 ;;设置小格子的颜色是白色
end

3.在界面上添加 density滑块,表征人口密度,再添加一个初始化按钮initialize

可以看到,设置滑块相当于设置了一个可以手动控制的全局变量density

density是一个0-100的数字,单位是为了让我们看的,不影响实际表示的数字的大小

再创建一个initialize按钮

4.初始化按钮代码

to initialize
  ;;#1.清空所有
  clear-all
  ;;#2.访问每个格子,按照人口密度,来决定格子的生死状态
  ask patches [
    ifelse random-float 100 < density[ ;;生成一个[0,100)的浮点数,小于人口密度,细胞生,否则死
      live-birth ;;执行live-birth函数 
    ]
    [
      live-death ;;执行live-death函数
    ]
  ]
  ;;#3.重设ticks时间步
  reset-ticks
end

这里可以看到按钮的代码和函数的代码是一个格式的,因为点击按钮本质上就是执行函数

点击initialize按钮,就是执行了命令initialize,也就是执行了initialize函数

5.循环执行迭代按钮 go

创建按钮的时候,记得点击持续执行,就会重复执行go函数

to go
  ask patches[ ;;先访问一遍所有格子,把邻居数算出来
    set live-neighbors count neighbors with[
      living? = true
    ]
  ]
  ask patches[ ;;再访问一遍所有格子,根据每个格子的邻居数决定格子的生死状况
    ifelse live-neighbors = 3[ ;;如果格子周围有三个邻居,格子就活着
      live-birth
    ]
    [
      if live-neighbors != 2[ ;;如果格子周围不是3个邻居,也不是2个邻居,就死了
        live-death
      ]
    ]
  ]
tick ;;时间步加1
end

这里有个elseif 和 else的逻辑

ifelse 条件[
    满足条件所执行的代码
]
[
    不满足条件所执行的代码
]


if 条件[
    满足条件所执行的代码
]

三、完整代码和界面

;;1.每个生命拥有的属性 living live-neighbors
patches-own[
  living?         ;;加个问号是是否活着的意思,是一个布尔型变量,living和?是一个整体,要写在一起
  live-neighbors  ;;活着的邻居数目
]


;;2.设置两个函数
to live-birth   ;;生命诞生函数,调用live-birth就执行下方的代码
  set living? true ;;设置生命状态是 活着的
  set pcolor 0 ;;设置小格子的颜色是黑色    0黑9白
end


to live-death  ;;生命死亡函数,调用live-death就执行下方代码
  set living? false ;;设置生命状态是 死亡
  set pcolor 9 ;;设置小格子的颜色是白色
end


;;3.在界面上添加 density滑块,表征人口密度,再添加一个初始化按钮initialize
;;4.初始化按钮 initialize
to initialize
  ;;#1.清空所有
  clear-all
  ;;#2.访问每个格子,按照人口密度,来决定格子的生死状态
  ask patches [
    ifelse random-float 100 < density[ ;;生成一个[0,100)的浮点数,小于人口密度,细胞生,否则死
      live-birth ;;执行live-birth函数 
    ]
    [
      live-death ;;执行live-death函数
    ]
  ]
  ;;#3.重设ticks时间步
  reset-ticks
end


;;5.循环执行迭代按钮 go
to go
  ask patches[ ;;先访问一遍所有格子,把邻居数算出来
    set live-neighbors count neighbors with[
      living? = true
    ]
  ]
  ask patches[ ;;再访问一遍所有格子,根据每个格子的邻居数决定格子的生死状况
    ifelse live-neighbors = 3[ ;;如果格子周围有三个邻居,格子就活着
      live-birth
    ]
    [
      if live-neighbors != 2[ ;;如果格子周围不是3个邻居,也不是2个邻居,就死了
        live-death
      ]
    ]
  ]
tick ;;时间步加1
end

这里另外还需要点击设置,把每个patch的大小调整一下

这个patch大小不能太大,小一点就行

四、小结

妈的,本来写的很好的,写到快结束时浏览器崩溃了,最后只剩下一半,心态崩了,后面就写的比较敷衍了

能坚持再搞一遍可见我是个多么无聊的人

害得我现在每写一句话都要保存一下草稿

  • 11
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值