Java StarLogo
2.0
english
`turtle`
breeds [ghs preds]   
turtles-own [lifeforce cons-amt thecount age death]

to ghs-life 
;grasshoppers wander around and eat grass, 
;which changes the grass density, and reproduce and die
  setcons-amt (min density (ghs-eat-rate * random 5)) 
  setdensity (max 0 (density - cons-amt)) 
  seth random 360 
  jump 1
  setlifeforce max 0 (lifeforce + cons-amt - 10)
  setlifeforce min lifeforce 100
  if (lifeforce > ghs-birth-thresh) and (age > 2)
      [setlifeforce min 0 (lifeforce - 5)
      hatch [setlifeforce 10 setage 0 setthecount 0]]   
      ghs-reaper
end

to ghs-reaper
  if death = 1 [die] 
  ifelse lifeforce < 1
      [setthecount (thecount + 1)
       if thecount > 3 [die]]
      [setthecount 0]
  if age > ghs-max-age [die] 
end

to pred-life
;predators wander around and eat grasshoppers
;and die and reproduce
  if breed = preds
   [if (count-ghs-here > 0)
       [setdeath-of one-of-ghs-here 1
        setlifeforce lifeforce + pred-life-gain]
    setlifeforce (lifeforce - (random 20) / 10)
    setlifeforce min lifeforce 150
    pred-reaper
    if (lifeforce > pred-birth-thresh) and (age > 5)
       [setlifeforce max (lifeforce - 20) 0
       hatch [setlifeforce 20 setage 0]]
   pred-move]
end

to pred-reaper
  if age > pred-max-age [die]
  ifelse lifeforce < .1
      [setthecount thecount + 1
       if thecount > 3 [die]]
      [setthecount 0]
end

to pred-move
  seth random 360
  ifelse count-ghs-here > 0
    [fd .1]
    [fd random 20]
end


`observer`
globals [systime]
patches-own [density]

to startup
  plotid 4
end

to setup-fast
  plotid 4
  clearplot
  setplot-title ""
  ca
  crt 1
  repeat 20
    [ask-turtles
      [setxy (random screen-height) (random screen-width)
       setc 60
       repeat (solar-gain * 4) [stamp color seth random 360 fd 1]]]
  ask-turtles [die]
  ask-patches [if pc = 60 [setdensity ((random 50) + 100)]]
  repeat 55 [diffuse density .9]
  cgc
  plot-setup
  intro-grasshoppers  
  intro-preds
end

to setup-slow
  plotid 4
  clearplot
  setplot-title ""
  setsystime 0
  ca
  ask-patches [if (random 10) < 1 [setdensity 100]]
  repeat 10 [grow-grass 
             diffuse density .3
             cgc]
  plot-setup
  intro-grasshoppers
  intro-preds
end

to go 
  grow-grass
  diffuse density .05
  cgc
  generation 
  ask-ghs [ghs-life]
  cgc
  ask-preds [pred-life]
end

to grow-grass
;grass grow by increasing its density
  ask-patches 
    [if (density > .1)
      [setdensity min 99 (density + (solar-gain / 10))]]
  cgc
end            

to cgc
;scales grass color based on density
  ask-patches 
    [ifelse density > 0 
      [scale-pc green density 100 0]
      [setpc 48]]
end

to intro-grasshoppers
  create-ghs ghs-num
  ask-ghs 
    [setxy (random screen-height) (random screen-width)
    setc red
    setlifeforce random 100
    setage random 50]
end

to intro-preds
  create-preds pred-num
  ask-preds 
    [setxy (random screen-height) (random screen-width)
    setc 30
    setlifeforce random 100
    setage random 50]
end

to generation ;a time-step
  ask-ghs [ghs-life]
  cgc
  ask-preds [pred-life]
  ask-turtles [setage age + 1]
  setsystime systime + 1
end

to plot-setup
  pp1 ppreset setppc red
  pp2 ppreset setppc green
  pp3 ppreset setppc 1
  setplot-xrange 0 25
  setplot-yrange 0 500
  setplot-title "Amount vs. Time"
end

