0

I am struggling with coding identifying an expanding neighborhood based on an attribute of a patch. I need to check if there are a wall in my turtle's vision, if it is the case, my turtle should not be able to see through this wall.

Currently my recursive code works only with a vision's distance of 1 (that corresponds to neighbors), but over of 2 I get this error : A patch can't access a turtle or link variable without specifying which agent.

I don't know how it is possible to do this with an agent, do someone have an idea to do this?

breed[robots robot]
robots-own[step]

globals [ max-dist]
patches-own [ dist ]

to setup
  ca
  init-environement
  create-robots 1 [init-robots]
end

to init-robots
  set shape "person"
  set size 4
  move-to one-of patches with [no-wall? and (not any? turtles-here)]
  set step 0
end

to init-environement
  ask patches with [ (abs pxcor = max-pxcor) or (abs pycor = max-pycor) ]
    [ set pcolor brown ]
  ask patches with [ (abs pxcor = 20 and abs pycor > 15)
    or (abs pycor = 10 and pxcor > 25)
    or (pycor = 0 and pxcor < 1)][ set pcolor brown ]
  ask n-of nbObstacles patches [ask patches in-radius random-float 2 [ set 
  pcolor brown ]]
end

to move-robot
  let k 0
  let v (neighbors with [no-wall? and (not any? turtles-here)])
  if (any? v)[ move-to min-one-of v [dist] paint-agents k neighbors]
  set step (step + 1)
  output-show step
end

to paint-agents [k case]
  let w ([neighbors] of case with [no-wall? and (not any? turtles-here)])
  if (k  < radius) [
    set k k + 1
    foreach w [
      [x] ->
      ask neighbors with [pcolor != brown][ set pcolor [color] of myself - 2 
paint-agents k x]
    ]
  ]

end

to go
  propagate
  if any? patches with [pcolor = black] [ clear-output ask robots [move-robot] ]
end

to propagate
  ask patches with [ no-wall? ][ set dist -1]
  let p (patch-set patches with [pcolor = black])
  let d 0
  while [ any? p ]
    [ ask p [ set dist d ]
      set d d + 1
      set p (patch-set [ neighbors with [no-wall? and ((dist = -1) or (dist > d))]] of p)
    ]
  set max-dist max [ dist ] of patches
  if (max-dist < 0) [ set max-dist 0 ]
    ifelse (show-labels?)
    [ ask patches with [no-wall?]
        [ set plabel-color white
          set plabel dist]
    ]
  []
end

to-report no-wall?
  report pcolor != brown
end

There, my function which contains this problem is "paint-agents"

1 Answers1

1

One way would be to get rid of patches in the sight that intersect a wall. You can imagine if you draw a line between each patch and if the wall lies on the drawn line, then that patch should be removed from things in vision.

This link may be useful on an implementation: Not see through the walls

mattsap
  • 3,790
  • 1
  • 15
  • 36