Abha Trivedi
Abha Trivedi

Reputation: 205

unable to make non-stationary turtles change their direction if an obstacle a patch ahead

If any one please give some time.

I have an area(say a colony) with boundary wall as black patches and at some point within the boundary there is one building with building wall as blue patches. People(breed) are normally moving inside boundary and the building as well. Also they are entering and going out of the boundary. Due to some reason (suppose rumor) and after certain condition (if more than 15 person hears the rumor) they starts moving randomly with any of the headings 0, 90, 180 and 270. So, the problem I am unable is, to apply check on the turtles(people) randomly moving to change their heading or turn back if they sense the boundary or wall a patch ahead.

I tried following ways but not working, they simple passes form these patches 1) Asked the turtles if heard-rumor? and times-heard > 1 [ if [pcolor] of patch-ahead 1 = blue [set heading [heading] of self - 180]
if [pcolor] of patch-ahead 1 = black [set heading [heading] of self - 180] ]

2) set patches with boundary-wall [set pcolor black] and building-wall [set pcolor blue] and then set patch variables boundary-wall? And building-wall? true on these patches. Further asked the turtles if heard-rumor? and times-heard > 1 [ if boundary-wall? or building-wall? [ set heading [heading] of self - 180 ] ]

The procedure sequence is

to go
    ask people [ ;breed
    fd speed
    spread-rumor
    people-wander ]
end

So after spread-rumor function,

 to people-wander
    if heard-rumor? and times-heard > 1 and inside-boundary?
    [ 
        if people-heard-rumor > 10 [ set heading one-of (list 0 90 180 270)     ]  ];random 360 
      ;people-heard-rumor is a count how many have received rumor

        if heard-rumor? or fear-worst? [
         ; if [pcolor] of patch-ahead 1 = blue [set heading [heading] of self - 180]]          
         ; if [pcolor] of patch-ahead 1 = black [set heading [heading] of self - 180]]

  boundary-wall? or temple-wall? [set i? true set heading [heading] of self - 180 show 5] ]

end

I don’t know what wrong I am doing. But surely I am not using proper way. Any help is deeply thankful.

Upvotes: 1

Views: 216

Answers (1)

Alan
Alan

Reputation: 9610

You start out with fd speed so your people will go right through the barriers on that command without ever testing for a barrier. Note that even if you were to test 1 patch ahead before doing that, if speed can be greater than 1, you could still go right through the barriers. Furthermore, in a corner a person might have a barrier both in front of it and behind it, so reversing course can also be a problem.

Btw, [heading] of self is the same as heading, and to turn around it is more natural to say rt 180.

EDIT (in response to comment):

Here is a simple example of moving step by step, checking along the way:

to fd-with-checks [#speed]
  repeat #speed [
    ifelse (isbarrier? patch-ahead 1) [
      stop
    ] [
      fd 1
    ]
  ]
end

to-report isbarrier? [#patch]
  report pcolor = blue or pcolor = black
end

Upvotes: 2

Related Questions