to graph-it
  every 1.8 [      ;only graph every 1.8 seconds
                   ;this causes the graph to be smoother (the averaging makes it somewhat discrete)
  pp1 ppd plot count-ghs
  ;pp2 ppd plot sum-of-patches [density / 200] ;a slower way of graphing approximately the same thing
  ;we're graphing a scaled distribution of the patch colors
  pp2 ppd plot (5 * (count-pc green) + 4 * (count-pc (green - 1)) + 4 * (count-pc (green + 1)) 
      + 3 * (count-pc (green - 2)) + 3 * (count-pc (green + 2)) + 2 * (count-pc (green - 3)) 
      + 2 * (count-pc (green + 3)) +  1 * (count-pc (green - 4)) + (1 * count-pc (green + 4)) 
      + 0 * (count-pc (green - 5)) + 0 * (count-pc (green + 5))) / 10
  pp3 ppd plot count-preds]
end

to start
  startgobutton
  startgraphbutton
end

to empty
end


`information`
For use with the Adventures in Modeling book,  by Vanessa Colella, Eric Klopfer, and Mitchel Resnick published by Teachers College Press, 2001.  

For more information, see  
<http://education.mit.edu/starlogo/adventures>  

Challenge 10: Predator, Prey, Grass

This project models an ecosystem consisting of growing grass, grasshoppers that eat the grass, and predators that eat the  grasshoppers. The grasshoppers and predators are implemented as breeds of turtles, while the grass is implemented as patches. If grass is present on a patch (with its density indicated by shades of green) it grows according to the rate specified in the solar-gain slider. Patches that have no grass at all are considered desertified and are shown in yellow. The only way grass can grow in the desertified areas is if it spreads to these patches through diffusion (one algorithm for modeling the re-seeding of the desert patches).  

The initial number of grasshoppers is controlled with the "ghs-num" slider. Each grasshopper is created with an energy  level. The grasshoppers move randomly around, using up a small  amount of energy for each step. If a grasshopper lands on a green  patch, it consumes the grass at a rate determined by the "ghs-eat-rate" slider. This rate determines both the amount of  grass that the grasshopper eats and the amount of energy the  grasshopper gains. If a grasshopper is over age 2 and has  accumulated enough energy (as determined by the "ghs-birth-thresh" slider), then it will hatch a new grasshopper. If a grasshopper reaches the age shown on the "ghs-max-age" slider or runs out of  energy, then it will die. 

The "pred-num" slider sets the initial number of predators. These  predators also have an energy level that decreases slightly as they move randomly around. If a predator encounters a grasshopper, then it will eat it and gain the amount of energy indicated on the "pred-life-gain" slider. Once a predator accumulates enough energy (as shown on the "pred-birth-thresh" slider), it will hatch a new  predator. A predator dies when it runs out of energy or reaches the age shown on the "pred-max-age" slider.  

Try running the model with the default parameters. What happens to the populations over time? Can you control the degree of  population fluctuation? How? What seems to determine the degree of fluctuation? Try freezing all but one of the parameters and experimenting with different values for the remaining parameter.  What happens to the populations of the three species as you change the parameter?


`interface`
SLCanvas
top-left 9 330

SLMonitor
top-left 62 95
width-height 72 36
name "monitor3"
list-to-run "count-preds"
digits 0
delay 0.5
monitor-number 3
show-name? false
whichip 23
onewhichip 24

SLMonitor
top-left 62 14
width-height 72 36
name "monitor1"
list-to-run "count-ghs"
digits 0
delay 0.5
monitor-number 1
show-name? false
whichip 25
onewhichip 26

SLTextWidget
top-left 150 183
width-height 136 25
textwidth 132
linenums 1
words "PREDATOR PARAMETERS"
drawBorder true
textwidget-number 2

SLSlider
top-left 184 35
width-height 107 25
name "slider2"
variable "ghs-num"
min-value 0
max-value 2000
current-value 125
slider-number 1
show-name? false

SLSlider
top-left 220 35
width-height 107 25
name "slider3"
variable "ghs-max-age"
min-value 0
max-value 250
current-value 42
slider-number 2
show-name? false

SLSlider
top-left 259 35
width-height 107 25
name "slider4"
variable "ghs-birth-thresh"
min-value 0
max-value 100
current-value 25
slider-number 3
show-name? false

SLSlider
top-left 298 35
width-height 107 25
name "slider5"
variable "ghs-eat-rate"
min-value 0
max-value 20
current-value 15
slider-number 4
show-name? false

SLTextWidget
top-left 150 9
width-height 158 25
textwidth 154
linenums 1
words "GRASSHOPPER PARAMETERS"
drawBorder true
textwidget-number 1

