更新Netlogo中的列表



我正在尝试更新netlogo上列表中的值。这里的代码是我的碰撞函数:一个品种碰撞到另一个品种,将圆圈变黑,然后我希望它将"找到"圆圈的"谁"号存储在列表中。

它目前只输出每个找到的号码,并每次打印一个号码的"列表"。

这是代码。

to collide2
if any? circles2-on neighbors [
set mylist [] ; not sure why I need this but 
;doesn't work otherwise
set whovalue [who] of circles2-on neighbors 
set mylist lput whovalue  mylist
ask circles2-on neighbors [set color black]
output-print mylist
]
end

如果有多个circles-on neighbors,则代码[who] of circles-2 on neighbors将返回它们的whoID值的列表。您需要sentence命令来连接两个列表,使用lput将列表添加为列表中的一项。例如:print lput [1 2] [3 4]将打印出列表[34[1 2]]。在您的情况下,您将其添加到一个空列表中,因此创建的列表只有一个元素,而该元素本身就是一个列表。

但若您的目标是获得who值的列表,那个么您不需要做任何复杂的事情。代码let whovalues [who] of circles2-on neighbors将自动创建列表,因为of会创建列表。

因此您的代码可以替换为:

to collide2
if any? circles2-on neighbors
[ set whovalues [who] of circles2-on neighbors 
ask circles2-on neighbors [set color black]
output-print whovalues
]
end

然而,看看你是如何跟踪who值,然后分别重新找到所有相邻的海龟的?这是因为您存储的是who值,而不是代理本身。直接引用代理,而不是通过它们的who值来识别它们,这几乎总是更好的,因此您可以避免像ask turtle with [who = <some value>] [do-something]这样的尴尬代码。

因此,切换到海龟而不是who,也切换到代理集而不是列表(不是必要的,但只有当您需要跟踪订单或有多个实例等时,列表才相关(:

to collide2
if any? circles2-on neighbors
[ set colliders circles2-on neighbors 
ask colliders [set color black]
output-print colliders
]
end

因此,现在很明显,同样的海龟正在被发现并变成黑色。更好的是,您可以这样做,使代理集只创建一次(更高效,也更容易阅读(:

to collide2
let colliders circles2-on neighbors
if any? colliders
[ ask colliders [set color black]
output-print colliders
]
end

最新更新