防止NetLogo乌龟撞墙

时间:2014-02-22 12:15:39

标签: netlogo

我正在尝试做一些非常简单的事情,但由于某些原因我无法让它发挥作用。

我的设置功能从(-20,20)到(20,20)创建一个方形墙,并在墙内生成一个3号大小的圆形龟。方形墙简单地由蓝色的补丁制成。

现在我有一个go函数,它告诉乌龟在-90到90度之间旋转,并向前移动0.5步。不允许走进“墙”;当它碰到墙壁时,它只是选择另一个方向进入。乌龟不能“感知”墙壁,直到它实际进入它。

我一直使用的代码如下:

ask turtle 0 [
  let invalid true
  let turn-degree (random(180) - 90)
  rt turn-degree

  let next-patch patch-ahead 1 ;; Declare next-patch before moving

  while [invalid] [ ;; While invalid condition
    ask next-patch [
      ;; Neighbors of the next patch are counted, because turtle is size 3
      if ( count neighbors with [pcolor = blue] = 0 ) [
        set invalid false
      ]
    ]

    if (invalid) [
      lt turn-degree ;; Turn the turtle back to the original direction
      set turn-degree (random(180) - 90) ;; Randomize turn degree again
      set next-patch patch-ahead 1 ;; Declare next-patch before moving again
    ]
  ]

  ;; Finally, jump 0.5 steps ahead in the chosen direction
  jump 0.5
]

我很伤心地说,上面的代码不起作用,因为龟仍然以某种方式设法本身就带有蓝色的墙,这是不应该发生重叠。我怀疑这是因为两个原因:

1)0.5步骤正在搞砸“前贴片”状态。但是,我尝试过补丁提前0.5到没有效果。 2)随机转弯度导致蓝色的墙壁远离乌龟略大于0.5,但我没有解决方法......

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

问题在于,当乌龟移动到越靠近接触墙壁的补丁的边缘时,乌龟补丁的neighbors不是墙壁的一部分,而是乌龟距离墙壁还不到1.5。试试这个:

ask turtle 0 [
  rt (random 180) - 90

  fd .5
  while [ any? patches in-radius 2 with [ pcolor = blue ] ] [
    bk .5
    rt (random 180) - 90
    fd .5
  ]
]

答案 1 :(得分:1)

我并没有完全尝试布莱恩的方法,但我也为我做了一些工作。我最终使用了以下内容:

if (any? patches in-cone 3 60 with [pcolor = blue])

作为我的墙壁检测条件。它运作良好。 :)