这个示例演示了ask和ask-concurrent命令之间的区别。 注意:不建议使用ask-concurrent。它只为了向后兼容而存在。
使用方法: 按下SETUP按钮创建一些乌龟。 然后按下两个按钮之一,让乌龟向前移动5个步骤(不要同时按下两个按钮)。 以正常速度进行模拟时,乌龟可能移动得太快,你无法看到这两个按钮的区别。如果需要,可以使用速度滑块减慢模型速度,直到你可以逐个观察乌龟移动。 GO按钮以稍微复杂的方式使用ask-concurrent。它显示出目前正在运行的乌龟,即使每只乌龟都在运行一个while循环,而不仅仅是一个简单的fd命令。
请注意以下事项: 使用ask turtles [ fd 5 ]时,乌龟是如何移动的? 使用ask-concurrent而不是ask时,乌龟是如何移动的?
关于ask-concurrent的详细信息,请阅读NetLogo用户手册中的编程指南中的Ask-Concurrent部分。
NetLogo特性: 视图更新模式设置为“continuous”,因此您可以通过将滑块向“slower”移动来逐个观察代理的移动。
turtles-own [done?] ;; 这个变量只被GO-TURTLES-ALTERNATE过程使用
to setup
clear-all ;; 清除所有的乌龟和patches
ask patches with [pycor = 0] [
sprout 1 [ set heading 0 ] ;; 在y坐标为0的patches上生成一只朝向0度的乌龟
]
reset-ticks ;; 重置时间步
end
to go
;; 在每一列生成一个红色的patch
ask patches with [pycor = 0] [
ask patch-at 0 (random world-height) [
set pcolor red ;; 将该patch的颜色设置为红色
]
]
;; 让每一只乌龟向前移动,直到它找到所在列的红色patch
go-turtles
tick ;; 时间步增加1
end
to go-turtles
ask-concurrent turtles [
while [pcolor != red] [ fd 1 ] ;; 当乌龟所在的patch颜色不是红色时,向前移动一步
set pcolor black ;; 将所在的patch颜色设置为黑色
]
end
;; 这里演示了如何使用ASK而不是ASK-CONCURRENT来达到与GO-TURTLES相同的效果。
;; 乌龟的行为是一样的,可视结果(乌龟同时工作,而不是一个一个完成任务)也是一样的。
;; 注意使用了turtles-own变量。
to go-turtles-alternate
ask turtles [ set done? false ] ;; 设置done?变量为false,表示乌龟还没有完成任务
loop [
let still-moving turtles with [not done?] ;; 获取还没有完成任务的乌龟
if not any? still-moving [ stop ] ;; 如果没有还在移动的乌龟,则停止循环
ask still-moving [
ifelse pcolor = red
[ set pcolor black
set done? true ] ;; 如果所在patch的颜色是红色,则将颜色设置为黑色,并将done?变量设置为true,表示任务完成
[ fd 1 ] ;; 向前移动一步
]
]
end