一、简单叙述
最近需要用到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大小不能太大,小一点就行
四、小结
妈的,本来写的很好的,写到快结束时浏览器崩溃了,最后只剩下一半,心态崩了,后面就写的比较敷衍了
能坚持再搞一遍可见我是个多么无聊的人
害得我现在每写一句话都要保存一下草稿