Turtles and Zombies
Model was written in NetLogo 5.3.1
•
Viewed 350 times
•
Downloaded 26 times
•
Run 0 times
Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)
Comments and Questions
Please start the discussion about this model!
(You'll first need to log in.)
Click to Run Model
globals [deaths maxRadius] turtles-own [energy] patches-own [friction isWater] breed [tortoises tortoise] breed [zombies zombie] to clear clear-all ask patches [ set pcolor green - ( random-float 0.8 )] reset-ticks end to setup clear ;; maxRadius is used in smartMovement set maxRadius 5 set-patch-size 13 setup-patches set deaths 0 ;; make this "5" a controllable variable repeat 5 [ setup2-patches ] repeat 5 [ smoothWater ] setup-turtles reset-ticks stop end ;; Creates some grass and a bit of water to setup-patches ask patches [ set isWater false ifelse random-float 100 < newLakeChance [ intoWater ] [ set pcolor green - ( random-float 0.8 ) ] ] end ;; Grows water areas (this method is iterated) to setup2-patches ask patches [ ;; Only neighbours of water can turn into water ;; That's why setup-patches creates some water seeds! if isWater = true [ ask neighbors [ ;; If a neighbour is grass, attempts conversion if isWater = false [ ;; Patches with more water neighbours will be visited more ofte, so ;; they have a higher chance of becoming water! ;; Important detail: the order in which patches are visited ;; will introduce a bias (if we visit from left to right, there is a ;; chance that the neighbour with xcoord + 1 will become water, and ;; when this is visited it may also turn xcoord + 2 into water, but ;; the same is not true to the left). Unimportant for this toy program. ;; A solution would be to create a second label that stores the old ;; isWater status and only update this when the iteration is finished (for example) if random 100 < lakeGrowth [ intoWater ] ] ] ] ] tick end ;; Water growth produces some unpleasant structures. Here water edges are smoothed. to smoothWater ask patches [ ;; Only turns grass into water! if isWater = false [ ;; Counts the number of neighbours that are water let waterNeighbours 0 ask neighbors [ if isWater = true [ set waterNeighbours waterNeighbours + 1 ] ] ;; We want a path with 4 neighbours to be much more likely to become water than ;; one with 2. We multiply to get squares, so 2 neighbours gets 4 "chances" ;; and 4 neighbours get 16 "chances". set waterNeighbours waterNeighbours * waterNeighbours ;; We get the random number up to 65 so there is a very small chance of ;; finding super small islands (max neighbours squared is 64) if random 65 < waterNeighbours [ intoWater ] ] ] end to intoWater set pcolor 105 - (random-float 0.4 ) set friction 1 set isWater true end to setup-turtles ask turtles [ die ] create-turtles numberTurtles ;; tortoises is an old, confusing class name refering to turtles that are alive ;; the other turtle sub-class is "zombies" ask turtles [ set breed tortoises set energy starvationEnergy ] ask tortoises [ set shape "turtle" setxy random-xcor random-ycor set color 15 ] end to go if count turtles = 0 [ stop ] ask tortoises [ move-tortoises tortoises-eat reproduce ] ask zombies [ move-zombies eat-tortoise ] death grow tick do-plots end to move-tortoises ifelse smartMovement = false [ normalTortoiseMove ] ;; else: smart movement (away from monsters) [ ;; smart movement only if enemies are present! ;; commented code for avoiding other turtles ;;let turtlesInRange 0 ;;ask tortoises in-Radius maxRadius [ ;; set turtlesInRange ( turtlesInRange + 1 ) ;;] ;;ifelse turtlesInRange > 1 ifelse any? zombies in-Radius maxRadius [ set heading awayDirection forward random 2 * (2 - friction) / 2 ] ;; else: normal movement! [ normalTortoiseMove ] ] end to normalTortoiseMove right random lessStraightMovement - ( lessStraightMovement / 2 ) forward random 2 * (2 - friction) / 2 end ;; finds the direction away from most nearby monsters to-report awayDirection let callingTurtle self ;; let's try to run away from the weighted center of mass of enemies! let awayX 0 let awayY 0 ;;ask turtles in-radius maxRadius [ ask zombies in-radius maxRadius [ let localX 0 let localY 0 ;; for every neighbour gets the local x and y distance set localX ( xcor - ( [xcor] of callingTurtle ) ) set localY ( ycor - ( [ycor] of callingTurtle ) ) ;; corrects border effects set localX ( fixDistBorder localX max-pxcor ) set localY ( fixDistBorder localY max-pycor ) ;; the closer the monster is, the larger the weight for the total let dist ( maxRadius - distance callingturtle ) ;; adds the weighted contribution to the total set awayX ( awayX + ( localX * dist ) ) set awayY ( awayY + ( localY * dist ) ) ] ;; We don't need to divide by the total weight, since this only ;; rescales the (awayX, awayY) vector. Note that any ;; k·(a, b) defines the same direction as (a, b)! ;; Invert the values to head AWAY from the monsters! set awayX ( - awayX ) set awayY ( - awayY ) ;; finally converts these local coordinates into an angle! let awayAngle 0 ifelse ( awayX != 0 or awayY != 0 ) [ set awayAngle ( atan awayX awayY ) ] ;; else: undefined angle! [ set awayAngle random 360 ] report awayAngle end ;; checks if the x/y distance to the neighbour is too big ;; which means we have to correct a jump over the edges ;; (so from -max to +max we get distance 1) to-report fixDistBorder [ increment maxCoord ] let minJump ( maxCoord * 2 ) - maxRadius let twoTimesOne ( maxCoord * 2 ) + 1 ifelse abs increment > minJump [ if increment > 0 [ report ( - twoTimesOne + increment ) ] if increment < 0 [ report ( twoTimesOne + increment ) ] ] ;; no changes [ report increment ] end to move-zombies ifelse smartMovementZ = false [ normalZombiMove ] ;; else: smart movement (away from monsters) [ ifelse any? tortoises in-Radius maxRadius [ let target ( one-of tortoises in-Radius maxRadius ) ;; if target is in the same spot (should not happen) this creates an exception ifelse distance target > 0 [ set heading towards target forward random 2 * (2 - friction) / 2 ] [ normalZombiMove ] ] [ normalZombiMove ] ] ;; Zombies die in water! ;;ifelse isWater = true ;; [ die ] ;; [ set energy (energy - moveEnergyConsumption) ] ;; better and faster: water simply takes more energy from them ;; otherwise large amounts of turtles gather in the water ;; remember: friction is 1 in water, 0 otherwise set energy (energy - ( friction + 1 ) * moveEnergyConsumption) end to normalZombiMove right random lessStraightMovementZ - ( lessStraightMovementZ / 2 ) forward random 2 * (2 - friction) / 2 end to tortoises-eat ;; turtles in water gain a bit of energy, otherwise they spend some moving ifelse isWater = true [ set energy (energy + 1) ] ;; no water. first takes the movement penalty [ set energy (energy - moveEnergyConsumption) ;; if there is grass they also eat if pcolor < 101 [ if pcolor > 0 [ set pcolor black set energy (energy + foodEfficiency) ;;set color (color + 10) ] ] ] end to reproduce if energy > energyToReproduce [ set energy (energy - (energyToReproduce / 2) ) hatch 1 [ set energy (energyToReproduce / 2) ] ] end to death ask turtles [ ;; if energy falls below a threshold turtles die. if energy < starvationEnergy [ set deaths (deaths + 1) ifelse random-float 100 < chanceToZombiAtDeath [ set breed zombies set shape "monster" set color 45 ] [ die ] ] ] end to grow ask patches [ if pcolor = 0 [ if random 100 < 1 [ set pcolor 75 - (random-float 0.8 ) ] ] ] end to eat-tortoise if any? tortoises in-radius 3 [ ifelse any? tortoises in-radius 3 with [ energy <= 31 ] [ set energy (energy + 21) ask one-of tortoises in-radius 3 with [ energy <= 31 ] [ die ] ] ;; else [ set energy (energy + 10) ask one-of tortoises in-radius 3 [ set energy (energy - 10) if random-float 100 < chanceInfect [ set breed zombies set shape "monster" set color 125 ] ] ] ] end to do-plots set-current-plot "totals" set-current-plot-pen "tortoises" plot count tortoises ;;set-current-plot-pen "grass" ;;plot count patches with [pcolor > 0] / 10 ;;set-current-plot-pen "deaths" ;;plot (deaths * 10) / ticks set-current-plot-pen "zombies" plot count zombies end
There are 2 versions of this model.
Attached files
File | Type | Description | Last updated | |
---|---|---|---|---|
Turtles and Zombies.png | preview | preview | almost 8 years ago, by Pablo Gonzalez de Prado | Download |
Turtles and Zombies.png | preview | preview | almost 8 years ago, by Pablo Gonzalez de Prado | Download |
Turtles and Zombies.png | preview | preview | almost 8 years ago, by Pablo Gonzalez de Prado | Download |
Turtles and Zombies.png | preview | preview | almost 8 years ago, by Pablo Gonzalez de Prado | Download |
Turtles and Zombies.png | preview | preview | almost 8 years ago, by Pablo Gonzalez de Prado | Download |
Turtles and Zombies.png | preview | preview | almost 8 years ago, by Pablo Gonzalez de Prado | Download |
Turtles and Zombies.png | preview | preview | almost 8 years ago, by Pablo Gonzalez de Prado | Download |
This model does not have any ancestors.
This model does not have any descendants.