All pastes #502262 Raw Edit

Tamagotchi v2.0

public text v1 · immutable
·published 2007-05-22 13:02 UTC
rendered paste body
globals [intake15m ticks daytime plotreset]
turtles-own [TIW Lean_Weight Lean_Energy Fat_Weight Fat_Energy Energy BMR W Wt1 Wdot critical_W ill_W critical_E rand_BMR grass_aten MaxW MovCost kolor]
patches-own [cell_mass first_mass]

to-report time
  report (ticks / 4) / 24
end

to-report hour
  report daytime
end


to-report basal-metabolic-rate [ weight ]
  report ((1.4 + (0.03 * weight)) * 1000 ) / 96.0 ;; # basal cost each 15min
end


to rapport
  print ""
  print ""
   print "Weight"
    print W
    print "Lean_Weight"
    print Lean_Weight
    print "Lean_Energy"
    print Lean_Energy
    
    print "Fat_Weight"
    print  Fat_Weight 
    print "Fat_Energy"
    print  Fat_Energy 
     
    print "Total energy"
    print Energy
    print "Critical weight"
    print critical_W
    print "Ill weight limit"
    print ill_W
    print "BMR"
    print BMR
end

to setup_patches
  ask patches [
   set cell_mass 0    
   set first_mass cell_mass
  ]
  
  
  ask patches with [(pxcor > 0) and (pycor > 0)] [
    set cell_mass (random-float npp) 
    set first_mass cell_mass
    cell_repaint
  ]

end



to setup
  ca ; #clear all
  set daytime 1
  set intake15m 0.10417 ;; Kg
  set plotreset 0
  create-turtles asses
  ask turtles [
  
    ifelse randpos?
     [
       setxy random-xcor random-ycor
     ][
       setxy random-normal 0 3 random-normal 0 3
     ]
  
    set TIW 200 ;; #Total Initial Weight 200kg
    set W TIW
;;    set MaxW (W + (W * 0.01)) ;; # Max weight, 20% plus than the initial weight
    set MaxW W
    set Wt1 W
    set Wdot 0 ;; rate of change of the weight
    set Lean_Weight (W * 0.8) ;; #Lean weight: 80% of initial weight
    set Lean_Energy (Lean_Weight * 4000) ;; #1kg Lean -> 4000kcal (Wikipedia)
    set Fat_Weight (W * 0.2) ;; #Fat weigth 20% of initial weight
    set Fat_Energy (Fat_Weight * 7800) ;; #1kg Fat -> 7800Kcal (Wikipedia)
    set Energy (Fat_Energy + Lean_Energy)
    set BMR basal-metabolic-rate (Lean_Weight) ;; #Basal metabolic rate
    set critical_W ( Lean_Weight * 0.7 ) ;; # Bottom weight limit the animal has, 
                                         ;; # defined as the 70% of the Lean weight
                                         ;; # if the animal reach this weight, must die
    set critical_E (critical_W * 4000)
    set ill_W (W - (W * .18))   ;; # Ill limit
    set kolor color
   ;; rapport
  ]
  
 ;; ask patches [
 ;;   set cell_mass (random-float npp)
 ;;   set first_mass cell_mass
 ;;  ;; set pcolor scale-color green cell_mass 0 npp
 ;;  cell_repaint
 ;; ]

  setup_patches
 
  
  
end

to cell_repaint
  ifelse showgrass? [
    set pcolor scale-color green cell_mass 0 npp
  ] [
    set pcolor black
  ]
end

to-report grass2fat [grass]
  report grass * 0.14525641025641026 ;; 1kg grass -> 0.14525641025641026kg of fat (1133kg_grass / 7800kg_fat)
end

to-report kcal2fat [fat]
  report fat / 7800.0
end

to-report kcal2lean [lean]
  report lean / 4000.0
end

