microworlds/main.go

123 lines
2.3 KiB
Go

package main
import (
"flag"
"git.openprivacy.ca/sarah/microworlds/actors"
"git.openprivacy.ca/sarah/microworlds/core"
"git.openprivacy.ca/sarah/microworlds/graphics"
"github.com/veandco/go-sdl2/sdl"
"log"
"math/rand"
"os"
"runtime/pprof"
"sync"
"time"
)
var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")
var model = flag.String("model", "slime", "slimemold|swarm|woodchips")
var width = flag.Int("width", 300, "width of environment")
var height = flag.Int("height", 300, "height of environment")
var numTurtles = flag.Int("numTurtles", 5000, "number of turtles")
func main() {
// We don't need real randomness
rand.Seed(time.Now().Unix())
flag.Parse()
if *cpuprofile != "" {
f, err := os.Create(*cpuprofile)
if err != nil {
log.Fatal(err)
}
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
}
if err := sdl.Init(sdl.INIT_EVERYTHING); err != nil {
panic(err)
}
defer sdl.Quit()
env := core.NewEnvironment(*width,*height)
turtles := make([]*core.Turtle,*numTurtles)
switch *model {
case "swarm":
// Create 2 food blocks
for x:= 100;x<110;x++ {
for y:= 100;y<110;y++ {
env.PutValue(x,y)
}
}
for x:= 200;x<210;x++ {
for y:= 200;y<210;y++ {
env.PutValue(x,y)
}
}
for i:=0;i<*numTurtles;i++ {
turtles[i] = core.NewTurtle(env, &actors.Ant{SniffDistance:3, Carrying:false})
}
case "woodchips":
for x := 0;x<*numTurtles;x++ {
env.PutValue(rand.Intn(*width), rand.Intn(*height))
}
for x:= 200;x<210;x++ {
for y:= 200;y<210;y++ {
env.PutValue(x,y)
}
}
for i:=0;i<*numTurtles;i++ {
turtles[i] = core.NewTurtle(env, &actors.WoodChips{SniffDistance:20, Carrying:false})
}
case "slimemold":
for i:=0;i<*numTurtles;i++ {
turtles[i] = core.NewTurtle(env, &actors.SlimeMold{SniffDistance:20})
}
default:
for i:=0;i<*numTurtles;i++ {
turtles[i] = core.NewTurtle(env, &actors.SlimeMold{SniffDistance:20})
}
}
g := graphics.NewGraphics(int32(*width),int32(*height))
running := true
wait := sync.WaitGroup{}
wait.Add(1)
go func() {
for running {
g.Render(env, turtles)
}
wait.Done()
}()
wait.Add(1)
for running {
for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() {
switch event.(type) {
case *sdl.QuitEvent:
running = false
break
}
}
}
wait.Done()
wait.Wait()
}