Examples/FollowThatTurtleNotTooClose.turtle.ps1
<# .SYNOPSIS Follow that Turtle! (but not too close) .DESCRIPTION Basic behavior modelling with Turtle. A series of turtles will follow the next turtle, until they get within a proximity. Then, the same turtles will avoid the turtle, until they are outside of the proximity. #> param( # The size of the square [double] $Size = 200, # The speed of each turtle [double] $Speed = 1, # The number of steps [int] $StepCount, [double] $Proximity ) # If no steps were provided if (-not $StepCount) { # double the size and divide by speed $StepCount = ($size * 2)/$speed } if (-not $Proximity) { $Proximity = $size/2 } # Set up our turtles. $followThatTurtle = turtle square $Size stroke '#4488ff' turtles ([Ordered]@{ t1 = turtle teleport 0 0 stroke '#4488ff' t2 = turtle teleport $Size 0 stroke '#4488ff' t3 = turtle teleport $Size $Size stroke '#4488ff' t4 = turtle teleport 0 $Size stroke '#4488ff' }) # For each step foreach ($n in 1..([Math]::Abs($StepCount))) { # Go to each turtle for ($turtleNumber = 0; $turtleNumber -lt $followThatTurtle.Turtles.Count; $turtleNumber++) { $thisTurtle = $followThatTurtle.Turtles[$turtleNumber] # and find the next turtle $nextTurtle = if ($turtleNumber -eq $followThatTurtle.Turtles.Count - 1) { $followThatTurtle.Turtles[0] } else { $followThatTurtle.Turtles[$turtleNumber + 1] } # If we are more than the proximity away if ($thisTurtle.Distance($nextTurtle) -ge $Proximity) { # rotate towards it $null = $thisTurtle.Rotate( $thisTurtle.Towards($nextTurtle) ).Forward($Speed) # and move forward. } # If we within the proxmity else { # rotate away $null = $thisTurtle.Rotate( $thisTurtle.Towards($nextTurtle) + 90 ).Forward($Speed) # and move forward. } } } $followThatTurtle | turtle save ./FollowThatTurtleNotTooClose.svg $followThatTurtle.Stroke = 'transparent' $followThatTurtle | Save-Turtle ./FollowThatTurtleNotTooClosePattern.svg Pattern |