SLSlider
top-left 182 198
width-height 107 25
name "slider6"
variable "pred-num"
min-value 0
max-value 99
current-value 30
slider-number 5
show-name? false

SLSlider
top-left 221 198
width-height 107 25
name "slider7"
variable "pred-max-age"
min-value 0
max-value 200
current-value 42
slider-number 6
show-name? false

SLSlider
top-left 262 197
width-height 107 25
name "slider8"
variable "pred-birth-thresh"
min-value 0
max-value 100
current-value 50
slider-number 7
show-name? false

SLSlider
top-left 116 49
width-height 81 25
name "slider1"
variable "solar-gain"
min-value 1
max-value 20
current-value 10
slider-number 0
show-name? false

SLSlider
top-left 300 197
width-height 107 25
name "slider9"
variable "pred-life-gain"
min-value 0
max-value 100
current-value 22
slider-number 8
show-name? false

SLLineWidget
top-left 337 72
width-height 123 78
id 4
order 4
type 1
title "Amount vs. Time"
delay-string "1.0"
xlabel ""
ylabel ""
grid false
connected true
autoscaletrue
location 0 0
wizard-on false

SLButton
turtle-or-observer? observer
top-left 12 98
width-height 65 30
name "button7"
line-to-run "setup-fast"
forever? false
button-number 8
show-name? false
whichip 21

SLButton
turtle-or-observer? observer
top-left 13 212
width-height 55 30
name "button6"
line-to-run "start"
forever? false
button-number 7
show-name? false
whichip 18

SLButton
turtle-or-observer? observer
top-left 62 243
width-height 64 30
name "graphbutton"
line-to-run "graph-it"
forever? true
button-number 6
show-name? false
whichip 20

SLButton
turtle-or-observer? observer
top-left 62 180
width-height 57 30
name "gobutton"
line-to-run "go"
forever? true
button-number 3
show-name? false
whichip 19

SLButton
turtle-or-observer? observer
top-left 12 14
width-height 65 30
name "button1"
line-to-run "setup-slow"
forever? false
button-number 2
show-name? false
whichip 22


`turtle shapes`
[encoded data, 5200 characters]
DhUAABUO2Q==

`template`
null

`settings`
patch-size 8
num-shapes 256
screen-half-width 25
screen-half-height 25
interface-window-xcor 111
interface-window-ycor 182
interface-window-size 752 421
output-window-xcor 0
output-window-ycor 0
output-window-width 300
output-window-height 219
info-window-xcor 299
info-window-ycor 179
info-window-width 500
info-window-height 419
control-center-xcor 14
control-center-ycor 295
control-center-width 436
control-center-height 402
turtle-command-center-height 150
observer-command-center-height 150

`string table`
H4sIAAAAAAAAAGNgYGBiYGDgd8zNL80rUSgr1lMIycxNBQBheAIxFwAAAAAAABc=

`symbol table`
H4sIAAAAAAAAAGNgYGAAABzfRCEEAAAAAAAABA==

`double table`
[encoded data, 26585 characters]
X1T+7/zrf+P/AXKTfeesUQAAAABRrA==

`list table`
H4sIAAAAAAAAAHVSy0oEMRCszsy4yyyChwURRLyJz1nHBS/+jXPwi/xSP8BOptqU
gT00Vf1IpbsTAJcAzIDe8SJjJrbG9m4ftvq9wb4Yz7HZbWHuPWPCeO+wE42wkecW
8XP9A4pu4Y+sSe5uGHty/Gx0EHnWPJOH9sFhS61iXvMi+dn9iTXJbSDenKgx5jtq
TVb3A84bdyT200Xe7WpF++nXlu+85iD9lR54ridawzvy1HC979/dodfw2NfQ8DE0
UGc9Q53xtv6B0uurvAnn/PsbGh/FX4R3cZ/EBn1j9jcRZ4fzmEf0E+eb5Y1AP+a5
pq/n8pk3+lvpYd/0/C18Q81BatFy/ptd7NDqPz7ZK4pm3R/r9+vq6648fpT3Saj/
zCRX/F8QiMg32AMAAAAAA9g=

