Java StarLogo 1.2 `turtle` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Define your own procedures in the space below. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Do not modify code below this line! to procedure-index end ;; ;; stack depth testing ;; to stack-test non-tail-recursive-test 0 end to non-tail-recursive-test :n steps-forward 10 ifelse :n < 100 [ show to-string [ "stack level " :n ] non-tail-recursive-test (:n + 1) ;; meaningless statement that makes this ;; non-tail-recursive show :n ] [ show "Achieved reasonably high stack depth." ] end ;; ;; misc. helpers ;; ;; flash turtle with specified color a few times to blink-color :n-blinks :color repeat :n-blinks [ wait 0.2 setcolor :color wait 0.2 setcolor turtle-color ] end ;; returns true iff value is within range ;; :range should be list of two elements, min. and ;; max. values of range (inclusive) to in-range? :value :range output (:value >= (item 1 :range) and :value <= (item 2 :range)) end ;; given degrees clockwise of north, converts ;; to compass-style or intermediate direction to heading-to-direction :h ;; if instead of case seems to allow deeper ;; procedure call nesting if :h = 0 [ output "north" ] if :h = 90 [ output "east" ] if :h = 180 [ output "south" ] if :h = 270 [ output "west" ] output "???" show to-string [ "ERROR: can't convert heading " :h " to direction!" ] end ;; does reverse of above conversion to direction-to-heading :d if :d = "north" [ output 0 ] if :d = "east" [ output 90 ] if :d = "south" [ output 180 ] if :d = "west" [ output 270 ] show to-string [ "ERROR: can't convert direction " :d " to heading!" ] output 0 ;; arbitrary return value end ;; Fetch the y coordinate of the top row of the ;; maze. This is the highest row that can possibly ;; be open. It is not NECESSARILY open. to get-maze-top-row output screen-half-height - 2 end ;; Fetch the y coordinate of the bottom row of the ;; maze. This is the lowest row that can possibly ;; be open. to get-maze-bottom-row output -1 * (screen-half-height - 2) end ;; Fetch the x coordinate of the rightmost column ;; of the maze. This is the rightmost column that ;; can possibly be open. to get-maze-rightmost-column output screen-half-width - 2 end ;; Fetch the x coordinate of the leftmost column ;; of the maze. This is the leftmost column that ;; can possibly be open. to get-maze-leftmost-column output -1 * (screen-half-width - 2) end ;; Fetch the x coordinate of the exit. ;; (If there are multiple exits, reports ;; an arbitrary exits x coord, but it is ;; guaranteed to be the same arbitrary exit ;; as reported in get-exit-y.) to get-exit-x output (first exit-xs) end ;; Fetch the y coordinate of the exit. ;; (If there are multiple exits, reports ;; an arbitrary exits y coord, but it is ;; guaranteed to be the same arbitrary exit ;; as reported in get-exit-x.) to get-exit-y output (first exit-ys) end ;; ;; sensing ;; to on-mark? output (patchcolor = mark-color) end to blocked? output (in-range? pc-ahead wall-color-range) ;output wall-color? pc-ahead end ;to wall-color? :color ; output in-range? :color wall-color-range ;end ;to exit-color? :color ; output in-range? :color exit-color-range ;end ;; :d must be "left", "right", "front", or "back" to blocked-towards? :d output (in-range? (patch-color-towards? :d) wall-color-range) end to patch-color-towards? :d ;; what needs to be added to current heading ;; to look in direction :d let [ :delta -1 ] if :d = "left" [ set :delta -90 ] if :d = "right" [ set :delta 90 ] if :d = "back" [ set :delta 180 ] if :d = "front" [ set :delta 0 ] if :d = -1 [ show to-string [ "ERROR: can't convert " :d " to relative heading!" ] output nothing-color ] output pc-towards :delta 1 end to at-exit? output (in-range? patchcolor exit-color-range) end ;; ;; status ;; ;; displays message in "turtle message" monitor to say :message setturtle-message :message end ;; updates monitor showing which way the turtle ;; is currently facing (direction) ;; not being used to allow for more levels of ;; nested procedure calls; about six now ;to update-turtle-direction ; setturtle-direction (heading-to-direction heading) ;end ;to celebrate-finishing ; say to-string [ "I'm done! I took " ; step-count ; " steps." ] ; ;; flash turtle yellow a few times ; blink-color 4 yellow ;end ;; ;; primitive motion ;; to step-forward steps-forward 1 end to turn-left wait (100 - speed) / 100 left 90 ;; call replaced by definition to allow deeper ;; procedure call nesting ;update-turtle-direction setturtle-direction (heading-to-direction heading) end to turn-right wait (100 - speed) / 100 right 90 ;; call replaced by definition to allow deeper ;; procedure call nesting ;update-turtle-direction setturtle-direction (heading-to-direction heading) end to mark-here stamp mark-color setcolor mark-color end to unmark-here if not on-mark? [ setturtle-message "There is no mark here to remove." stop ] stamp nothing-color end ;; based on slider value ;; to be called by any motion/turning primitive ;; not used to save stack space ;to speed-delay ; ;; say calls commented out because it allows ; ;; deeper procedure call nesting ; ;say "Please wait..." ; wait (100 - speed) / 100 ; ;say "" ;end ;; stops if blocked by wall to steps-forward :nsteps setturtle-message "" setcolor turtle-color wait (100 - speed) / 100 ifelse :nsteps > 0 [ ;; recursive case ifelse not blocked? [ forward 1 setstep-count (step-count + 1) steps-forward (:nsteps - 1) ] [ setturtle-message "My way is blocked!" ] ] [ ;; base case; no more steps to take if at-exit? [ setturtle-message to-string [ "I'm done! I took " step-count " steps." ] ;; flash turtle yellow a few times blink-color 4 yellow ] ;if on-mark? [ setcolor mark-color ] stop ] end ;; ;; teleporting ;; ; Remember the spot where the turtle is currently. to remember-this-spot setteleport-list (lput get-this-spot teleport-list) setturtle-message "I'll remember this spot for teleporting." end ; Teleport to the first spot the turtle remembered. to teleport-to-first-spot setturtle-message "" ifelse (empty? teleport-list) [ setturtle-message "I can't teleport...I don't remember any spots!" blink-color 2 red ] [ teleport-to-spot (first teleport-list) setteleport-list (butfirst teleport-list) ] end ; Teleport to the last spot the turtle remembered to teleport-to-last-spot setturtle-message "" ifelse (empty? teleport-list) [ setturtle-message "I can't teleport...I don't remember any spots!" blink-color 2 red ] [ teleport-to-spot (last teleport-list) setteleport-list (butlast teleport-list) ] end ; Teleport the turtle to the given spot. to teleport-to-spot :spot blink-color 2 yellow ; signal teleport setturtle-message "Teleporting..." setstep-count (step-count + 1) setx (get-spot-x :spot) sety (get-spot-y :spot) setheading (direction-to-heading (get-spot-direction :spot)) setturtle-direction (heading-to-direction heading) blink-color 2 yellow ; signal teleport steps-forward 0 end ;; not used to conserve stack space ;to signal-teleport-failure ; say "I can't teleport...I don't remember any spots!" ; blink-color 2 red ;end ;; not used to conserve stack space ;to teleport-signal ; blink-color 2 yellow ;end ;; ;; spots: these are full descriptions of a turtle ;; state in the maze ;; to get-this-spot output to-list [ xcor ycor turtle-direction ] end to get-spot-x :spot output item 1 :spot end to get-spot-y :spot output item 2 :spot end to get-spot-direction :spot output item 3 :spot end `observer` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Do not modify this code! globals [ teleport-list exit-xs entrance-xs exit-ys entrance-ys turtle-direction turtle-message step-count turtle-color wall-color wall-color-range nothing-color exit-color exit-color-range mark-color saved-location-color ] ;; automatically called when project is opened to startup setup-colors end ;; set colors for different kinds of patches to setup-colors setturtle-color green setwall-color white setwall-color-range [1 9] setnothing-color black setexit-color purple setexit-color-range [110 119] setmark-color yellow setsaved-location-color red end to update-maze-exits setexit-xs [] setexit-ys [] ask-patches [ if (patchcolor >= (first exit-color-range) and patchcolor <= (last exit-color-range)) [ setexit-xs (lput xcor exit-xs) setexit-ys (lput ycor exit-ys) ] ] end to reset clear-marks setup-colors clear-turtles create-turtles 1 ask-turtles [ setcolor turtle-color ] setstep-count 0 setturtle-message "" setturtle-message "Ready to go!" ask-turtles [ setturtle-direction (heading-to-direction heading) ] update-maze-exits setteleport-list [] end to clear-marks ask-patches [ if patchcolor = mark-color [ setpatchcolor nothing-color ] ] end `information` `SLPlot` title "Untitled Graph" xlabel "Time" ylabel "" xmin 0 xmax 1000 ymin 0 ymax 1000 pen 1 0 15 pen 2 0 25 pen 3 0 35 pen 4 0 45 pen 5 0 55 pen 6 0 65 pen 7 0 75 pen 8 0 85 pen 9 0 95 pen 10 0 105 `interface` SLButton turtle-or-observer? observer top-left 395 0 width-height 86 30 name "reset-button" line-to-run "reset" forever? false button-number 3 show-name? false whichip 38 SLTextWidget top-left 289 0 width-height 82 110 textwidth 78 linenums 5 words "Click \"reset\" to \nreset step count\nand return turtle \nto center of\nscreen." textwidget-number 1 SLSlider top-left 439 0 width-height 280 25 name "slider1" variable "speed" min-value 0 max-value 99 current-value 99 slider-number 0 show-name? false SLMonitor top-left 428 281 width-height 231 36 name "turtle message" list-to-run "turtle-message" digits 0 delay 0.1 monitor-number 2 show-name? true whichip 43 onewhichip 44 SLMonitor top-left 37 0 width-height 86 36 name "step count" list-to-run "step-count" digits 0 delay 0.1 monitor-number 3 show-name? true whichip 41 onewhichip 42 SLMonitor top-left 0 0 width-height 86 36 name "turtle direction" list-to-run "turtle-direction" digits 0 delay 0.2 monitor-number 1 show-name? true whichip 39 onewhichip 40 SLCanvas top-left 0 89 `settings` patch-size 17 num-shapes 256 screen-half-width 12 screen-half-height 12 interface-window-xcor 405 interface-window-ycor 29 interface-window-size 690 464 output-window-xcor 0 output-window-ycor 0 output-window-width 300 output-window-height 219 info-window-xcor 0 info-window-ycor 0 info-window-width 500 info-window-height 419 control-center-xcor 11 control-center-ycor 23 control-center-width 388 control-center-height 556 turtle-command-center-height 159 observer-command-center-height 150 plot-window-xcor 0 plot-window-ycor 0 plot-window-width 508 plot-window-height 372 `string table` H4sIAAAAAAAAAG2QMU/DMBCFD5EKKao6VIIJocuAyuQfwFIxMGRASFH/gJNcayuO L7JNqvx7LqUUhm5+5/e9dzoAeISF55AMLCvS7YSJ8cAFACxj0k2HjkZyCM9vjbHy bDGQjux17SY09mDwx9bSkIyCTD4TLCJ/SWJ2JBG32+0Wnt6r6rN6RWy03yRs2I8U EhqptP6AsJp7WxuoSZZ9AXjdf3EgLGfizBeQOdpLb5CFEmS1bASLfWCf4OF6EtzP fCCnkx3pLwh3hgKhjegZex06POmTt+eRFKw/JjzqabbUjpuO2gLW5abHlj0ViKWY uUO4k8vQEBW8lBvnZpz6mgImI2QcOOGeRZGjQe4v5QpUed7yd6qUjCRXRhde++mE xwJWu3+0UnCTw22e5999aTr31gEAAAAAAdY= `symbol table` H4sIAAAAAAAAAGNgYGAAABzfRCEEAAAAAAAABA== `double table` H4sIAAAAAAAAAGNgYBDZ/4EBDBxkoLR3A4SOOQCh3aB8Pai8ApRWgtIqUFoNSmtA aS0orQOh7WH2cEBpCSgtApU/ORMEZh0Ig9hnvxPCBwA9/F5apAAAAAAAAKQ= `list table` H4sIAAAAAAAAAJVTSXLDMAyjZCl27HjJ0v0ffUzOOefaj/WBBUS41nSmnaknCCQS FGlSNrN38yfEjQM44i8Ae63vwIe0CzQR2NEPbrNZA+5KoNu472FP4CE6H4BMmPs6 rMfs+gmxo8AayDxjsu0ZVNOaJySvY04eMwMLDw+uZ908dzCPs4ozuAduiG2Cn4Vf yXkkmKfqQ1T+IgJfk5/xmUofwgRugQ7YAz310pq0V9eWmFYx1Byq2piH72Ra/2YL 4kbMPjXBNdz3tvEUvYYRfEreE9Yyq5ZF/aTmCJyCeq0zRt2LucrN97kpH/nK3v9h X2dR6kSOc/T8nM1lnaNmW8ev79PqXgTN6qK5PwTv+6Piec/Y9hS23j+p9r7KQ/uz 1rTlVa9Z/Ec7yJ6ge5Huu97o/S3+as75xxzXuTaaY9HwHlZ3MMtHtPCd5St7+bjf Vb6yN30r4lfx2xdFAogRAAQAAAAABAA= `bytecodes` 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 ZuhnnaEH/wMNrLLLXB0AAAAAHVw= `observer world` H4sIAAAAAAAAAE1QXW7DIAx2/po2aToedoA9V+IOe9hByqiVolGIwO262w8Io0Oy 7O8HbAzsZD89uju6N0+C8PQO5Rxho9HMdAn1B/SLtrSgSdKYzEVtQzCYIrNYR1wr T8nX40MRf/hQVjCiISeMxJWos/oTQfNPTUQLjG6ONPKzcihJ2di5g0Nmr+i9mDFw Gxg84cKlvZnYtYd99kirrQvMFoZvoXXBO2BPzEPT9M4Ak7F0UWYuxhGGNOIf3gN7 4nJxguEq3FdxHeDVizueubZSxMGL8hL30KV/QFWtuQ55165LTFyduaA1GTehbus1 ul/6SCbetAEAAAAAAbQ= `patch world` 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 Jx/wyUQAAAAARMk= `turtle world` H4sIAAAAAAAAAGPgSygpLSrJSVUoLkksSU1wYICDfga2nNS89JIMINuEgTWpKDU1 BchUYWAvyMkvKUjNA3L0GFiT83Pyi4BMGQaWymQwi4eBG2wYkm4OoPKU/PK8AiDP iIG1OCOxIBXI1GJgqYDoYWFgLs/IB9vLVpwBVWnMwJ6RmpiSmZcO5IjA3PUfCIAU IwMe4ODdgCnIyMAIAL8aswjvAAAAAAAA7w==