我正在尝试更新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
将返回它们的who
ID值的列表。您需要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