`bytecodes`
H4sIAAAAAAAAAM1Yy5bbNgwFJUuy5YfkhzyezDT1xFZX9aKLbrLKyb7/EHeieHzO
xHJlTXOy7rK/1v5TKYogINqaNO0mWpgiCYAXDwKQof/u189ldp+/z07v3sBf1fM3
ANxAcCq3Rfl0lBMfzCP0mK4AIvCq1/CUSbLNh+2plLOHy7RpR8/lTzoHeIX7DsAC
91w1BVjq8RbErQsi9uXoqBESX9NKniTW7x6INcqTtLGj+UMQyQhg5uq9QMtY6HlX
vg/UsRD16nHl09xBfEB7am0CYia0jJ6UeWXOq9fC+hz13pfviE2eNe1o+Y6WiboP
tQzkG+kxArhjmIJaX/MENYbm3LfmAc2VzwT67PSYf5KLb/+dz9Bf6KuxU/tR4Y6N
X0h36Zd4bunlG1+026KreUYaesfC1zN2VraxbdKw1dfaxgFnl8vJjxadjQHINpcw
BFqPBg/Gpaf3h03Mq+BcTuNeIF90zqewuxDuivzTZldsTye5kRKd4r8x2MVUGPwi
TvT++MzHRNdhd6zyq6viWsQz8uslf9r6KJwdcO9393J295UA+88CRHAw0xfG4ety
bYYAXQKoAHkw2R/KIq8t95Afj1lRGXBlOQIIU2WMhWc5NnkmYbksYTUvCUyEwUjr
Qb3ecLAP/Rrnscjef4sAAxmB2SErtuU+P8iNn87x/acbIL58AxoZWOo2CSlITAbu
MMwsS42B6QekX5XhlF5dCI+PeblRaRMaN8tkTCkkjQlv6pLtG3su2+tYex7bY3ZO
J5QZMQOmU8qCVXZWOHvQlSF8fNjsq1r8Z4v1/2Aoq9NnZLXrXq2cQcr36YqJ635d
Z22kGqWIhaEhi7K8zWrjOd2AaqKuhZflRXpE641b5KH10GKzFnmJHrHWXbXIw/7h
Wo8vWuRhOrvV43ct8l7q8Xs9Llvk3enxlR5XLfLWKj+TH1PLjz+Qn1U6xNsbgqea
PmiUTQydNWsH1pg5++BlH4/lZ7jYJUaeJhvIuHw4bR73HzK5fDqjFFMwwqnO1Bmq
1g2xuywbsXg0/L66+cp+Mfq76jXwVnWtHlAqmlDfZuLSZI+Blofyh5bsEcMTMb6Y
YR4zmgmjmSpdVXnDuDR7iVoX8Uvqie3YNLQLjQnPu67Pa/RlLygmDRaKS1pjsYiZ
cuFQXQ+0zvgo7w5l1pfeLbKtrJty8c25fw1Wwfpl1ltHmEvszD03lctUJrPvMb/4
TIeA0XRZ+2CdZ1oEzF8sP6HuEcaNFRPot0tylU1G0KuKNIb8b2SRZElmMabYkXlu
fDKFOWJKJrnpGlNQgaaiQTADDROMKUgtx6hM9PZni6vCyqRkY94h4xmxsItqGhUi
sRUCMeMZW2FvXYlG2GMKta8GYpmzq3jFwh47RZaqDX7rKlwM8THhb7g1gr5yq4n1
ny1FrVh/Lk6+1XhXisY6fj/mv2e1rWw1G2m0LW7Zpz1+amMjh+opOQPr+DGM3j6V
ZX54vVxiTcLmrw/sqYIf+oZWfbv16JAAPcid6RvGMTFS22Szh63sU8LI/wNBRgHs
ucigP8CRwTljmP2SH/ZlXrxe3udPh9I0/iOr4QXyQ1Xa16z5jEIL97RVatAurf6w
gonFKfP+/0STtMj8Epb5P6RDUxq7EgAAAAASuw==

`observer world`
H4sIAAAAAAAAAGMQSMhPKk4tKkstUiguSSxJTXBggAMrBq6CnPyS8syU9NQSIJ+F
gS0nNS+9JAPI5mFgB8kVpOaBlXKDNcNlOYCYkYG9uLK4JDM3FWocM8gIRiABAASA
NAJ1AAAAAAAAdQ==

`patch world`
[encoded data, 44005 characters]
vZC6Upg96w+WLJ1ITOH/AVba/ZNObgEAAAFuTg==

`turtle world`
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

