microworlds/experiments/turtles-and-frogs/main.go

91 lines
2.2 KiB
Go

package main
import (
"flag"
"git.openprivacy.ca/sarah/microworlds/core"
"git.openprivacy.ca/sarah/microworlds/experiments"
"github.com/faiface/pixel/pixelgl"
"image/color"
)
var numFrogs = flag.Int("numFrogs", 5000, "the number of frogs")
var move = flag.Bool("move", true, "")
var turtlePreference = flag.Float64("turtlePreference", 0.3, "")
var frogPreference = flag.Float64("frogPreference", 0.3, "")
type Frog struct {
}
func (sm *Frog) Setup(env *core.Environment, t *core.Turtle) {
// Do nothing
t.SetAttribute("type", "frog")
t.SetColor(color.RGBA{0, 255, 255, 0})
}
func (sm *Frog) Run(env *core.Environment, t *core.Turtle) {
t.FollowGradient(env, 1, 1, "frog-scent")
t.Wiggle()
amountTurtle := t.AmountAll(env, 1, "turtle-scent")
amountFrog := t.AmountAll(env, 1, "frog-scent")
if amountFrog > 1 && amountFrog > (amountTurtle+amountFrog)*float32(*frogPreference) {
// Do Nothing
} else {
if *move {
t.Step(env)
}
}
t.Drop(env, 1, "frog-scent")
}
type Turtle struct {
}
func (sm *Turtle) Setup(env *core.Environment, t *core.Turtle) {
// Do nothing
t.SetAttribute("type", "turtle")
t.SetColor(color.RGBA{255, 000, 0, 0})
}
func (sm *Turtle) Run(env *core.Environment, t *core.Turtle) {
t.FollowGradient(env, 1, 1, "turtle-scent")
t.Wiggle()
amountTurtle := t.AmountAll(env, 1, "turtle-scent")
amountFrog := t.AmountAll(env, 1, "frog-scent")
if amountTurtle > 1 && amountTurtle > (amountTurtle+amountFrog)*float32(*turtlePreference) {
// Do Nothing
} else {
if *move {
t.Step(env)
}
}
t.Drop(env, 1, "turtle-scent")
}
func mainrun() {
experiment := new(experiments.Experiment)
experiment.InitializeExperiment()
num := -1
experiment.InitNTurtles(func() core.Actor {
num++
if num%2 == 0 {
sm := new(Frog)
return sm
}
return new(Turtle)
}, *numFrogs+experiment.GetNumTurtles())
experiment.InitPheromone("turtle-scent", color.RGBA{0xFF, 0x00, 0x00, 0x00})
experiment.InitPheromone("frog-scent", color.RGBA{0x00, 0xFF, 0xFF, 0x00})
experiment.OnStep = func(env *core.Environment, turtles []*core.Turtle, i int) {
env.Evaporate(.99, "turtle-scent")
env.Evaporate(.99, "frog-scent")
}
experiment.Run()
}
func main() {
pixelgl.Run(mainrun)
}