Wakka02
Wakka02

Reputation: 1541

Preventing a NetLogo turtle from hitting a wall

I'm trying to do something really simple, but for some reason I just can't get it to work.

My setup function creates a square wall from (-20, 20) to (20, 20), and generates a circular turtle of size 3 inside the wall. The square wall is simply made of patches colored blue.

Now I have a go function, which tells the turtle to rotate anywhere from -90 to 90 degrees, and moves it forward by 0.5 steps. It is not allowed to walk "into" the wall; when it hits the wall, it simply picks another direction to move in. The turtle cannot "sense" the wall until it actually walks into it.

The code I've been using is as follows:

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
]

I'm sad to say that the above code doesn't work, because the turtle still somehow manages to overlap itself with the blue wall, which shouldn't happen. I suspect it is because of two reasons:

1) The 0.5 steps is screwing up the "patch-ahead" condition. However, I've tried with patch-ahead 0.5 to no effect. 2) The randomized turn degree is resulting in the blue wall being slightly more than 0.5 away from the turtle, but I have no workaround to this...

Any suggestions?

Upvotes: 5

Views: 2336

Answers (2)

Wakka02
Wakka02

Reputation: 1541

I didn't exactly try Bryan's method, but what I had worked out for me just as well. I ended up using the following:

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

as my wall-detection condition. It worked well enough. :)

Upvotes: 1

Bryan Head
Bryan Head

Reputation: 12580

The problem is that when the turtle moves to the closer to the edge of a patch that is touching a patch that's touching the wall, the neighbors of the turtle's patch aren't part of the wall, but the turtle is still less than 1.5 away from the wall. Try this:

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
  ]
]

Upvotes: 2

Related Questions