如何在触摸时杀死海龟?

时间:2016-01-21 14:53:13

标签: collision-detection netlogo

当他们互相碰触时,我似乎无法让乌龟死去。我只能在同一个补丁上杀死它们。 有这样的功能吗?

to killturtles
if contact?
[die]
end

2 个答案:

答案 0 :(得分:2)

没有,但假设你的乌龟是圆的或圆的

 ask other turtles in-radius (size / 2) [die]

是一个很好的近似值。

答案 1 :(得分:1)

如果“触摸”意味着乌龟图标重叠,您可能需要类似King-Ink建议的方法(但可能会出现如下所述的复杂情况)。如果“触摸”意味着“在下一个补丁上”,那么您可以使用neighborsneighbors4以及turtles-here,但您使用它的方式取决于您想要做什么。这是一个例子。这个命令

ask turtles [ask neighbors4 [ask turtles-here [die]]]

将确保没有乌龟在它旁边或它上面或下面有另一只乌龟。如果您将neighbors4替换为neighbors,那么对角线旁边也不会有任何海龟。 neighbors4neighbors获取与龟打开的补丁相邻的补丁,turtles-here列出补丁上的乌龟。所以整条线路逐一到达每只乌龟,并检查相邻斑块中是否有海龟。如果是这样,那些海龟就会被杀死,但是第一只乌龟还活着。

但是,你也可能想杀死第一只乌龟。不过,这就是我想知道的。例如,假设三只相邻斑块[T1] [T2] [T3]上有三只乌龟。 T1紧邻T2,T2紧邻T3。你想杀死这三个人吗?如果是这样,那需要一些照顾。假设您的代码使用ask或循环遍历每只乌龟。您的代码发现T1和T2彼此相邻,并将其杀死。在下一步中,当您的代码找到T3时,它旁边不再有乌龟,因此它不会被杀死。那是你要的吗?如果是这样,那并不难。

但是,如果你想要杀死另一只乌龟旁边的每只乌龟,那么我认为你可能必须给每只乌龟一个变量,比如ready-to-die?。当您发现彼此相邻的海龟时,请将ready-to-die?变量设置为true。然后,在第二步中,杀死ready-to-die?等于true的海龟:

turtles-own [ready-to-die?]

to setup
  <make some turtles>
  ask turtles [set ready-to-die? false]
  ; don't forget to initialize ready-to-die? in new turtles created later
end

to go
  <do things with turtles>
  ask turtles [ask neighbors4 [ask turtles-here [set ready-to-die? true]]]
  ask turtles with [ready-to-die?] [die]
  <do other things>
end

每只乌龟都被它所拥有的任何相邻的海龟告知,它已准备好死亡。但它仍然活着,所以其他海龟会知道它是邻居。然后,所有与邻居的乌龟都知道他们已经准备好死了,他们就被要求死了。

还有其他方法可以使用嵌入的ask来编写零件。有些可能会更好,但此代码说明了您可以使用的工具。