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 pxsize = flag.Int("pxsize", 1, "pixels per tile edge") 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) g := graphics.NewGraphics(int32(*width), int32(*height), int32(*pxsize)) 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}) } env.InitPheromone("food") g.ColorPheromone("food", [4]uint8{0x81, 0x81, 0x12, 0x00}) 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: 5}) } env.InitPheromone("trail") g.ColorPheromone("trail", [4]uint8{0x81, 0, 0x81, 0x00}) default: for i := 0; i < *numTurtles; i++ { turtles[i] = core.NewTurtle(env, &actors.SlimeMold{SniffDistance: 20}) } env.InitPheromone("trail") g.ColorPheromone("trail", [4]uint8{0x81, 0, 0x81, 0x00}) } 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() }