to eat_grass
    set grass_aten 0
    if (cell_mass > intake15m) [
      set grass_aten (random-normal (intake15m + (hunger / 96)) 0.05) ;; 10kg/day (0.10417kg/15min) , random window 0.5kg/day (0.0052084/15min)
      if (grass_aten < 0) [
        set grass_aten 0 
      ]
      set cell_mass (cell_mass - grass_aten)
      cell_repaint
      set Fat_Energy    Fat_Energy + (grass_aten * 1133)         ;; 1133kcal/kgr of dry grass
      set Fat_Weight Fat_Weight + grass2fat grass_aten
      set W (Fat_Weight + Lean_Weight)
      set Energy (Fat_Energy + Fat_Energy)
    ]
    
    ifelse showenergy? 
      [
        ifelse (grass_aten = 0)[
          set label-color blue
        ][
          set label-color yellow
        ]
        set label (round (grass_aten * 100 ) ) / 100 + ","+ round W
      ][
        set label ""
      ]
end




to BMR_substract
  set rand_BMR random-normal BMR (BMR / 2.0)
 ;; set Energy Energy - rand_BMR
 
   ifelse (W > Lean_Weight) [
     set Fat_Energy Fat_Energy - rand_BMR
     set Fat_Weight Fat_Weight - (kcal2fat rand_BMR)    
   ][
     if (W < critical_W)[
       die
     ]
     set Lean_Energy Lean_Energy - rand_BMR
     set Lean_Weight Lean_Weight - (kcal2lean rand_BMR) 
   ] 
   
     set Energy (Fat_Energy + Lean_Energy)
     set W (Fat_Weight + Lean_Weight)
end

to move
  set MovCost (W ^ (-.25)) * 0.00239

  right uphill cell_mass
  forward random-normal 1 0.05
  
  ifelse (W > Lean_Weight) [
     set Fat_Energy Fat_Energy - MovCost
     set Fat_Weight Fat_Weight - (kcal2fat MovCost)    
   ][
     if (W < critical_W)[
       die
     ]
     set Lean_Energy Lean_Energy - MovCost
     set Lean_Weight Lean_Weight - (kcal2lean MovCost) 
   ] 
   
     set Energy (Fat_Energy + Lean_Energy)
     set W (Fat_Weight + Lean_Weight)
end


to grow_grass
    set cell_mass (cell_mass + ((first_mass / 30.0) / 96.0) )
    if (cell_mass > first_mass) [
      set cell_mass first_mass
    ]
  cell_repaint
end


to plot-energia
  set-current-plot "Energy_plot"
  set-current-plot-pen "ass"
  plot Energy
  set-current-plot-pen "critical"
  plot critical_E
  set-current-plot-pen "Lean_limit"
  plot Lean_Energy
  set-current-plot-pen "ave-energy"
  plot mean values-from turtles [Energy]
end
to plot-weightdot
  set-current-plot "weight_dot"
  set-current-plot-pen "wdot" 
;;  plot mean values-from turtles [Wdot]
  plot Wdot
end

to-report wdot_all
  report mean values-from turtles [Wdot]
end
to go



ask turtles [

  ifelse (daytime <= 48) [
  set color kolor
  ifelse ( W < MaxW ) [
    eat_grass ;; eat grass and add its kcals to the fat energy
    if (cell_mass < intake15m)[
      move
    ]
  ][
    if (random-float 1.0) < boring [
      move
    ]
  ]
  ][
    set color grey
  ]
  BMR_substract
  set Wdot (Wt1 - W)
  set Wt1 W
  set plotreset plotreset + 1
  if (plotreset > (asses * draw_interval)) [
      clear-plot
      set plotreset 0
  ]
  
  plot-energia  
  
plot-weightdot

]

;;plot-weightdot


 ask patches [
   grow_grass   
 ]

set ticks (ticks + 1)

ifelse (daytime > 96)[
  set daytime 1
][
  set daytime (daytime + 1)
]


end